QTextEdit添加文本对象(将N个文字结合成一个整体)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/r5014/article/details/72897927

在处理文字的时候我们有时候不得不这样做:“当输入譬如:@人民日报 这样的标记的时候,我希望 [@人民日报] 这几个字符是一个整体, 不能对其中的任意一个字符进行修改

要改也只能改整体。”  类似于QQ群的 @ 功能。


现在就记录核心实现,先看看效果:



其中插入的表情就是一个整体,不能修改其中的内容(红色部分)。而自己手输入进去的就是当普通的文本处理了。


首先,定义一个对象来处理这种自定义类型的TextFormat:


先定义自定义的Object的类型和它的属性:

扫描二维码关注公众号,回复: 3346683 查看本文章

enum TextObject
    {
        TO_ObjectAt = QTextFormat::UserObject + 1
    };

    enum ObjectProperty
    {
        OP_Text     = QTextFormat::UserProperty + 1,
        OP_FontSize
    };



这是用来处理自定义的TextObject对象的接口

class DIYTextObjectHandler: public QObject, QTextObjectInterface
{
    Q_OBJECT
    Q_INTERFACES(QTextObjectInterface)
public:
    QSizeF intrinsicSize(QTextDocument *doc, int posInDocument,
                         const QTextFormat &format)
    {
        int fontSize = format.property(MainWindow::OP_FontSize).toInt();
        QString text = format.property(MainWindow::OP_Text).toString();
        return QSizeF(text.length() * fontSize, fontSize);
    }
    void drawObject(QPainter *painter, const QRectF &rect, QTextDocument *doc,
                    int posInDocument, const QTextFormat &format)
    {
        QString text = format.property(MainWindow::OP_Text).toString();
        painter->save();
        painter->setPen(Qt::red);
        painter->drawText(rect, text);
        painter->restore();
    }
};

这个DIYTextObjectHandler就是用来处理我们插入进去的标签的,也就是说,这个表情是由这个对象来"画出来"的。


接下来要把这个handler注册到TextEidt中:

void MainWindow::setupTextObjectHandler()
{
    QTextDocument* doc = ui->textEdit->document();
    DIYTextObjectHandler* handler = new DIYTextObjectHandler;
    handler->setParent(this);

    doc->documentLayout()->registerHandler(TO_ObjectAt, handler);

    qDebug() << "register handler complite.";
}

当程序运行的时候调用这个函数初始化。


然后再我们的插入标签事件当中这样插入标签:

void MainWindow::insertTextObject()
{
    QString text = ui->lineEdit->text();
    QTextCharFormat format;
    format.setObjectType(TO_ObjectAt);
    format.setProperty(OP_Text, QVariant::fromValue(text));
    format.setProperty(OP_FontSize, QVariant::fromValue(14));

    ui->textEdit->textCursor().insertText(QString(QChar::ObjectReplacementCharacter),
                                          format);

    qDebug() << "insert text object: " << text;
}

这样插入了一个标签实现了我们的 At 某人 的UI功能












猜你喜欢

转载自blog.csdn.net/r5014/article/details/72897927