gpt4 book ai didi

c++ - QPainter 彩色文本(语法着色)

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:42 24 4
gpt4 key购买 nike

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

目前,我只是设置了 QPen为纯色,构建我要显示的文本,并将其呈现给 QPainter在适当的坐标。

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

  1. 我可以简单地将着色划分为逻辑 block ,每个逻辑 block 之前都将 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();

最佳答案

Qt 提供了一个 QSyntaxHighlighter这可能正是你想要的。 QSyntaxHighlighter 使用 QTextDocument用可以与特定演示相关联的特定状态标记每个代码块 format .

QSyntaxHighlighter 上的文档提供了一个示例,演示了如何完成此操作并做了一些不错的事情:

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

关于c++ - QPainter 彩色文本(语法着色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/917391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com