在處理文字的時(shí)候我們有時(shí)候不得不這樣做:“當(dāng)輸入譬如:@人民日?qǐng)?bào) 這樣的標(biāo)記的時(shí)候,我希望 [@人民日?qǐng)?bào)] 這幾個(gè)字符是一個(gè)整體, 不能對(duì)其中的任意一個(gè)字符進(jìn)行修改
要改也只能改整體。” 類似于QQ群的 @ 功能。
現(xiàn)在就記錄核心實(shí)現(xiàn),先看看效果:
(資料圖片僅供參考)
其中插入的表情就是一個(gè)整體,不能修改其中的內(nèi)容(紅色部分)。而自己手輸入進(jìn)去的就是當(dāng)普通的文本處理了。
首先,定義一個(gè)對(duì)象來處理這種自定義類型的TextFormat:
先定義自定義的Object的類型和它的屬性:
enum TextObject{TO_ObjectAt = QTextFormat::UserObject + 1};enum ObjectProperty{OP_Text = QTextFormat::UserProperty + 1,OP_FontSize};這是用來處理自定義的TextObject對(duì)象的接口
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();}};這個(gè)DIYTextObjectHandler就是用來處理我們插入進(jìn)去的標(biāo)簽的,也就是說,這個(gè)表情是由這個(gè)對(duì)象來"畫出來"的。
接下來要把這個(gè)handler注冊(cè)到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.";}當(dāng)程序運(yùn)行的時(shí)候調(diào)用這個(gè)函數(shù)初始化。
然后再我們的插入標(biāo)簽事件當(dāng)中這樣插入標(biāo)簽:
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;}這樣插入了一個(gè)標(biāo)簽實(shí)現(xiàn)了我們的 At 某人 的UI功能
【領(lǐng) QT開發(fā)教程 學(xué)習(xí)資料, 點(diǎn)擊下方鏈接莬費(fèi)領(lǐng)取↓↓ ,先碼住不迷路~】
點(diǎn)擊這里: