QPainter彩色文字(语法着色)

Eva*_*ran 2 c++ qt syntax-highlighting qpainter

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

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

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

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

我知道我列出的3种方法中的每一种都在技术上有效,但我正在寻找一种非常有效的解决方案.这段代码将被大量调用.由于这是一个交互式调试器,如果此代码速度很慢,快速踩踏或跟踪的人会看到明显的减速.

编辑:我知道QSyntaxHighlighter和QTextDocument.主要问题是这些通常不能很好地满足我的目的.我有几个列都有分隔线,可以来回滑动.为了给你一个想法,这是我的调试器截图的链接.正如您所看到的,它根本不像文本文档.实际上它更接近列表或表格.但是已经有一堆定制绘图正在进行,使得正常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();
Run Code Online (Sandbox Code Playgroud)

Kal*_*son 5

Qt提供的QSyntaxHighlighter可能正是你想要的. QSyntaxHighlighter使用a QTextDocument来标记具有特定状态的每个代码块,该特定状态可以与特定的表示格式相关联.

文档QSyntaxHighlighter提供了一个示例,演示了如何实现这一点并做了一些不错的事情:

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