【问题标题】:only left border in textdocument文本文档中只有左边框
【发布时间】:2025-12-15 19:50:02
【问题描述】:

我试图在 QTextDocument 中仅绘制左边框。由于 afaik QTextFrame 不支持选择性边框,因此我尝试为文本框架分配纹理画笔。类似于以下内容 -

#include <QPainter>
#include <QTextFrameFormat>
#include <QTextCursor>
#include <QTextFrame>
#include <QTextEdit>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    QTextDocument doc;
    QPixmap map(1024, 1024);
    QPainter p;
    p.begin(&map);
    p.setBackground(QBrush(Qt::transparent));
    p.drawRect(QRect(0,0, 4, map.height()));
    p.end();

    QTextFrameFormat frameFormat;
    QBrush bruh(map);
    bruh.setColor(Qt::transparent);
    frameFormat.setBackground(bruh);
    auto cur = new QTextCursor(&doc);
    auto frame = cur->insertFrame(frameFormat);
    auto curf = new QTextCursor(frame);
    curf->insertText("Hello this is qt program!");

    QTextEdit e;
    e.setDocument(&doc);
    e.show();

    return a.exec();
}

但是即使背景设置为透明,这也会打印黑色背景(我需要一个只有左红色边框的透明背景)。
我不知道出了什么问题。另外,有没有其他方法可以让 QTextFrame 只有左边框?

【问题讨论】:

    标签: c++ qt qt5 qtextedit qtextdocument


    【解决方案1】:

    试试这个:

    QTextDocument doc;
    QPixmap map(1024, 1024);
    map.fill(Qt::white);
    QPainter p;
    p.begin(&map);
    p.fillRect(QRect(0,0, 4, map.height()),QBrush(Qt::red));
    p.end();
    

    【讨论】:

    • 如果您不使用 qss 样式,那么最好使用调色板颜色来填充像素图。所以使用map.fill(e.palette().color(QPalette::Base)); 而不是map.fill(Qt::white);。另外,也许您想添加填充以将文本从边框移动。然后使用frameFormat.setPadding(4);