欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 【Qt之·类QTextCursor】

【Qt之·类QTextCursor】

2025/2/12 8:14:31 来源:https://blog.csdn.net/m0_66203017/article/details/145266642  浏览:    关键词:【Qt之·类QTextCursor】

系列文章目录


文章目录

  • 前言
  • 一、概述
    • 1.1 QTextCursor类的作用和用途
  • 二、QTextCursor类的常用方法
    • 2.1 setPosition()方法:设置光标的位置
    • 2.2 insertText()方法:在光标位置插入文本。
    • 2.3 deleteChar()方法:删除光标位置处的字符。
    • 2.4 movePosition()方法:移动光标的位置
    • 2.5 setCharFormat()方法:设置字符格式。
    • 2.6 mergeCharFormat()方法:合并字符格式。
  • 三、QTextCursor类的属性
    • 3.1 position属性:获取光标的位置。
    • 3.2 block属性:获取光标所在的文本块。
    • 3.3 charFormat属性:获取光标所在位置的字符格式。
  • 四、QTextCursor类的应用示例
  • 五、QTextCursor类与QTextEdit类的配合使用
  • 六、实例演示
  • 总结


前言

QTextCursor是Qt中用于处理文本的类,它提供了一种灵活且强大的方式来操作文本内容。通过QTextCursor,我们可以轻松地 插入、删除、移动和格式化文本,使得文本处理变得更加简单和高效。

在本博客中,我们将深入探讨QTextCursor的各种用法和功能,包括如何创建和初始化QTextCursor对象、如何在文本中进行定位和移动、如何插入和删除文本内容、以及如何应用不同的文本格式和样式。


一、概述

1.1 QTextCursor类的作用和用途

QTextCursor类在Qt中用于对文本编辑器中的文本进行处理和操作,它提供了一种方便的方式来定位和编辑文本。QTextCursor类可以用于插入、删除、移动和修改文本内容,还可以设置文本格式、样式、选择文本等操作。

一些常见的用途包括:

  • 插入文本: 使用QTextCursor可以方便地在文本编辑器中插入新的文本内容。
  • 删除文本: 可以使用QTextCursor删除文本内容,包括单个字符、单词、整行或选定的文本。
  • 移动光标: 可以通过QTextCursor来移动光标位置,实现在文本中的定位和导航。
  • 修改文本格式: 可以通过QTextCursor设置文本的格式,比如字体、颜色、字号等。
  • 选择文本: 可以使用QTextCursor选择文本范围,以便对选定的文本进行操作。

二、QTextCursor类的常用方法

2.1 setPosition()方法:设置光标的位置

在使用setPosition()方法时,需要传入一个整数作为参数,该整数表示光标在文本中的位置。如果想要将光标设置到文本的开始位置,可以传入0作为参数,如果想要将光标设置到文本的末尾位置,可以传入文本的长度作为参数。

函数原型:void QTextCursor::setPosition(int position, QTextCursor::MoveMode mode = MoveAnchor);
函数功能:
函数参数:position:表示光标要移动到的目标位置。位置是从文档开头计算的字符偏移量(从 0 开始)。例如,setPosition(0) 将光标移动到文档开头,setPosition(10) 将光标移动到第 11 个字符处。mode:指定光标的移动模式,可选值为:QTextCursor::MoveAnchor:仅移动光标位置,不改变选区。QTextCursor::KeepAnchor:移动光标时保留锚点,从而创建或扩展选区。默认值为 MoveAnchor。
返 回 值:

2.2 insertText()方法:在光标位置插入文本。

在使用insertText()方法时,需要传入一个QString作为参数,该QString表示要插入的文本内容。

函数原型:void QTextCursor::insertText(const QString &text);void QTextCursor::insertText(const QString &text, const QTextCharFormat &format);
函数功能:
函数参数:text:要插入的文本内容。可以是普通字符串,也可以是富文本(如 HTML 片段)。format(可选):指定插入文本的格式(如字体、颜色、样式等)。如果不提供此参数,插入的文本将继承光标当前位置的格式。
返 回 值:

