如何制作带有圆角的QTextFrame?

问题描述 投票:0回答:1

主要应用程序:我正在尝试使用 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 中的代码块非常相似的代码块。

c++ qt qt5 desktop-application qt6
1个回答
0
投票

是的,您可以制作带有圆角的

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();
}

可以通过设置属性来指定框架的类型。

© www.soinside.com 2019 - 2024. All rights reserved.