最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt如何實(shí)現(xiàn)文本編輯器光標(biāo)高亮技術(shù)

 更新時(shí)間:2025年06月20日 16:37:23   作者:范紋杉好好生活工作  
這篇文章主要為大家詳細(xì)介紹了Qt如何實(shí)現(xiàn)文本編輯器光標(biāo)高亮技術(shù),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下

實(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);
    //   配置段屬性:整行顯示,沒(méi)有這句話不行
    ext.format.setProperty(QTextFormat::FullWidthSelection, true);
 
    //    3,設(shè)置
    //把ext加到ext的容器中
    extraSelections.append(ext);
    ui->textEdit->setExtraSelections(extraSelections);
}
//解釋這串代碼,寫(xiě)上注釋,并仔細(xì)闡述里面用到了什么技術(shù)?

下面是對(duì)這段代碼的逐行詳細(xì)注釋 + 技術(shù)解析,幫助你全面理解它的功能和背后使用的技術(shù)。

函數(shù)作用概述

void Widget::oncursorPositionChanged()

這是一個(gè) 槽函數(shù)(slot),當(dāng) QTextEdit 的光標(biāo)位置發(fā)生變化時(shí)自動(dòng)觸發(fā)。它用于:

獲取當(dāng)前光標(biāo)所在的行列號(hào);

在界面上顯示該信息(例如:“列:1, 行:3”);

高亮顯示當(dāng)前光標(biāo)所在的整行內(nèi)容;

代碼詳解 + 注釋

    // 獲取 QTextEdit 中的當(dāng)前光標(biāo)對(duì)象
    QTextCursor cursor = ui->textEdit->textCursor();

QTextCursor 是 Qt 提供的一個(gè)類(lèi),用于操作文本內(nèi)容;

它記錄了光標(biāo)的位置、選區(qū)等信息;

textCursor() 返回當(dāng)前的光標(biāo)狀態(tài)。

    // 將行號(hào)和列號(hào)轉(zhuǎn)為字符串
    QString blockNum = QString::number(cursor.blockNumber() + 1);
    QString columnNumber = QString::number(cursor.columnNumber() + 1);

cursor.blockNumber():返回當(dāng)前光標(biāo)所在的段落編號(hào)(從 0 開(kāi)始),即“行號(hào)”;

cursor.columnNumber():返回當(dāng)前光標(biāo)在該行中的字符偏移量,即“列號(hào)”;

+1 是為了將索引從 0 轉(zhuǎn)換為更直觀的“第1行第1列”;

QString::number(...) 將整數(shù)轉(zhuǎn)換為字符串。

    const QString labelMes = "列:" + blockNum + ", 行:" + columnNumber;
    ui->labelPosition->setText(labelMes);

構(gòu)造一個(gè)格式化的字符串,如 "列:3, 行:5";

顯示在界面中的 QLabel 控件上,控件名為 labelPosition;

這個(gè)標(biāo)簽通常用于實(shí)時(shí)顯示光標(biāo)位置。

使用 QTextEdit 的高亮技術(shù)(重點(diǎn))

1. 創(chuàng)建額外選擇區(qū)域列表

    QList<QTextEdit::ExtraSelection> extraSelections;

QTextEdit::ExtraSelection 是 Qt 提供的一種機(jī)制,允許你在文本編輯器中自定義高亮顯示區(qū)域;

可以設(shè)置背景色、前景色、字體樣式等;

QList<...> 是 Qt 的容器類(lèi),用來(lái)保存多個(gè)高亮區(qū)域。

QTextEdit::ExtraSelection ext;

創(chuàng)建一個(gè) ExtraSelection 對(duì)象,表示一個(gè)要高亮的區(qū)域;

后續(xù)會(huì)配置這個(gè)對(duì)象,并添加到 extraSelections 列表中。

ext.cursor = ui->textEdit->textCursor();

設(shè)置高亮區(qū)域的光標(biāo)范圍;

這里直接使用當(dāng)前光標(biāo),表示高亮“當(dāng)前行”的內(nèi)容。

QBrush qBrush(Qt::yellow);

創(chuàng)建一個(gè)畫(huà)刷對(duì)象,顏色為黃色;

用于設(shè)置高亮的背景色。

ext.format.setBackground(qBrush);

設(shè)置高亮區(qū)域的格式,這里是設(shè)置背景色為黃色;

QTextCharFormat 是格式描述對(duì)象,支持多種樣式設(shè)置。

ext.format.setProperty(QTextFormat::FullWidthSelection, true);

設(shè)置該區(qū)域的格式屬性為“全寬選擇”,即整行高亮;

否則只會(huì)高亮光標(biāo)所在字符位置,而不是整行。

extraSelections.append(ext);

將配置好的高亮區(qū)域加入列表中。

ui->textEdit->setExtraSelections(extraSelections);

將高亮區(qū)域應(yīng)用到 textEdit 控件;

此后,當(dāng)前光標(biāo)所在的整行就會(huì)被黃色高亮顯示。

總結(jié)用到的關(guān)鍵技術(shù)點(diǎn)

技術(shù)名稱描述
QTextCursor用于獲取或操作文本編輯器中的光標(biāo)位置和內(nèi)容
QTextEdit::ExtraSelection允許在 QTextEdit 中自定義高亮顯示區(qū)域
QTextCharFormat文本字符格式設(shè)置類(lèi),可設(shè)置背景色、字體、大小等
QBrush畫(huà)刷類(lèi),用于設(shè)置背景顏色或圖案
QList<T>Qt 提供的泛型容器類(lèi),用于管理多個(gè)對(duì)象
QString::number()將數(shù)字轉(zhuǎn)換為字符串,用于顯示
setText()QLabel 常用方法,更新界面上的文字