2.3 deleteChar()方法:删除光标位置处的字符。

使用deleteChar()方法时,只需将光标移动到需要删除字符的位置,然后调用deleteChar()方法即可。deleteChar()方法会删除光标所在位置的一个字符,并将光标移动到删除字符的后一个位置。

函数原型:void QTextCursor::deleteChar();void QTextCursor::deletePreviousChar();
函数功能:deleteChar():删除光标后的字符(类似于按下 Delete 键)。如果光标位于文档末尾,则无效果。deletePreviousChar():删除光标前的字符(类似于按下 Backspace 键)。如果光标位于文档开头,则无效果。
函数参数:
返 回 值:

2.4 movePosition()方法:移动光标的位置

QTextCursor 类中的 MoveOperation 枚举用于指定移动文本光标时的操作。这些操作可以是基于字符、单词、句子或者页面的移动

函数原型:bool QTextCursor::movePosition(QTextCursor::MoveOperation operation, QTextCursor::MoveMode mode = MoveAnchor, int n = 1);
函数功能:
函数参数:operation:指定光标的移动操作类型,常用的枚举值如下:mode:指定光标的移动模式,可选值为:QTextCursor::MoveAnchor:仅移动光标位置,不改变选区。QTextCursor::KeepAnchor:移动光标时保留锚点,从而创建或扩展选区。默认值为 MoveAnchor。n:指定移动的次数(默认为 1)。例如,movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 5) 将光标向右移动 5 个字符。
返 回 值:

枚举变量如下:

枚举值描述
QTextCursor.NoMove不执行任何移动。
QTextCursor.Start移动到文档的开头。
QTextCursor.StartOfLine移动到当前行的开头。
QTextCursor.StartOfBlock移动到当前块的开头。
QTextCursor.PreviousBlock移动到前一个块。
QTextCursor.NextBlock移动到下一个块。
QTextCursor.Up在上方移动光标。
QTextCursor.Down在下方移动光标。
QTextCursor.Left向左移动光标。
QTextCursor.Right向右移动光标。
QTextCursor.WordLeft向左移动到前一个单词的开头。
QTextCursor.WordRight向右移动到下一个单词的开头。
QTextCursor.End移动到文档的末尾。
QTextCursor.EndOfLine移动到当前行的末尾。
QTextCursor.EndOfBlock移动到当前块的末尾。
QTextCursor.NextWord移动到下一个单词。
QTextCursor.PreviousWord移动到前一个单词。
QTextCursor.NextCell移动到下一个单元格(在表格中)。
QTextCursor.PreviousCell移动到前一个单元格(在表格中)。
QTextCursor.NextRow移动到下一行(在表格中)。
QTextCursor.PreviousRow移动到前一行(在表格中)。
QTextCursor.NextTable移动到下一个表格。
QTextCursor.PreviousTable移动到前一个表格。
QTextCursor.NextSection移动到下一节(在大纲视图模式下)。
QTextCursor.PreviousSection移动到前一节(在大纲视图模式下)。
QTextCursor.StartOfDocument移动到文档的开始。
QTextCursor.StartOfHistory移动到历史记录的开始。
QTextCursor.EndOfSelectableContent移动到可选内容的末尾。
QTextCursor.StartOfSelectableContent移动到可选内容的开始。

2.5 setCharFormat()方法:设置字符格式。

setCharFormat()方法是用于设置文本格式的方法。该方法可以用于设置光标所在位置的文本的字体、字号、颜色等属性。

函数原型:void QTextCursor::setCharFormat(const QTextCharFormat &format);
函数功能:
函数参数:format:指定要应用的字符格式,类型为 QTextCharFormat。QTextCharFormat 是一个用于描述字符格式的类,支持以下常见属性:字体(setFont()setFontFamily()setFontPointSize() 等)。颜色(setForeground()setBackground())。样式(setFontWeight()setFontItalic()setFontUnderline() 等)。其他属性(如文本背景色、下划线颜色等)。
返 回 值:

