2009-05-27 139 views
2

我有一個自定義Qt小部件,我用它來顯示反彙編,我正在尋找添加語法着色。QPainter彩色文本(語法着色)

目前,我只需簡單地將QPen設置爲純色,構建我想要顯示的文本,然後在適當的座標處將其渲染到QPainter

問題是,添加語法着色的最佳方法是什麼?我想到了幾個:

  1. 我可以簡單地將着色分成邏輯塊,每個邏輯塊都將QPen設置爲所需的顏色。
  2. 我可以有特殊的轉義字符,代表調色板的變化,並且一次渲染1個字符。
  3. 我可以修改#1並創建一個std::pair<QColor, QString>的列表,然後我可以簡單地迭代設置顏色的列表並繪製文本,因爲我彈出列表前面的項目。
  4. 完全不同的東西?

我知道我列出的3種方法中的每一種在技術上都是可行的,但我正在尋找一種非常有效的解決方案。這段代碼將被稱爲很多。因爲這是一個交互式調試器,所以如果這個代碼很慢,那麼一個快速步進或者跟蹤的人會看到明顯的減速。

編輯:我知道QSyntaxHighlighterQTextDocument。主要問題是這些通常不能很好地滿足我的目的。我有幾列都有分隔線,可以前後滑動。給你一個想法,這是一個鏈接到screenshot of my debugger。正如你所看到的,它根本不像文本文件。實際上它更接近於列表或表格。但是,已經有一大堆定製繪圖正在進行,使得正常的QTextDocument有點不切實際。

編輯:我錯了,看起來QTextDocument可以直接渲染到QPainter。看起來像我需要的!

編輯:目前還不清楚如何控制在何處和如何QTextDocumentQTextLayout將利用一個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(); 

回答

5

Qt提供了QSyntaxHighlighter這可能是你想要什麼。 QSyntaxHighlighter使用QTextDocument來標記具有特定狀態的每個代碼塊,該特定狀態可以與特定演示format相關聯。

QSyntaxHighlighter的文檔提供了一個演示如何可以實現這一點,並做了一些不錯的東西:

  • 分離演示模型
  • 分隔格式化成不同的可重用的類(如果實施這樣)
  • 支持,如果有用的State設計模式,爲您的語言
+0

此外,爲什麼你的社區維基你的答案?你不會得到你的答案的代表點... – 2009-05-27 19:34:10