我有一個自定義Qt小部件,我用它來顯示反彙編,我正在尋找添加語法着色。QPainter彩色文本(語法着色)
目前,我只需簡單地將QPen
設置爲純色,構建我想要顯示的文本,然後在適當的座標處將其渲染到QPainter
。
問題是,添加語法着色的最佳方法是什麼?我想到了幾個:
- 我可以簡單地將着色分成邏輯塊,每個邏輯塊都將QPen設置爲所需的顏色。
- 我可以有特殊的轉義字符,代表調色板的變化,並且一次渲染1個字符。
- 我可以修改#1並創建一個
std::pair<QColor, QString>
的列表,然後我可以簡單地迭代設置顏色的列表並繪製文本,因爲我彈出列表前面的項目。 - 完全不同的東西?
我知道我列出的3種方法中的每一種在技術上都是可行的,但我正在尋找一種非常有效的解決方案。這段代碼將被稱爲很多。因爲這是一個交互式調試器,所以如果這個代碼很慢,那麼一個快速步進或者跟蹤的人會看到明顯的減速。
編輯:我知道QSyntaxHighlighter
和QTextDocument
。主要問題是這些通常不能很好地滿足我的目的。我有幾列都有分隔線,可以前後滑動。給你一個想法,這是一個鏈接到screenshot of my debugger。正如你所看到的,它根本不像文本文件。實際上它更接近於列表或表格。但是,已經有一大堆定製繪圖正在進行,使得正常的QTextDocument
有點不切實際。
編輯:我錯了,看起來QTextDocument
可以直接渲染到QPainter
。看起來像我需要的!
編輯:目前還不清楚如何控制在何處和如何QTextDocument
或QTextLayout
將利用一個QPainter
。我試圖用它們無濟於事。所以如果有人能夠提供一個簡單的例子,那會非常有幫助。
編輯:我最終能得到我想要使用這樣的事情:
painter.setPen(default_color);
QTextDocument doc;
doc.setDefaultFont(font());
doc.setDocumentMargin(0);
doc.setPlainText(text);
highlighter_->setDocument(&doc);
painter.save();
painter.translate(x, y);
QAbstractTextDocumentLayout::PaintContext context;
context.palette.setColor(QPalette::Text, painter.pen().color());
doc.draw(&painter, context);
painter.restore();
此外,爲什麼你的社區維基你的答案?你不會得到你的答案的代表點... – 2009-05-27 19:34:10