應(yīng)用場(chǎng)景舉例

這種功能常用于:

  • 自定義文本編輯器(如代碼編輯器);
  • 實(shí)現(xiàn)“行號(hào)顯示 + 當(dāng)前行高亮”功能;
  • 模擬 IDE 中的光標(biāo)定位與語(yǔ)法高亮;
  • 實(shí)現(xiàn)富文本編輯器中的自定義樣式區(qū)域;

示例優(yōu)化建議

你可以將上面的代碼封裝成一個(gè)函數(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>

  • 添加行號(hào)顯示功能;
  • 支持多行高亮;
  • 或者實(shí)現(xiàn)類(lèi)似 VS Code 的編輯器界面;

到此這篇關(guān)于Qt如何實(shí)現(xiàn)文本編輯器光標(biāo)高亮技術(shù)的文章就介紹到這了,更多相關(guān)Qt文本高亮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言預(yù)處理預(yù)編譯命令及宏定義詳解

    C語(yǔ)言預(yù)處理預(yù)編譯命令及宏定義詳解

    這篇文章主要為大家介紹了C語(yǔ)言預(yù)處理預(yù)編譯命令及宏定義的詳解,其中包含運(yùn)行環(huán)境命名約定條件及#under等基礎(chǔ)詳解,有需要的朋友可以借鑒參考下
    2021-10-10
  • C++設(shè)計(jì)模式之組合模式(Composite)

    C++設(shè)計(jì)模式之組合模式(Composite)

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之組合模式Composite,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • C語(yǔ)言使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器

    C語(yǔ)言使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-12-12
  • C語(yǔ)言超詳細(xì)講解字符串相乘

    C語(yǔ)言超詳細(xì)講解字符串相乘

    這篇文章主要介紹了用C語(yǔ)言如何來(lái)實(shí)現(xiàn)字符串相乘的方法,這里我們會(huì)利用到memset函數(shù),memset函數(shù)是對(duì)較大的結(jié)構(gòu)體或數(shù)組進(jìn)行清零操作的一種最快方法,可以說(shuō)是初始化內(nèi)存的“萬(wàn)能函數(shù)”,下面我們?cè)敿?xì)了解一下
    2022-03-03
  • c語(yǔ)言求兩個(gè)字符串的交集

    c語(yǔ)言求兩個(gè)字符串的交集

    大家好,本篇文章主要講的是c語(yǔ)言求兩個(gè)字符串的交集,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 詳解如何在VS2019和VScode中配置C++調(diào)用python接口

    詳解如何在VS2019和VScode中配置C++調(diào)用python接口

    這篇文章主要介紹了詳解如何在VS2019和VScode中配置C++調(diào)用python接口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++特殊類(lèi)設(shè)計(jì)及類(lèi)型轉(zhuǎn)換舉例詳解

    C++特殊類(lèi)設(shè)計(jì)及類(lèi)型轉(zhuǎn)換舉例詳解

    這篇文章主要介紹了C++中如何設(shè)計(jì)不能被拷貝、只能在堆上或棧上創(chuàng)建對(duì)象的類(lèi)、不能被繼承的類(lèi)以及單例模式的實(shí)現(xiàn)方法,還討論了C++中的類(lèi)型轉(zhuǎn)換,需要的朋友可以參考下
    2025-05-05
  • C/C++錯(cuò)誤信息處理的常見(jiàn)方法及函數(shù)

    C/C++錯(cuò)誤信息處理的常見(jiàn)方法及函數(shù)

    C/C++是兩種廣泛使用的編程語(yǔ)言,特別是在系統(tǒng)編程、嵌入式開(kāi)發(fā)以及高性能計(jì)算領(lǐng)域,這篇文章主要介紹了C/C++錯(cuò)誤信息處理的常見(jiàn)方法及函數(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • C++中實(shí)現(xiàn)位運(yùn)算的示例代碼

    C++中實(shí)現(xiàn)位運(yùn)算的示例代碼

    位運(yùn)算是對(duì)二進(jìn)制數(shù)的每一位進(jìn)行的操作,本文介紹了計(jì)算機(jī)中的位運(yùn)算概念及常見(jiàn)操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • 單鏈表實(shí)現(xiàn)反轉(zhuǎn)的3種方法示例代碼

    單鏈表實(shí)現(xiàn)反轉(zhuǎn)的3種方法示例代碼

    單鏈表的反轉(zhuǎn)是常見(jiàn)的面試題目,下面這篇文章主要給大家介紹了關(guān)于單鏈表實(shí)現(xiàn)反轉(zhuǎn)的3種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評(píng)論

荥经县| 临夏市| 巴楚县| 新津县| 屏东市| 溧阳市| 新丰县| 富顺县| 夹江县| 习水县| 凤庆县| 陇川县| 都江堰市| 根河市| 罗定市| 张家界市| 桐梓县| 临泽县| 河东区| 庄浪县| 芦山县| 阳山县| 定远县| 兴城市| 阿克陶县| 康保县| 米林县| 富蕴县| 龙胜| 花莲县| 保靖县| 张家口市| 鄯善县| 叶城县| 泗水县| 仙居县| 诸暨市| 连南| 桃江县| 灵石县| 扶沟县|