【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()方法是用于合并文本格式的方法。该方法可以用于将现有文本的格式与新的格式进行合并。

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

三、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


运行结果:


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16074.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio 中的键盘快捷方式

可打印快捷方式备忘单 Visual Studio 的常用键盘快捷方式 本部分中的所有快捷方式都将全局应用&#xff08;除非另有指定&#xff09;。 “全局”上下文表示该快捷方式适用于 Visual Studio 中的任何工具窗口。 生成&#xff1a;常用快捷方式 命令键盘快捷键命令 ID生成解决…

如何免费白嫖 Deepseek API 接口

今天我将教大家如何利用网络空间测绘搜索引擎「Fofa」来寻找已经部署并开放 Deepseek 接口的服务。以下是详细步骤&#xff1a; 1. 访问 Fofa 搜索引擎 首先&#xff0c;打开 Fofa 搜索引擎的网站&#xff1a;https://fofa.info 2. 搜索开放的 Deepseek 接口 在搜索框中输入…

如何评估云原生GenAI应用开发中的安全风险(下)

以上就是如何评估云原生GenAI应用开发中的安全风险系列中的上篇内容&#xff0c;在本篇中我们介绍了在云原生AI应用开发中不同层级的风险&#xff0c;并了解了如何定义AI系统的风险。在本系列下篇中我们会继续探索我们为我们的云原生AI应用评估风险的背景和意义&#xff0c;并且…

Mybatis源码02 - 初始化基本过程(引导层部分)

初始化基本过程&#xff08;引导层部分&#xff09; 文章目录 初始化基本过程&#xff08;引导层部分&#xff09;一&#xff1a;初始化的方式及引入二&#xff1a;初始化方式-XML配置文件1&#xff1a;MyBatis初始化基本过程2&#xff1a;创建Configuration对象的过程2.1&…

Baumer工业相机堡盟工业相机如何实现一次图像采集同时检测产品的5个面甚至多个面(C#)(NEOAPI SDK)

Baumer工业相机堡盟工业相机如何实现一次图像采集同时检测产品的5个面甚至多个面&#xff08;C#&#xff09;&#xff08;NEOAPI SDK&#xff09; Baumer工业相机光学棱镜反射图像的技术背景工业相机ROI功能的技术背景图像处理多线程功能的技术背景Baumer工业相机通过棱镜同时检…

ASP.NET Core 如何使用 C# 从端点发出 GET 请求

使用 C#&#xff0c;从 REST API 端点获取 JSON&#xff1b;如何从 REST API 接收 JSON 数据。 本文需要 ASP .NET Core&#xff0c;并兼容 .NET Core 3.1、.NET 6和.NET 8。 要将数据发布到端点&#xff0c;请参阅本文。 使用 . 从端点发布 GET 数据非常容易HttpClient&…

基于微信小程序的博物馆预约系统的设计与实现

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

Mybatis快速入门与核心知识总结

Mybatis 1. 实体类&#xff08;Entity Class&#xff09;1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件&#xff08;可选&#xff09;3.1 …

ios通过xib创建控件

之前写过ios动态创建控件及添加事件&#xff0c;纯手工代码写控件&#xff0c;虽然比较灵活&#xff0c;但是就是代码量比较多。这次我们通过xib来创建app下载列表项 AppView.xib。一个imageview,一个label,一个button构成 1.创建AppView.xib 2.再创建xib对应的mode&#xff0…

MybatisPlus常用增删改查

记录下MybatisPlus的简单的增删改查 接口概述 Service和Mapper区别 Mapper简化了单表的sql操作步骤&#xff08;CRUD&#xff09;&#xff0c;而Serivce则是对Mapper的功能增强。 Service虽然加入了数据库的操作&#xff0c;但还是以业务功能为主&#xff0c;而更加复杂的SQL…

deepseek+kimi一键生成PPT

1、deepseek生成大纲内容 访问deepseek官方网站&#xff1a;https://www.deepseek.com/ 将你想要编写的PPT内容输入到对话框&#xff0c;点击【蓝色】发送按钮&#xff0c;让deepseek生成内容大纲&#xff0c;并以markdown形式输出。 等待deepseek生成内容完毕后&#xff0c…

1312:【例3.4】昆虫繁殖

1312&#xff1a;【例3.4】昆虫繁殖 时间限制: 1000 ms 内存限制: 65536 KB 提交数:60386 通过数: 29787 【题目描述】 科学家在热带森林中发现了一种特殊的昆虫&#xff0c;这种昆虫的繁殖能力很强。每对成虫过xx个月产yy对卵&#xff0c;每对卵要过两个月长成成虫…

【牛客】动态规划专题一:斐波那契数列

文章目录 DP1 斐波那契数列法1&#xff1a;递归法2&#xff1a;动态规划法3&#xff1a;优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict&#xff0c;在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1&#xff1a;递归 // 递归 #include <iostream>…

RDK新一代模型转换可视化工具!!!

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 之前在使用的RDK X3的时候&#xff0c;吴诺老师wunuo发布了新一代量化转换工具链使用教程&#xff0c;这个工具真的非常的方便&#xff0c;能非常快速的完成X3上模型的量化…

2025.2.8——一、[护网杯 2018]easy_tornado tornado模板注入

题目来源&#xff1a;BUUCTF [护网杯 2018]easy_tornado 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;分析已知信息 step 2&#xff1a;目标——找到cookie_secret step 3&#xff1a;构造payload 三、小结 一、打开靶机&#xff0c;整理信…

2. UVM的基本概念和架构

文章目录 前言1. UVM的基本概念1.1 UVM的核心组件1.2 UVM的基本架构1.3 UVM的工作流程 2. UVM的架构2.1 UVM的层次结构2.2 UVM的组件交互 3. 总结 前言 首先&#xff0c;得确定UVM的基本概念和架构包含哪些关键部分。我回忆起UVM的核心组件&#xff0c;比如uvm_component、uvm…

VMware Workstation创建虚拟机

目录 创建新的虚拟机 虚拟机快照功能 虚拟机添加空间 其他注意事项 创建新的虚拟机 打开VMware Workstation&#xff1a;启动软件后&#xff0c;点击“创建新的虚拟机”。 选择安装方式&#xff1a; 典型安装&#xff1a;适合大多数用户&#xff0c;会自动完成大部分配置…

食物过敏——来龙去脉

​ 春节假期期间&#xff0c;亲朋好友欢聚一堂&#xff0c;美食佳肴各种狂炫&#xff0c;然而当传统节日遭遇现代饮食文化&#xff0c;频繁的高脂高蛋白摄入、不规律的进食节奏&#xff0c;正不断冲击着肠道屏障的免疫调控网络&#xff0c;部分人群可能正被食物过敏困扰。 ​ 食…

解决VsCode的 Vetur 插件has no default export Vetur问题

文章目录 前言1.问题2. 原因3. 解决其他 前言 提示&#xff1a; 1.问题 Cannot find module ‘ant-design-vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option? Module ‘“/xxx/xxx/xxx/xxx/xxx/src/vie…

不小心删除服务[null]后,git bash出现错误

不小心删除服务[null]后&#xff0c;git bash出现错误&#xff0c;如何解决&#xff1f; 错误描述&#xff1a;打开 git bash、msys2都会出现错误「bash: /dev/null: No such device or address」 问题定位&#xff1a; 1.使用搜索引擎搜索「bash: /dev/null: No such device o…