主要应用程序:我正在尝试使用 Qt6、C++ 和 QTextEdit 创建一个文本编辑器。
目标:我想实现允许我在富文本编辑器中插入代码块的功能,就像您通常在 StackOverflow 中看到的那样。代码块应该有圆角,有自己的背景、前景、边框、字体。
我所做的:我找到的最接近的解决方案是使用 QTextFrame。
代码:
QTextFrameFormat frameFormat;
frameFormat.setBackground(Qt::lightGray);
frameFormat.setBorder(1);
frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid);
frameFormat.setMargin(0);
frameFormat.setPadding(4);
ui->textEditor->textCursor().insertFrame(frameFormat);
显然,这已经很好用了,但我无法创建圆形边框或使用字体。
再次强调,最终目标是在 QTextEdit 中插入一个在风格上与 StackOverflow 中的代码块非常相似的代码块。
是的,您可以制作带有圆角的
QTextFrame
。
我回答过类似的问题。我再次使用了答案。
.h
#ifndef TEXTEDIT_H
#define TEXTEDIT_H
#include <QTextEdit>
#include <QTextFrame>
class TextEdit: public QTextEdit
{
Q_OBJECT
public:
explicit TextEdit(QObject* parent=nullptr);
void drawFrames(QPainter &p, QTextFrame* f);
protected:
void keyPressEvent(QKeyEvent* e);
void paintEvent(QPaintEvent* e);
};
#endif // TEXTEDIT_H
.cpp
#include "TextEdit.h"
#include <QAbstractTextDocumentLayout>
#include "qpainter.h"
TextEdit::TextEdit(QObject* parent)
{
}
void TextEdit::drawFrames(QPainter& p, QTextFrame* f)
{
QTextFrameFormat format = f->frameFormat();
if (format.property(1) == "code")
{
QRectF rf = document()->documentLayout()->frameBoundingRect(f);
QPen pen = p.pen();
QBrush brush = p.brush();
brush.setStyle(Qt::SolidPattern);
pen.setWidth(1);
brush.setColor(Qt::gray);
p.setPen(pen);
p.setBrush(brush);
p.drawRoundedRect(rf, 10, 10);
}
QList<QTextFrame*> lf = f->childFrames();
foreach (QTextFrame* cf , lf)
{
drawFrames(p, cf);
}
}
void TextEdit::paintEvent(QPaintEvent* e)
{
QTextDocument * doc = document();
QTextFrame* rootFrame = doc->rootFrame();
QPainter p = QPainter(viewport());
p.setRenderHint(QPainter::Antialiasing);
drawFrames(p, rootFrame);
QTextEdit::paintEvent(e);
}
void TextEdit::keyPressEvent(QKeyEvent* e)
{
if (e->key() == Qt::Key_1)
{
QTextCursor tc = textCursor();
QTextFrameFormat f;
f.setMargin(5);
f.setProperty(1, "code");
tc.insertFrame(f);
return;
}
QTextEdit::keyPressEvent(e);
}
主.cpp
#include <QApplication>
#include "TextEdit.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
TextEdit e;
e.show();
return a.exec();
}
可以通过设置属性来指定框架的类型。