代码之家  ›  专栏  ›  技术社区  ›  Evan Teran

qpainer彩色文本(语法着色)

  •  2
  • Evan Teran  · 技术社区  · 15 年前

    我有一个定制的qt小部件,用于显示反汇编,我希望为它添加语法着色。

    目前,我只需设置 QPen 对于纯色,构造要显示的文本,并将其呈现到 QPainter 在适当的坐标。

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

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

    我知道我列出的三种方法在技术上都是可行的,但我正在寻找一种非常有效的解决方案。这个代码将被称为很多。由于这是一个交互式调试器,如果这段代码很慢,那么快速单步执行或跟踪的人会看到明显的速度减慢。

    编辑: 我知道 QSyntaxHighlighter QTextDocument . 主要的问题是,这些通常不能很好地满足我的目的。我有几根柱子,都有隔板,可以前后滑动。为了给你一个主意,这里有一个链接 screenshot of my debugger . 正如你所看到的,它根本不像一个文本文档。实际上,它更接近于一个列表或表。但是已经有一堆自定义绘图在进行 qTrk文档 有点不切实际。

    编辑 :我错了,似乎 qTrk文档 可以直接渲染到 Q画师 . 看起来像我需要的!

    编辑 :不清楚如何控制地点和方式 qTrk文档 QTextLayout 将画上 Q画师 . 我试着用它们却无济于事。所以如果有人能提供一个基本的例子,那将是非常有帮助的。

    编辑 :我最终能用这种方法得到我想要的东西:

    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 回复  |  直到 6 年前
        1
  •  5
  •   Magna    6 年前

    QT提供了一个 QSyntaxHighlighter 这可能正是你想要的。 Qsyntax荧光笔 使用A QTextDocument 用特定的状态标记每一个代码块,该状态可以与特定的表示相关联。 format .

    有关的文档 Qsyntax荧光笔 提供一个示例,演示如何完成此操作,并做了一些有益的事情:

    • 将模型与表示分离
    • 将格式分为不同的可重用类(如果是这样实现的话)
    • 支持 State 设计模式(如果对您的语言有用)
        2
  •  0
  •   Georg Schölly Crazy Developer    15 年前

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