如何为QTextFrame仅设置左侧边框?现有实现遇透明背景异常
给QTextFrame添加仅左侧边框的解决方案
先聊聊你当前代码遇到的问题,再给你推荐更简洁靠谱的实现方式。
修复你当前的纹理画笔方案
你碰到黑色背景的核心原因是QPixmap默认会用不透明黑色填充整个区域——哪怕你只画了左边的矩形,剩下的空白区域还是黑色的。要解决这个问题,你需要先把整个pixmap填充为透明:
#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); // 关键步骤:先把整个pixmap填充为透明 map.fill(Qt::transparent); QPainter p; p.begin(&map); // 设置边框画笔为你需要的红色 p.setPen(Qt::red); p.drawRect(QRect(0,0, 4, map.height())); p.end(); QTextFrameFormat frameFormat; QBrush bruh(map); // 不需要额外设置brush的color为透明,pixmap本身已经是透明背景了 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(); }
修改后,pixmap只有左侧的红色矩形,其余区域都是透明的,设置为frame背景后就不会出现黑色块了。
更优雅的方案:直接用QTextFrameFormat的单独边框设置
其实Qt的QTextFrameFormat本身就支持单独配置某一边的边框,完全不用绕弯子用纹理画笔。你可以直接设置左侧边框的宽度和颜色,把其他三边的边框宽度设为0即可:
#include <QTextFrameFormat> #include <QTextCursor> #include <QTextFrame> #include <QTextEdit> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextDocument doc; QTextFrameFormat frameFormat; // 设置左侧边框宽度为4px,颜色为红色 frameFormat.setLeftBorderWidth(4); frameFormat.setLeftBorderColor(Qt::red); // 隐藏其他三边的边框 frameFormat.setTopBorderWidth(0); frameFormat.setRightBorderWidth(0); frameFormat.setBottomBorderWidth(0); // 可选:指定边框样式(默认就是实线,也可以改成虚线等) frameFormat.setLeftBorderStyle(QTextFrameFormat::BorderStyle_Solid); 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(); }
这个方法更直观,也更容易维护,完全利用Qt内置的格式配置就能实现你的需求。
内容的提问来源于stack exchange,提问作者unknown.prince
相关产品推荐
相关产品推荐