2.6 mergeCharFormat()方法:合并字符格式。

mergeCharFormat()方法是用于合并文本格式的方法。该方法可以用于将现有文本的格式与新的格式进行合并。

函数原型:
函数功能:
函数参数:
返 回 值:

三、QTextCursor类的属性

3.1 position属性:获取光标的位置。

QTextCursor cursor = textEdit->textCursor();
int cursorPosition = cursor.position();
qDebug() << "Cursor position: " << cursorPosition;

3.2 block属性:获取光标所在的文本块。

QTextCursor cursor = textEdit->textCursor();
QTextBlock currentBlock = cursor.block();qDebug() << "Current block text: " << currentBlock.text(); // 当前文本块的文本内容
qDebug() << "Current block number: " << currentBlock.blockNumber(); // 当前文本块的索引号
qDebug() << "Current block length: " << currentBlock.length(); // 当前文本块的长度

3.3 charFormat属性:获取光标所在位置的字符格式。

QTextCharFormat是一个描述文本格式的类,包括字体、字号、颜色、粗体、斜体等属性。QTextCursor的charFormat属性返回一个QTextCharFormat对象,表示光标当前所在位置的字符格式。

QTextCursor cursor = textEdit->textCursor();
QTextCharFormat charFormat = cursor.charFormat();qDebug() << "Font family: " << charFormat.fontFamily(); // 字体
qDebug() << "Font size: " << charFormat.fontPointSize(); // 字号
qDebug() << "Font weight: " << charFormat.fontWeight(); // 字重
qDebug() << "Font style: " << charFormat.fontItalic(); // 斜体

四、QTextCursor类的应用示例

  • 在文本编辑器中插入文本。

  • 删除文本编辑器中的字符。

  • 移动光标到指定位置。

  • 设置文本的格式。

    插入文本
    
    // 获取QTextEdit的文本光标
    QTextCursor cursor = ui->textEdit->textCursor();// 基础插入(继承当前位置格式)
    cursor.insertText("Hello, Qt!");// 插入时指定格式(如设置红色字体)
    QTextCharFormat format;
    format.setForeground(Qt::red);
    cursor.insertText("Critical Message", format);// 插入后自动滚动到插入位置
    ui->textEdit->ensureCursorVisible();
    
    删除字符
    
    QTextCursor cursor = ui->textEdit->textCursor();// 删除光标前一个字符(类似Backspace)
    if (cursor.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor)) {cursor.removeSelectedText();
    }// 删除光标后一个字符(类似Delete键)
    cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor);
    cursor.removeSelectedText();// 批量删除选中文本
    if (cursor.hasSelection()) {cursor.deleteChar(); // 或 removeSelectedText()
    }
    
    移动光标位置
    
    // 移动到文档开头
    cursor.movePosition(QTextCursor::Start);// 移动到行末
    cursor.movePosition(QTextCursor::EndOfLine);// 跳转到第5行第3列(行/列从0计数)
    cursor.setPosition(0); // 重置到起点
    for (int i=0; i<4; ++i) { // 下移4行到第5行cursor.movePosition(QTextCursor::Down);
    }
    cursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 2); // 右移2字符// 选中从当前位置到文档末尾的文本
    cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);ui->textEdit->setTextCursor(cursor); // 更新光标状态
    
    设置文本格式
    
    // 设置选中文本的格式
    QTextCursor cursor = ui->textEdit->textCursor();
    if (!cursor.hasSelection()) {cursor.select(QTextCursor::WordUnderCursor); // 自动选择光标下单词
    }QTextCharFormat format;
    format.setFontWeight(QFont::Bold);
    format.setFontItalic(true);
    cursor.mergeCharFormat(format);  // 合并格式(保留原有格式属性)// 直接设置格式(覆盖原有格式)
    QTextCharFormat newFormat;
    newFormat.setForeground(Qt::blue);
    cursor.setCharFormat(newFormat);// 为即将输入的文本预设格式
    QTextCharFormat preFormat;
    preFormat.setFontPointSize(14);
    cursor.setCharFormat(preFormat); // 后续输入将应用此格式
    

