QTextEdit添加文本对象(将N个文字结合成一个整体)
来源:QT教程
2023-05-17 19:52:32
在处理文字的时候我们有时候不得不这样做:“当输入譬如:@人民日报 这样的标记的时候,我希望 [@人民日报] 这几个字符是一个整体, 不能对其中的任意一个字符进行修改
要改也只能改整体。” 类似于QQ群的 @ 功能。
(资料图片仅供参考)
现在就记录核心实现,先看看效果:
其中插入的表情就是一个整体,不能修改其中的内容(红色部分)。而自己手输入进去的就是当普通的文本处理了。
首先,定义一个对象来处理这种自定义类型的TextFormat:
先定义自定义的Object的类型和它的属性:
enum TextObject{TO_ObjectAt = QTextFormat::UserObject + 1};enum ObjectProperty{OP_Text = QTextFormat::UserProperty + 1,OP_FontSize};
这是用来处理自定义的TextObject对象的接口
class DIYTextObjectHandler: public QObject, QTextObjectInterface{Q_OBJECTQ_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功能
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里: