Qt如何實現(xiàn)文本編輯器光標(biāo)高亮技術(shù)
實現(xiàn)代碼
void Widget::oncursorPositionChanged() { QTextCursor cursor = ui->textEdit->textCursor(); //qDebug() << cursor.blockNumber() + 1 << ", "<< cursor.columnNumber() + 1; QString blockNum = QString::number(cursor.blockNumber() + 1); QString columnNumber = QString::number(cursor.columnNumber() + 1); const QString labelMes = "列:" + blockNum + ", 行:" + columnNumber; ui->labelPosition->setText(labelMes); // 設(shè)置當(dāng)前行高亮 QList<QTextEdit::ExtraSelection> extraSelections; QTextEdit::ExtraSelection ext; // 1,知道當(dāng)前行 ext.cursor = ui->textEdit->textCursor(); QBrush qBrush(Qt::yellow); // 2,顏色 ext.format.setBackground(qBrush); // 配置段屬性:整行顯示,沒有這句話不行 ext.format.setProperty(QTextFormat::FullWidthSelection, true); // 3,設(shè)置 //把ext加到ext的容器中 extraSelections.append(ext); ui->textEdit->setExtraSelections(extraSelections); } //解釋這串代碼,寫上注釋,并仔細(xì)闡述里面用到了什么技術(shù)?
下面是對這段代碼的逐行詳細(xì)注釋 + 技術(shù)解析,幫助你全面理解它的功能和背后使用的技術(shù)。
函數(shù)作用概述
void Widget::oncursorPositionChanged()
這是一個 槽函數(shù)(slot),當(dāng) QTextEdit 的光標(biāo)位置發(fā)生變化時自動觸發(fā)。它用于:
獲取當(dāng)前光標(biāo)所在的行列號;
在界面上顯示該信息(例如:“列:1, 行:3”);
高亮顯示當(dāng)前光標(biāo)所在的整行內(nèi)容;
代碼詳解 + 注釋
// 獲取 QTextEdit 中的當(dāng)前光標(biāo)對象 QTextCursor cursor = ui->textEdit->textCursor();
QTextCursor 是 Qt 提供的一個類,用于操作文本內(nèi)容;
它記錄了光標(biāo)的位置、選區(qū)等信息;
textCursor() 返回當(dāng)前的光標(biāo)狀態(tài)。
// 將行號和列號轉(zhuǎn)為字符串 QString blockNum = QString::number(cursor.blockNumber() + 1); QString columnNumber = QString::number(cursor.columnNumber() + 1);
cursor.blockNumber():返回當(dāng)前光標(biāo)所在的段落編號(從 0 開始),即“行號”;
cursor.columnNumber():返回當(dāng)前光標(biāo)在該行中的字符偏移量,即“列號”;
+1 是為了將索引從 0 轉(zhuǎn)換為更直觀的“第1行第1列”;
QString::number(...) 將整數(shù)轉(zhuǎn)換為字符串。
const QString labelMes = "列:" + blockNum + ", 行:" + columnNumber; ui->labelPosition->setText(labelMes);
構(gòu)造一個格式化的字符串,如 "列:3, 行:5";
顯示在界面中的 QLabel 控件上,控件名為 labelPosition;
這個標(biāo)簽通常用于實時顯示光標(biāo)位置。
使用 QTextEdit 的高亮技術(shù)(重點(diǎn))
1. 創(chuàng)建額外選擇區(qū)域列表
QList<QTextEdit::ExtraSelection> extraSelections;
QTextEdit::ExtraSelection 是 Qt 提供的一種機(jī)制,允許你在文本編輯器中自定義高亮顯示區(qū)域;
可以設(shè)置背景色、前景色、字體樣式等;
QList<...> 是 Qt 的容器類,用來保存多個高亮區(qū)域。
QTextEdit::ExtraSelection ext;
創(chuàng)建一個 ExtraSelection 對象,表示一個要高亮的區(qū)域;
后續(xù)會配置這個對象,并添加到 extraSelections 列表中。
ext.cursor = ui->textEdit->textCursor();
設(shè)置高亮區(qū)域的光標(biāo)范圍;
這里直接使用當(dāng)前光標(biāo),表示高亮“當(dāng)前行”的內(nèi)容。
QBrush qBrush(Qt::yellow);
創(chuàng)建一個畫刷對象,顏色為黃色;
用于設(shè)置高亮的背景色。
ext.format.setBackground(qBrush);
設(shè)置高亮區(qū)域的格式,這里是設(shè)置背景色為黃色;
QTextCharFormat 是格式描述對象,支持多種樣式設(shè)置。
ext.format.setProperty(QTextFormat::FullWidthSelection, true);
設(shè)置該區(qū)域的格式屬性為“全寬選擇”,即整行高亮;
否則只會高亮光標(biāo)所在字符位置,而不是整行。
extraSelections.append(ext);
將配置好的高亮區(qū)域加入列表中。
ui->textEdit->setExtraSelections(extraSelections);
將高亮區(qū)域應(yīng)用到 textEdit 控件;
此后,當(dāng)前光標(biāo)所在的整行就會被黃色高亮顯示。
總結(jié)用到的關(guān)鍵技術(shù)點(diǎn)
技術(shù)名稱 | 描述 |
---|---|
QTextCursor | 用于獲取或操作文本編輯器中的光標(biāo)位置和內(nèi)容 |
QTextEdit::ExtraSelection | 允許在 QTextEdit 中自定義高亮顯示區(qū)域 |
QTextCharFormat | 文本字符格式設(shè)置類,可設(shè)置背景色、字體、大小等 |
QBrush | 畫刷類,用于設(shè)置背景顏色或圖案 |
QList<T> | Qt 提供的泛型容器類,用于管理多個對象 |
QString::number() | 將數(shù)字轉(zhuǎn)換為字符串,用于顯示 |
setText() | QLabel 常用方法,更新界面上的文字 |
應(yīng)用場景舉例
這種功能常用于:
- 自定義文本編輯器(如代碼編輯器);
- 實現(xiàn)“行號顯示 + 當(dāng)前行高亮”功能;
- 模擬 IDE 中的光標(biāo)定位與語法高亮;
- 實現(xiàn)富文本編輯器中的自定義樣式區(qū)域;
示例優(yōu)化建議
你可以將上面的代碼封裝成一個函數(shù),便于復(fù)用:
void Widget::updateCursorPositionInfo() { QTextCursor cursor = ui->textEdit->textCursor(); int line = cursor.blockNumber() + 1; int col = cursor.columnNumber() + 1; QString info = QString("行:%1,列:%2").arg(line).arg(col); ui->labelPosition->setText(info); QTextEdit::ExtraSelection selection; selection.format.setBackground(Qt::yellow); selection.format.setProperty(QTextFormat::FullWidthSelection, true); selection.cursor = cursor; QList<QTextEdit::ExtraSelection> selections; selections.append(selection); ui->textEdit->setExtraSelections(selections); }
然后在 oncursorPositionChanged() 中調(diào)用即可:
void Widget::oncursorPositionChanged() { updateCursorPositionInfo(); }
如果你希望我?guī)湍悖?/p>
- 添加行號顯示功能;
- 支持多行高亮;
- 或者實現(xiàn)類似 VS Code 的編輯器界面;
到此這篇關(guān)于Qt如何實現(xiàn)文本編輯器光標(biāo)高亮技術(shù)的文章就介紹到這了,更多相關(guān)Qt文本高亮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)字符串轉(zhuǎn)整數(shù)(atoi)的代碼詳解
在編程中,經(jīng)常會遇到將字符串轉(zhuǎn)換為整數(shù)的需求,就像標(biāo)準(zhǔn)庫中的 atoi 函數(shù)一樣,本文給大家介紹了C++中字符串轉(zhuǎn)整數(shù)(atoi)的實現(xiàn)與解析,并有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2025-04-04Opencv 馬賽克和毛玻璃效果與圖片融合的實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了通過OpenCV實現(xiàn)馬賽克和毛玻璃濾鏡效果與圖片的融合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作
這篇文章主要介紹了C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12