五、QTextCursor类与QTextEdit类的配合使用

  • QTextCursor类可以与QTextEdit类配合使用,实现对文本编辑器中文本的增删改查操作。
增(插入文本)
// 获取当前光标
QTextCursor cursor = ui->textEdit->textCursor();// 基础插入(继承当前光标位置的格式)
cursor.insertText("插入普通文本");// 插入带格式的文本
QTextCharFormat format;
format.setFontWeight(QFont::Bold);
format.setForeground(Qt::blue);
cursor.insertText("蓝色粗体文本", format);// 插入后自动滚动到插入位置
ui->textEdit->ensureCursorVisible();
删(删除文本)
QTextCursor cursor = ui->textEdit->textCursor();// 删除光标前的字符(类似 Backspace 键)
if (cursor.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor)) {cursor.removeSelectedText();
}// 删除选中文本(如用户拖选后按 Delete 键)
if (cursor.hasSelection()) {cursor.removeSelectedText();
}// 清空整个文档
cursor.select(QTextCursor::Document); // 选中全部内容
cursor.removeSelectedText();
改(修改内容与格式)
QTextCursor cursor = ui->textEdit->textCursor();// 修改选中文本的格式(如设置为斜体+红色)
if (!cursor.hasSelection()) {cursor.select(QTextCursor::WordUnderCursor); // 选中光标下的单词
}QTextCharFormat format;
format.setFontItalic(true);
format.setForeground(Qt::red);
cursor.mergeCharFormat(format); // 合并格式(保留原有其他属性)// 直接替换选中文本
cursor.insertText("新文本内容"); // 会自动删除选中内容并插入新文本
查(获取文本信息)
// 获取整个文档内容
QString allText = ui->textEdit->document()->toPlainText();// 获取选中文本
QTextCursor cursor = ui->textEdit->textCursor();
QString selectedText = cursor.selectedText();// 获取光标位置信息
int currentPos = cursor.position(); // 当前绝对位置
int lineNumber = cursor.blockNumber() + 1; // 行号(从1开始)// 遍历文档内容(例如统计字符数)
QTextDocument *doc = ui->textEdit->document();
QTextCursor scanCursor(doc);
int charCount = 0;
while (!scanCursor.atEnd()) {scanCursor.movePosition(QTextCursor::NextCharacter);charCount++;
}

六、实例演示

示例1

    QTextCursor tc(ui->textEdit->textCursor());tc.insertText("Hello,QTextCursor !\nThis is a test demo.\n");tc.setPosition(0);
//    tc.movePosition(QTextCursor::End,QTextCursor::KeepAnchor);//    QTextCharFormat format;
//    format.setForeground(Qt::blue);
//    format.setFontWeight(QFont::Bold);
//    tc.mergeCharFormat(format);//    tc.movePosition(QTextCursor::Up);
//    tc.movePosition(QTextCursor::Right);
//    tc.movePosition(QTextCursor::NextWord);
//    tc.movePosition(QTextCursor::NextWord);
//    tc.movePosition(QTextCursor::EndOfWord);
//    tc.movePosition(QTextCursor::StartOfWord);
//    tc.movePosition(QTextCursor::EndOfBlock);
//    tc.movePosition(QTextCursor::Down);
//    tc.movePosition(QTextCursor::StartOfLine);
//    tc.movePosition(QTextCursor::EndOfLine);
//    tc.movePosition(QTextCursor::StartOfLine);
//    tc.movePosition(QTextCursor::End);
//    tc.movePosition(QTextCursor::Start);qDebug() << tc.position();QTextBlock block = tc.block();qDebug() << block.text();ui->textEdit->setTextCursor(tc);

运行结果:
在这里插入图片描述

示例2


运行结果:

示例3


运行结果:


总结

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com