Qt如何實(shí)現(xiàn)文本編輯器光標(biāo)高亮技術(shù)
實(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)簽通常用于實(shí)時顯示光標(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)用場景舉例
這種功能常用于:
- 自定義文本編輯器(如代碼編輯器);
- 實(shí)現(xiàn)“行號顯示 + 當(dāng)前行高亮”功能;
- 模擬 IDE 中的光標(biāo)定位與語法高亮;
- 實(shí)現(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>
- 添加行號顯示功能;
- 支持多行高亮;
- 或者實(shí)現(xiàn)類似 VS Code 的編輯器界面;
到此這篇關(guān)于Qt如何實(shí)現(xiàn)文本編輯器光標(biāo)高亮技術(shù)的文章就介紹到這了,更多相關(guān)Qt文本高亮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++設(shè)計(jì)模式之組合模式(Composite)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之組合模式Composite,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
C語言使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器
這篇文章主要為大家詳細(xì)介紹了C語言如何使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-12-12
詳解如何在VS2019和VScode中配置C++調(diào)用python接口
這篇文章主要介紹了詳解如何在VS2019和VScode中配置C++調(diào)用python接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
C++特殊類設(shè)計(jì)及類型轉(zhuǎn)換舉例詳解
這篇文章主要介紹了C++中如何設(shè)計(jì)不能被拷貝、只能在堆上或棧上創(chuàng)建對象的類、不能被繼承的類以及單例模式的實(shí)現(xiàn)方法,還討論了C++中的類型轉(zhuǎn)換,需要的朋友可以參考下2025-05-05
C++中實(shí)現(xiàn)位運(yùn)算的示例代碼
位運(yùn)算是對二進(jìn)制數(shù)的每一位進(jìn)行的操作,本文介紹了計(jì)算機(jī)中的位運(yùn)算概念及常見操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-03-03
單鏈表實(shí)現(xiàn)反轉(zhuǎn)的3種方法示例代碼
單鏈表的反轉(zhuǎn)是常見的面試題目,下面這篇文章主要給大家介紹了關(guān)于單鏈表實(shí)現(xiàn)反轉(zhuǎn)的3種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02

