QTextDocument 入门
一、QTextDocument
QTextDocument 是 Qt 中用于处理富文本文档的核心类,支持文本格式、图片、表格等复杂内容。
1. QTextDocument 入门
1.1 基本概念
QTextDocument 是 Qt 中用于处理富文本内容的核心类,它提供了:
-
结构化文本存储(段落、列表、表格等)
-
文本格式支持(字体、颜色、对齐等)
-
文档布局管理
-
撤销/重做功能
-
HTML/纯文本/Markdown 支持
1.2 创建方式
// 方式1:直接创建
QTextDocument *doc = new QTextDocument(parent);// 方式2:从QTextEdit获取
QTextEdit *editor = new QTextEdit;
QTextDocument *doc = editor->document();// 方式3:从内容创建
QTextDocument *doc = new QTextDocument("初始内容", parent);
2. 核心属性表
属性 | 类型 | 访问 | 描述 |
---|---|---|---|
baseUrl | QUrl | 读写 | 解析相对URL的基础地址 |
blockCount | int | 只读 | 文档中的文本块数量 |
characterCount | int | 只读 | 文档字符总数 |
defaultFont | QFont | 读写 | 默认字体设置 |
documentMargin | qreal | 读写 | 文档页边距 |
indentWidth | qreal | 读写 | 缩进宽度 |
isEmpty | bool | 只读 | 是否为空文档 |
modified | bool | 读写 | 文档是否被修改 |
pageSize | QSizeF | 读写 | 页面尺寸 |
textWidth | qreal | 读写 | 文本宽度限制 |
title | QString | 读写 | 文档标题 |
undoRedoEnabled | bool | 读写 | 是否启用撤销/重做 |
3. 重要方法分类
3.1 内容操作
// 设置/获取内容
void setPlainText(const QString &text)
QString toPlainText() const
void setHtml(const QString &html)
QString toHtml() const
void setMarkdown(const QString &markdown)
QString toMarkdown() const// 清空文档
void clear()
3.2 文本查找
QTextCursor find(const QString &subString, const QTextCursor &from = QTextCursor(),FindFlags flags = FindFlags()) constQTextCursor find(const QRegularExpression &expr,const QTextCursor &from = QTextCursor(),FindFlags flags = FindFlags()) const
3.3 撤销/重做
void undo()
void redo()
void clearUndoRedoStacks()
bool isUndoAvailable() const
bool isRedoAvailable() const
3.4 文档结构
// 获取文档部分
QTextBlock firstBlock() const
QTextBlock lastBlock() const
QTextFrame *rootFrame() const// 迭代器
QTextBlock begin() const
QTextBlock end() const
3.5 资源管理
QVariant loadResource(int type, const QUrl &name)
void addResource(int type, const QUrl &name, const QVariant &resource)
3.6 打印输出
void drawContents(QPainter *painter, const QRectF &rect = QRectF())
void print(QPagedPaintDevice *printer) const
4. 信号系统
信号 | 描述 |
---|---|
contentsChanged() | 文档内容发生改变时触发 |
contentsChange(int from, int charsRemoved, int charsAdded) | 详细内容变化信号 |
undoAvailable(bool available) | 撤销状态变化 |
redoAvailable(bool available) | 重做状态变化 |
modificationChanged(bool changed) | 修改状态变化 |
blockCountChanged(int newBlockCount) | 块数量变化 |
cursorPositionChanged(const QTextCursor &cursor) | 光标位置变化 |
5. 实用示例
5.1 基本使用
QTextDocument doc;
doc.setPlainText("Hello World!");// 设置格式
QTextCursor cursor(&doc);
cursor.movePosition(QTextCursor::Start);
QTextCharFormat fmt;
fmt.setFontWeight(QFont::Bold);
cursor.insertText("Formatted ", fmt);
5.2 HTML处理
doc.setHtml("<b>Bold</b> and <i>italic</i> text");
QString html = doc.toHtml();
5.3 响应变化
connect(&doc, &QTextDocument::contentsChanged, [](){qDebug() << "Document modified";
});
6. 高级功能
6.1 自定义文档布局
class CustomLayout : public QAbstractTextDocumentLayout {/* 实现布局逻辑 */
};doc->setDocumentLayout(new CustomLayout(doc));
6.2 文本对象接口
class CustomTextObject : public QObject, public QTextObjectInterface {/* 实现自定义文本对象 */
};QTextCharFormat format;
format.setObjectType(QTextFormat::UserObject + 1);
doc->documentLayout()->registerHandler(format.objectType(), new CustomTextObject);
7. 性能优化技巧
-
批量操作:在大量修改前调用
blockSignals(true)
,完成后恢复 -
资源管理:对大型文档使用分页加载
-
格式重用:复用 QTextFormat 对象减少内存分配
-
布局控制:合理设置 textWidth 和页面尺寸
二、QTextCursor
QTextCursor 是 Qt 框架中用于操作 QTextDocument 的核心类,提供了对富文本内容的编辑、选择和格式控制功能。它类似于文本编辑器中的光标,可以移动、插入、删除文本,并控制文本格式。
1. QTextCursor 基本概念
1.1 主要用途
-
文本插入和删除:在 QTextDocument 中插入或删除文本。
-
文本选择:选择文本范围,进行复制、剪切或格式修改。
-
格式控制:设置字符格式(字体、颜色等)和段落格式(对齐、缩进等)。
-
表格和列表操作:插入表格、列表,并控制其结构。
1.2 创建 QTextCursor
// 方式1:基于 QTextDocument 创建
QTextDocument *doc = new QTextDocument;
QTextCursor cursor(doc);// 方式2:基于现有 QTextCursor 复制
QTextCursor anotherCursor(cursor);// 方式3:基于 QTextEdit 获取(适用于 GUI 应用)
QTextEdit *textEdit = new QTextEdit;
QTextCursor editCursor = textEdit->textCursor();
2. QTextCursor 属性
QTextCursor 本身没有直接可访问的属性(如 property()
),但可以通过方法获取或修改其状态:
属性(概念) | 获取方法 | 设置方法 |
---|---|---|
位置 | position() | setPosition(int pos) |
是否有选择 | hasSelection() | clearSelection() |
选择范围 | selectionStart() , selectionEnd() | setPosition(pos, mode) |
当前块(段落) | block() | movePosition() |
当前字符格式 | charFormat() | setCharFormat() |
当前段落格式 | blockFormat() | setBlockFormat() |
是否可撤销/重做 | isUndoAvailable() / isRedoAvailable() | undo() / redo() |
3. QTextCursor 常用方法
3.1 光标移动
方法 | 说明 |
---|---|
movePosition(MoveOperation op, MoveMode mode = MoveAnchor, int n = 1) | 移动光标(如 StartOfLine , EndOfDocument ) |
setPosition(int pos, MoveMode mode = MoveAnchor) | 设置光标位置 |
atStart() , atEnd() | 是否在文档开头/结尾 |
atBlockStart() , atBlockEnd() | 是否在段落开头/结尾 |
相关文章:
QTextDocument 入门
一、QTextDocument QTextDocument 是 Qt 中用于处理富文本文档的核心类,支持文本格式、图片、表格等复杂内容。 1. QTextDocument 入门 1.1 基本概念 QTextDocument 是 Qt 中用于处理富文本内容的核心类,它提供了: 结构化文本存储(段落、列表、表格等) 文本格式支持(…...
Arthas进阶用法
目录 查看已加载的类反编译代码动态执行代码排查 HTTP 请求问题热更新代码获取 Spring Context 并操作查看 JVM 信息自定义命令Web Console重置与退出 查看已加载的类 sc 命令 :可以查找所有 JVM 已经加载到的类。如果搜索的是接口,还会搜索所有的实现类…...
三生原理与现有密码学的核心区别?
AI辅助创作: 三生原理与现有密码学的核心区别 一、哲学基础与设计逻辑 动态生成 vs 静态分析 三生原理以“阴阳动态平衡”为核心,通过参数化生成(如素数构造中的阴阳元联动公式)模拟系统演化过程,而现有密码…...
定义python中的函数和类
1.函数 在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回 1.1 定义函数 def showshow(sex):if sex1:return manelse:retu…...
明远智睿2351开发板四核1.4G Linux处理器:驱动创新的引擎
在科技日新月异的今天,创新成为了推动社会进步的核心动力。而在这场创新的浪潮中,一款性能卓越、功能全面的处理器无疑是不可或缺的引擎。今天,我们介绍的这款四核1.4G处理器搭配Linux系统的组合,正是这样一款能够驱动未来创新的强…...
【前端】【业务逻辑】【面试】JSONP处理跨域原理与封装
🧠 一、JSONP 是什么? 项目内容📌 全称JSON with Padding📍 用途跨域请求数据的一种方式,绕过同源策略📦 本质通过 <script> 标签加载远程 JS 文件,这个文件执行一个回调函数并传入数据 …...
深入探索RAG:用LlamaIndex为大语言模型扩展知识,实现智能检索增强生成
大型语言模型(LLM),如ChatGPT和Llama,在回答问题方面表现出色,但它们的知识仅限于训练时所获取的信息。它们无法访问私有数据,也无法在训练截止日期之后学习新知识。那么,核心问题就是……我们如…...
移远通信智能模组助力东成“无边界智能割草机器人“闪耀欧美市场
2025年4月21日,移远通信宣布,旗下SC206E-EM智能模组已成功应用于江苏东成电动工具有限公司旗下的DCK TERRAINA无边界智能割草机器人。 这款智能模组高度集成计算、通信、定位等多元能力,以小型化、低功耗、实时性强和低成本等综合优势&#…...
测试-时间规模化定律可以改进世界基础模型吗?
25年3月来自 UT Austin、UW Madison 和 Nvidia 的论文“Can Test-Time Scaling Improve World Foundation Model?”。 世界基础模型(WFM)通过根据当前的观察和输入预测未来状态来模拟物理世界,已成为许多物理智能(PI)…...
VMwaer虚拟机复制粘贴、ROS系统安装
一、VMwaer虚拟机复制粘贴设置:设置完记得重启VMwaer 1.首先确定 虚拟机设置-->选项-->客户机隔离-->勾选 启用拖放 启用复制粘贴 2.如果还是不能粘贴 可能是 没有 VMware Tools 可参考 怎么在linux安装vmware tools-CSDN博客 设置完记得重启VMwaer。…...
安装 vmtools
第2章 安装 vmtools 1.安装 vmtools 的准备工作 1)现在查看是否安装了 gcc 查看是否安装gcc 打开终端 输入 gcc - v 安装 gcc 链接:https://blog.csdn.net/qq_45316173/article/details/122018354?ops_request_misc&request_id&biz_id10…...
HCIP(综合实验2)
1.实验拓补图 2.实验要求 1.根据提供材料划分VLAN以及IP地址,PC1/PC2属于生产一部员工划分VLAN10,PC3属于生产二部划分VLAN20 2.HJ-1HJ-2交换机需要配置链路聚合以保证业务数据访问的高带宽需求 3.VLAN的放通遵循最小VLAN透传原则 4.配置MSTP生成树解决二层环路问题…...
机器学习第一篇 线性回归
数据集:公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标:基于GDP值预测幸福指数。(单特征预测) 代码: 文件一:prepare_for_traning.py """用于科学计算的一个库…...
Spark-Streaming简介及核心编程
一、核心概念: 1.Spark-Streaming 是流式数据处理框架,基于 **DStream(离散化流)** 抽象,将实时数据划分为多个时间区间的 RDD 序列。 DStream 本质是RDD 序列,每个时间区间数据对应一个 RDD。 2.特点&a…...
优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论
优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论 目录 优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论信息论信息熵明确问题主题提供具体细节限定回答方向规范语言表达概率论最优化理论信息论 原理:信息论中的熵可以衡量信息的不确定性。…...
Sqlserver安全篇之_Sqlcmd命令使用windows域账号认证sqlserver遇到问题如何处理的案例
sqlcmd https://learn.microsoft.com/zh-cn/sql/tools/sqlcmd/sqlcmd-connect-database-engine?viewsql-server-ver16 sqlcmd -S指定的数据库连接字符串必须有对应的有效的SPN信息,否则会报错SSPI Provider: Server not found in Kerberos database. 正常连接 1、…...
基于华为云 ModelArts 的在线服务应用开发(Requests 模块)
基于华为云 ModelArts 的在线服务应用开发(Requests 模块) 一、本节目标 了解并掌握 Requests 模块的特点与用法学会通过 PythonRequests 访问华为云 ModelArts 在线推理服务熟悉 JSON 模块在 Python 中的数据序列化与反序列化掌握 Python 文件 I/O 的基…...
Graph Database Self-Managed Neo4j 知识图谱存储实践1:安装和基础知识学习
Neo4j 是一个原生图数据库,这意味着它在存储层实现了真正的图模型。它不是在其他技术之上使用“图抽象”,而是以您在白板上绘制想法的相同方式在Neo4j中存储数据。 自2007年以来,Neo4j已经发展成为一个丰富的工具、应用程序和库的生态系统。…...
【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:配置虚拟环境案例2:智能代码补全案例3:调试配置 运行结果…...
vscode:Live Server Preview插件
这个插件不用另外打开浏览器;它是直接在Vscode里面预览html的,并且是自动实时更新的,不用不停地CtrlS保存查看 使用方法:F1 -> 弹出一个窗口输入live,选择即可。 运行结果如下:...
关于在Springboot中设置时间格式问题
目录 1-设置全局时间格式1.Date类型的时间2.JDK8时间3.使Date类和JDK8时间类统统格式化时间 2-关于DateTimeFormat注解 1-设置全局时间格式 1.Date类型的时间 对于老项目来说,springboot中许多类使用的是Date类型的时间,没有用到LocalDateTime等JDK8时…...
双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!
2025-04-21 语言更新 async 函数的调用处语法改为和 error 相同的 f!(..),原语法 f!!(..) 将触发警告 运算符重载的语义从基于方法迁移到了基于 trait,以后重载运算符需要通过给 moonbitlang/core/builtin 中对应的 trait 添加 impl 的形式。各个运算符…...
AI 技术发展:从起源到未来的深度剖析
一、AI 的起源与早期发展 人工智能(AI)作为计算机科学的重要分支,其诞生可以追溯到 20 世纪中叶。1943 年,艾伦・图灵提出图灵机的概念,为计算机科学和 AI 理论奠定了基础。1950 年,图灵又提出著名的图灵…...
【前端】【业务逻辑】 数据大屏自适应方案汇总
前端数据大屏自适应设计方案全解析 在前端数据大屏的开发中,自适应设计是关键环节,它能确保大屏在不同设备和屏幕尺寸上都能呈现出良好的视觉效果和交互体验。除了常见的 transform: scale、rem/vw、Flex/Grid 等方案外,还有其他有效的方法可…...
Java基础复习(JavaSE进阶)第六章 IO流体系
6-1 File类 01 122、File、IO流概述 02 123、File类:对象的创建 03 124、File类:判断、判断信息相关的方法 04 125、File类:创建、删除文件的方法 05 126、File类:遍历文件夹的方法 6-2 前置知识 01 127、前置知识:方…...
kvm下的ceph主机启动io请求统计
背景 假如一个主机存储在ceph里面,我们想统计下一次启动过程中的io读取的情况,那么可以通过下面的方法来统计 启动时间也可以通过在宿主机里面去查看,通过日志这边要方便一点,无需登录到虚拟机内部 日志开启 [global] fsid 406…...
go-Casbin使用
本次测试代码是基于单租户的RBAC鉴权 依赖 github.com/casbin/casbin/v2 github.com/casbin/gorm-adapter/v2文件存储规则文件 model.pml [request_definition] r sub, obj, act[policy_definition] p sub, obj, act[role_definition] g _, _ # 用户,角色[polic…...
基于YOLOv11的106种手语识别分析系统
基于YOLOv11的手语识别分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】多平台适配优化,支持Windows、macOS和Linux系统,确保中文字体正常渲染 【四】识别的类别数量:106种,具体类…...
CentOS创建swap内存
服务器版本为CentOS7 一、检查现有 swap 空间 sudo swapon --show如果系统中没有 swap 空间或者现有的 swap 空间不足,可以继续后续步骤来创建 swap 空间。 二、创建 swap 文件(推荐 2GB 作为示例) sudo dd if/dev/zero of/swapfile bs1M …...
OpenHarmony OS 5.0与Android 13显示框架对比
1. 架构概述 1.1 OpenHarmony OS 5.0架构 OpenHarmony OS 5.0采用分层架构设计,图形显示系统从底层到顶层包括: 应用层:ArkUI应用和第三方应用框架层:ArkUI框架、窗口管理API系统服务层:图形合成服务、窗口管理服务…...
详解Node.js中的setImmediate()函数
setImmediate() 是 Node.js 提供的一个定时器函数,用于在 事件循环的 “Check” 阶段 执行回调函数。它与 setTimeout() 相似,但两者有着显著的区别,主要体现在回调函数的执行时机上。 什么是事件循环(Event Loop) 在…...
使用C#写的HTTPS简易服务器
由于监控网络之用,需要写一个https服务器。 由于用到https,因此还需一个域名证书,可以免费申请,也可以用一个现有的。 接下来还需在Windows上安装证书,注册证书。 安装证书 找到证书,点击,一路…...
C# 事件知识文档
C# 事件知识文档 概述 在 C# 中,事件(Event) 是一种特殊的机制,它基于委托实现,用于支持发布-订阅模式。事件允许对象在发生特定操作时通知其他对象,而无需直接引用这些对象。这种机制非常适合于实现诸如用户界面交互、状态变化通知等场景。 核心概念 发布者(Publishe…...
C++进阶--二叉搜索树
文章目录 C进阶--二叉搜索树概念算法复杂度模拟实现结构定义插入查找删除剩余的次要接口中序遍历: 构造,析构,拷贝构造,赋值重载 结语 很高兴和大家见面,给生活加点impetus!!开启今天的编程之路…...
互联网大厂Java面试:从基础到进阶的技术点探讨
场景:赵大宝的面试旅程 在互联网大厂的面试现场,严肃的面试官李老师正在准备对求职者赵大宝进行一场Java技术栈的深度考核。赵大宝是一位以幽默著称的程序员,面试官希望通过这次面试能全面了解他的技术能力。 第一轮提问 李老师࿱…...
【MCP Node.js SDK 全栈进阶指南】中级篇(1):MCP动态服务器高级应用
前言 在初级篇中,我们已经掌握了MCP TypeScript-SDK的基础知识,包括开发环境搭建、基础服务器开发、资源开发、工具开发、提示模板开发以及传输层配置等核心内容。随着我们对MCP的理解不断深入,是时候进入更高级的应用场景了。 MCP的一个强大特性是其动态性,能够在运行时…...
LM35 温度传感器介绍
【本文基于Arduino项目】 1. LM35 温度传感器简介 LM35 是一款 精密模拟温度传感器,由德州仪器(TI)推出,具有线性输出、无需校准、低功耗等特点,广泛应用于环境监测、工业控制等领域。 主要特性 参数规格测量范围-…...
【网络应用程序设计】实验一:本地机上的聊天室
个人博客:https://alive0103.github.io/ 代码在GitHub:https://github.com/Alive0103/XDU-CS-lab 能点个Star就更好了,欢迎来逛逛哇~❣ 主播写的刚够满足基本功能,多有不足,仅供参考,还请提PR指正ÿ…...
Cursor 设置规则
文章目录 1、一个可以参考的网站-各种语言都有2、正向设置规则通过 符号还可以引用子规则 3、逆向设置规则 1、一个可以参考的网站-各种语言都有 https://cursor.directory/rules 2、正向设置规则 注意,最开始规则设置已经作废(下图下面的红框&#…...
人工智能-模型评价与优化(过拟合与欠拟合,数据分离与混淆矩阵,模型优化,实战)
欠拟合与过拟合 模型不合适,导致其无法与数据实现有效预测 欠拟合可以通过观察训练数据及时发现,通过优化模型结果解决 过拟合的原因: 1、模型结构过于复杂(维度太高) 2、使用了过多属性,模型训练时包含了…...
Python爬虫从入门到实战详细版教程
Python爬虫从入门到实战详细版教程 文章目录 Python爬虫从入门到实战详细版教程书籍大纲与内容概览第一部分:爬虫基础与核心技术1. 第1章:[爬虫概述](https://blog.csdn.net/qq_37360300/article/details/147431708?spm=1001.2014.3001.5501)2. 第2章:HTTP协议与Requests库…...
Java多线程编程初阶指南
目录 一.线程基础概念 线程是什么? 线程与进程对比 为啥要有线程 二.线程实现方式 继承Thread类 实现Runnable接口 常规实现方式 匿名内部类写法 Lambda表达式写法(Java8) 对比总结 三.Thread 类及常见方法 核心功能 核心构造方…...
Qt信号槽连接的三种方法对比
信号槽连接方法对比 1. 直接连接2. 集中管理3.函数指针初始化列表后期需要disconnect 对比 1. 直接连接 connect(codeWindow, &CodeEditorWindow::SetBaseLineSignal, monitoringWindow, &MonitoringWindow::SetBaseLineSlot),connect(&ButtonTree::Instance(), &a…...
健康生活新指南
在 “朋克养生” 与 “躺平焦虑” 并存的时代,真正的健康生活无需刻意 “内卷”。这几个简单又实用的养生妙招,能让你在忙碌日常中悄悄升级健康状态,轻松拥抱活力人生。 一、饮食:吃对食物,给身体 “加 Buff” 别…...
IF=24.5 靶向MMP9治疗协同提高抗PD1疗效
Targeted MMP9 therapy synergistically improves anti-PD1 efficacy CTNNB1GOF(The gain of function (GOF) CTNNB1 mutations,功能获得型CTNNB1突变)在肝细胞癌(HCC)中,已被证明与免疫排斥相关࿰…...
基于SpringBoot的中华诗词文化分享平台-项目分享
基于SpringBoot的中华诗词文化分享平台-项目分享 项目介绍项目摘要管理员功能图会员功能图系统功能图项目预览会员主页面诗词页面发布问题回复评论 最后 项目介绍 使用者:管理员、会员 开发技术:MySQLJavaSpringBootVue 项目摘要 本文旨在设计与实现一…...
SQLiteDatabase 增删改查(CRUD)详细操作
文章目录 1. 初始化数据库2. 插入数据 (Create)方法一:使用 ContentValues insert()方法二:直接执行SQL 3. 查询数据 (Read)方法一:使用 query() 方法方法二:使用 rawQuery() 执行原始SQL 4. 更新数据 (Update)方法一:…...
从 0 到 1 打通 AI 工作流:Dify+Zapier 实现工具自动化调用实战
一、引言:当 AI 遇到工具孤岛 在企业数字化转型的浪潮中,AI 工具的应用早已从单一的对话交互进阶到复杂的业务流程自动化。但开发者常常面临这样的困境:本地开发的 MCP 工具(如 ERP 数据清洗脚本、CRM 工单系统 API)如…...
第四届商师校赛 web 1
RceMe ezGame 伪装 Ping Are you from SQNU? Look for the homepage Through 根据题目慢慢试 File_download Post上传得到下载文件 反编译一下 /* * Decompiled with CFR 0.152. * * Could not load the following classes: * javax.servlet.http.HttpServlet */ …...
SSH 互信被破坏能导致 RAC 异常关闭吗
一、 SSH 互信和 RAC 的关系 1、SSH 互信对 RAC 的作用 Oracle 11g R2 在安装 Grid Infrastructure 的时候,能够通过安装程序配置节 点间的 SSH 用户等效性,之所以要在安装之前配置 SSH 用户等效性,是为了能 够在安装前使用 C…...