QPainter彩色文字(语法着色)

时间:2009-05-27 18:51:05

标签: c++ qt syntax-highlighting qpainter

我有一个自定义的Qt小部件,我用它来显示反汇编,我希望为它添加语法着色。

目前,我只是将QPen设置为纯色,构建我想要显示的文本,然后将其渲染到适当坐标的QPainter

问题是,添加语法着色的最佳方法是什么?我想到了一些:

  1. 我可以简单地将着色划分为逻辑块,每个块之前都将QPen设置为所需的颜色。
  2. 我可以使用特殊的转义字符来表示调色板中的更改,并一次渲染1个字符。
  3. 我可以对#1进行修改并创建一个std::pair<QColor, QString>列表,然后我可以简单地迭代设置颜色的列表并绘制文本,因为我从列表的前面弹出项目。
  4. 完全不同的东西?
  5. 我知道我列出的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();
    

2 个答案:

答案 0 :(得分:5)

Qt提供的QSyntaxHighlighter可能正是您想要的。 QSyntaxHighlighter使用QTextDocument标记具有特定状态的每个代码块,该状态可与特定呈现format相关联。

QSyntaxHighlighter上的文档提供了一个示例,说明了如何实现这一目标并做了一些不错的事情:

  • 将模型与演示文稿分开
  • 将格式分成不同的可重用类(如果实现的话)
  • 如果对您的语言有用,则支持State设计模式

答案 1 :(得分:0)

我会使用QTextEdit或直接显示其下划线引擎QTextDocument