【Qt之QTextDocument】使用及表格显示富文本解决方案

【Qt之QTextDocument】使用

      • 描述
      • 常用方法及示例
      • 使用QTextList
      • 使用QTextBlock
      • 使用QTextTable
      • 表格显示富文本
      • 结论

描述

QTextDocument类保存格式化的文本。
QTextDocument是结构化富文本文档的容器,支持样式文本和各种文档元素,如列表、表格、框架和图像。它们可以用于创建QTextEdit,也可以单独使用。
每个文档元素由一个相关的格式对象描述。每个格式对象都被QTextDocuments视为唯一的对象,并且可以通过objectForFormat()传递以获取应用于它的文档元素。
可以使用QTextCursor以编程方式编辑QTextDocument,并通过遍历文档结构来检查其内容。整个文档结构都存储在根框架下的文档元素层次结构中,可以使用rootFrame()函数找到。或者,如果只想迭代文档的文本内容,可以使用begin()end()findBlock()检索文本块,以便检查和迭代。
文档的布局由documentLayout()确定;如果要使用自己的布局逻辑,则可以创建自己的QAbstractTextDocumentLayout子类,并使用setDocumentLayout()设置它。可以通过调用metaInformation()函数获取文档的标题和其他元信息。对于通过QTextEdit类向用户公开的文档,文档标题也可以通过QTextEdit::documentTitle()函数获得。
toPlainText()toHtml()便利函数允许以纯文本HTML格式检索文档的内容。可以使用find()函数搜索文档的文本。
可以使用setUndoRedoEnabled()函数控制对文档执行的操作的撤消/重做。通过undo()redo()插槽可以控制撤消/重做系统;文档还提供了contentsChanged()undoAvailable()redoAvailable()信号,通知连接的编辑器部件有关撤消/重做系统的状态。
以下是QTextDocument的撤消/重做操作:

  • 插入或删除字符。在同一文本块内插入或删除的序列被视为单个撤消/重做操作。
  • 插入或删除文本块。在单个操作中的插入或删除序列(例如通过选择然后删除文本)被视为单个撤消/重做操作。
  • 文本字符格式更改。
  • 文本块格式更改。
  • 文本块组格式更改。

常用方法及示例

  1. void addResource(int type, const QUrl &name, const QVariant &resource) : 添加资源。将资源资源添加到资源缓存中,使用类型和名称作为标识符。type应该是QTextDocument::ResourceType中的值。
  2. QVariant resource(int type, const QUrl &name) const : 获取资源。从具有给定名称的资源返回指定类型的数据。
    富文本引擎调用这个函数来请求没有直接存储在QTextDocument中,但仍然与之关联的数据。例如,图像通过QTextImageFormat对象的name属性间接引用。
    资源在文档内部缓存。如果在缓存中找不到资源,则调用loadResource来尝试加载该资源。然后loadResource应该使用addResource将资源添加到缓存中。
    QTextDocument* doc = ui->textEdit->document();QImage image(":/images/xxx.png");doc->addResource(QTextDocument::ImageResource, QUrl("qrc:/images/xxx.png"), QVariant(image));// 在文档中插入图像QTextCursor cursor(doc);cursor.insertImage(doc->resource(QTextDocument::ImageResource, QUrl("qrc:/images/xxx.png")).value<QImage>());

使用addResource()方法的好处主要包括:

  • 方便管理:该方法允许您将资源(如样式表、图像等)添加到文档中,并将其存储在内存中,以便在需要时进行访问。这样可以使资源的管理更加集中和方便。
  • 提高效率:通过将资源添加到文档中,您可以在整个文档中重复使用这些资源,而无需每次都从磁盘或网络中加载。这可以减少加载时间,提高应用程序的响应速度。
  • 易于维护:使用addResource()方法将资源添加到文档中,可以使应用程序的资源管理更加清晰和有序。这使得资源的更新和替换变得更加简单,因为您只需在文档中修改相应的资源即可。
  • 支持重用:通过将资源添加到文档中,您可以轻松地在不同的应用程序或文档中使用相同的资源。这有助于减少重复代码,提高代码的可重用性。
  • 支持动态内容:addResource()方法允许您根据需要动态添加和更新资源。这使得在运行时根据用户交互或其他事件动态更改文档内容变得更加容易。
  1. QTextBlock begin() const : 返回文档的第一个文本块。
  2. QTextBlock end() const : 该函数返回一个块,用于在迭代文档时测试文档的结尾。返回的块是无效的,并且表示文档中最后一个块之后的块。您可以使用lastBlock()来检索文档的最后一个有效块。
for (QTextBlock it = doc->begin(); it != doc->end(); it = it.next())qDebug().noquote() << it.text();
  1. QTextBlock firstBlock() const : 返回文档的第一个文本块内容。
  2. QTextBlock lastBlock() const : 返回文档的最后一个文本块内容。
doc->firstBlock().text();
doc->lastBlock().text();
  1. bool QTextDocument::isEmpty() const : 如果文档为空,返回true;否则返回false。
  2. bool QTextDocument::isRedoAvailable() const : 如果可重做,则返回true;否则返回false。
  3. bool QTextDocument::isUndoAvailable() const : 如果可撤消,则返回true;否则返回false。
  4. QTextBlock QTextDocument::lastBlock() const : 返回文档的最后一个(有效的)文本块。
  5. int QTextDocument::lineCount() const : 返回此文档的行数(如果布局支持此项)。否则,这与块数相同。
doc->isEmpty();
  1. 枚举:enum QTextDocument::FindFlag
  2. 获取枚举值:flags QTextDocument::FindFlags
    这个enum描述QTextDocumentfind函数可用的选项。这些选项可以从以下列表中进行OR-ed组合:
常量描述解释
QTextDocument::FindBackward0x00001Search backwards instead of forwards.向后搜索而不是向前搜索。
QTextDocument::FindCaseSensitively0x00002By default find works case insensitive. Specifying this option changes the behaviour to a case sensitive find operation.默认情况下,find不区分大小写。指定此选项会将行为更改为区分大小写的查找操作。
QTextDocument::FindWholeWords0x00004Makes find match only complete words.使查找只匹配完整的单词。
  1. QTextCursor find(const QString &subString, const QTextCursor &cursor, FindFlags options = FindFlags()) const
    查找给定字符串 subStringcursor 所代表的文本中的位置,返回一个文本光标,该光标指向找到的文本。如果未找到匹配的字符串,则返回一个空的光标。可以设置查找选项 options,例如大小写敏感、全字匹配等。
  2. QTextCursor find(const QString &subString, int position = 0, FindFlags options = FindFlags()) const
    查找给定字符串 subString 在当前文本中的指定位置 position 处开始查找,返回一个文本光标,该光标指向找到的文本。如果未找到匹配的字符串,则返回一个空的光标。可以设置查找选项 options,例如大小写敏感、全字匹配等。
  3. QTextCursor find(const QRegExp &expr, int from = 0, FindFlags options = FindFlags()) const
    使用正则表达式 expr 在当前文本中的指定位置 from 处开始查找,返回一个文本光标,该光标指向找到的文本。如果未找到匹配的字符串,则返回一个空的光标。可以设置查找选项 options,例如大小写敏感、全字匹配等。
  4. QTextCursor find(const QRegExp &expr, const QTextCursor &cursor, FindFlags options = FindFlags()) const
    使用正则表达式 exprcursor 所代表的文本中的位置查找,返回一个文本光标,该光标指向找到的文本。如果未找到匹配的字符串,则返回一个空的光标。可以设置查找选项 options,例如大小写敏感、全字匹配等。
  5. QTextCursor find(const QRegularExpression &expr, int from = 0, FindFlags options = FindFlags()) const
    使用正则表达式 expr 在当前文本中的指定位置 from 处开始查找,返回一个文本光标,该光标指向找到的文本。如果未找到匹配的字符串,则返回一个空的光标。可以设置查找选项 options,例如大小写敏感、全字匹配等。
  6. QTextCursor find(const QRegularExpression &expr, const QTextCursor &cursor, FindFlags options = FindFlags()) const
    使用正则表达式 exprcursor 所代表的文本中的位置查找,返回一个文本光标,该光标指向找到的文本。如果未找到匹配的字符串,则返回一个空的光标。可以设置查找选项 options,例如大小写敏感、全字匹配等。
    QTextDocument* pDoc = ui->textEdit->document();pDoc->setPlainText("helloworld");QTextCursor cursor = ui->textEdit->textCursor();cursor.insertText("\n");cursor.insertText("earth");cursor.insertText("\n");cursor.insertText("sun");// 输出查找到的位置,从后往前查找qDebug() << pDoc->find(QRegularExpression("ear"), cursor.position(), QTextDocument::FindBackward).position();// 以下查找到会自动选择匹配到的ui->textEdit->find("ear", QTextDocument::FindBackward);

在这里插入图片描述
在这里插入图片描述

  1. 枚举:enum QTextDocument::MetaInformation
    这个枚举描述了可以添加到文档中的不同类型的元信息。
常量描述解释
QTextDocument::DocumentTitle0The title of the document.文件的标题。
QTextDocument::DocumentUrl1The url of the document. The loadResource() function uses this url as the base when loading relative resources.文档的url。loadResource()函数在加载相关资源时使用此url作为基。
  1. QString metaInformation(MetaInformation info) const
  2. void setMetaInformation(MetaInformation info, const QString &string) : 将由info指定的类型的文档元信息设置为给定的字符串。
    pDoc->setMetaInformation(QTextDocument::DocumentTitle, "helloworld");qDebug() << pDoc->metaInformation(QTextDocument::DocumentTitle);

在这里插入图片描述
23. 获取文本块数目、行数、是否编辑、是否为空等操作

    // 文本块数目qDebug() << pDoc->blockCount();// 行数qDebug() << pDoc->lineCount();// 是否是空qDebug() << pDoc->isEmpty();// 是否编辑qDebug() << pDoc->isModified();// 是否执行RedoqDebug() << pDoc->isRedoAvailable();// 是否执行UndoqDebug() << pDoc->isUndoAvailable();// Undo和Redo是否使能qDebug() << pDoc->isUndoRedoEnabled();

在这里插入图片描述
24. void setHtml(const QString &html)

pDoc->setHtml("<p style='color:#ff0000;'>helloworld</p>");

在这里插入图片描述
25. void setPlainText(const QString &text)
使用此方法,会将textEdit.setTextColor()方法设置的文本颜色失效。

pDoc->setPlainText("helloworld");

在这里插入图片描述

使用QTextList

    QTextDocument* pDoc = ui->textEdit->document();pDoc->setPlainText("helloworld\n");QTextCursor cursor(pDoc);QTextListFormat listFormat;listFormat.setStyle(QTextListFormat::ListDecimal); // 使用有序列表QTextList * pList = cursor.insertList(listFormat);cursor.insertText("Item 1\n");cursor.insertText("Item 2\n");cursor.insertText("Item 3");QTextList* list = cursor.currentList();qDebug() << list->count();if (list) {QTextBlock currentItem = list->item(0);// 处理列表中的第一个项QString text = currentItem.text();qDebug() << text;}

在这里插入图片描述

使用QTextBlock

    QTextDocument* pDoc = ui->textEdit->document();QTextCursor cursor(pDoc);cursor.insertText("\n");cursor.insertText("Hello, World!");QTextBlock currentBlock = pDoc->firstBlock();while (currentBlock.isValid()) {QString text = currentBlock.text();// 处理当前段落的文本内容qDebug() << text;currentBlock = currentBlock.next();}

在这里插入图片描述
在这里插入图片描述

使用QTextTable

    QTextDocument* pDoc = ui->textEdit->document();// pDoc->setPlainText("helloworld\n");QTextCursor cursor(pDoc);QTextTableFormat tableFormat;tableFormat.setBorder(1);tableFormat.setCellPadding(5);tableFormat.setAlignment(Qt::AlignCenter);cursor.insertTable(3, 2, tableFormat);QTextTable* table = cursor.currentTable();if (table) {for (int row = 0; row < table->rows(); ++row) {for (int col = 0; col < table->columns(); ++col) {QTextTableCell cell = table->cellAt(row, col);QTextCursor cellCursor = cell.firstCursorPosition();cellCursor.insertText(QString("Row %1, Col %2").arg(row).arg(col));}}}

在这里插入图片描述

表格显示富文本

QTableWidget是Qt框架提供的一个用于显示表格数据的控件。然而,QTableWidget本身并不直接支持富文本(rich text)的显示。如果需要在QTableWidget中显示富文本,一种方法是使用QTableWidgetItemsetData方法,将富文本作为自定义数据存储在表格中,然后在单元格的渲染过程中使用自定义的QStyledItemDelegate 来显示这些数据。

#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QTextDocument>
#include <QTextCharFormat>
#include <QTextCursor>
#include <QStyledItemDelegate>class RichTextDelegate : public QStyledItemDelegate {
public:explicit RichTextDelegate(QTableWidget* pTW){m_pTW = pTW;}
public:void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {QTableWidgetItem *item = m_pTW->item(index.row(), index.column());if (item) {QTextDocument doc;doc.setHtml(item->data(Qt::UserRole).toString());doc.drawContents(painter);}}private:QTableWidget*   m_pTW;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);QTableWidget table;table.setColumnCount(1);table.setRowCount(3);table.setItemDelegateForColumn(0, new RichTextDelegate(&table));// 添加富文本数据到表格中QTableWidgetItem *item1 = new QTableWidgetItem;item1->setData(Qt::UserRole, "<h1>标题1</h1><p>段落1</p>");table.setItem(0, 0, item1);QTableWidgetItem *item2 = new QTableWidgetItem;item2->setData(Qt::UserRole, "<h1>标题2</h1><p>段落2</p>");table.setItem(1, 0, item2);table.show();return app.exec();
}
  • 创建了一个自定义的RichTextDelegate类,继承自QTableWidgetItemDelegate
  • paint方法中,检查每个表格项的数据,如果存在自定义的富文本数据(存储在Qt::UserRole),则使用QTextDocument来渲染这些数据。
  • 将这个自定义委托设置为表格的第一列的代理。

在这里插入图片描述

结论

只要未来可期,今天就值得欣喜

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

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

相关文章

手把手教你安装 Visual Studio 2022 及其简单使用

软件下载 打开 Visual Studio 官网&#xff0c;个人选择免费的Community社区版就够用了。 软件安装 双击运行安装程序&#xff1a; 点击继续 即可&#xff1a; 等待加载完成&#xff1a; 可以看到 Visual Studio 2022 对应不同的开发需求提供了若干工作负载&#xff0c;这里以…

​3ds Max插件CG MAGIC图形板块为您提升线条效率!

​通过3ds Max软件进行绘图操作时&#xff0c;大多绊住各位设计师们作图速度的往往都是一些细微的琐事&#xff0c;重复一变一变的调整修改等问题。 今天说到这个绘图线条来回调整解决方法就是3ds Max插件CG MAGIC。 Max插件CG MAGIC作为一款智能化的辅助插件&#xff0c;致力于…

flutter编译和构建鸿蒙应用程序(windows环境)

flutter编译和构建鸿蒙应用程序&#xff08;windows环境&#xff09; 问题背景 针对 OpenHarmony 的 Flutter 版本已经开源&#xff0c;参考 https://gitee.com/openharmony-sig/flutter_flutter。 本文为实践该流程&#xff0c;实现flutter打包鸿蒙hap包的流程。目前流程已经…

Ps:画笔工具的基本操作

画笔工具 Brush Tool是 Ps 中最常用的工具&#xff0c;广泛地用于绘画与修饰工作。 虽然多数操作可在画笔工具的工具选项栏中选择执行&#xff0c;但是如果能记住相应的快捷键可大大提高工作效率。 熟练掌握画笔工具的操作对于使用其他工具也非常有益&#xff0c;因为 Ps 中许多…

CSS-长度单位篇

px&#xff1a;像素em&#xff1a;相对元素font-size的倍数rem&#xff1a;相对根字体大小&#xff0c;html标签就是根%&#xff1a;相对父元素计算 注意&#xff1a;CSS中设置长度&#xff0c;必须加单位&#xff0c;否则样式无效&#xff01;

Maven - 打包之争:Jar vs. Shade vs. Assembly

文章目录 Pre概述Jar 打包方式_maven-jar-pluginOverview使用官方文档 Shade 打包方式_maven-shade-pluginOverview使用将部分jar包添加或排除将依赖jar包内部资源添加或排除自动将所有不使用的类排除将依赖的类重命名并打包进来 &#xff08;隔离方案&#xff09;修改包的后缀…

【自主探索】基于 frontier_exploration 的单个机器人自主探索建图

文章目录 一、概述1、功能2、要求 二、使用方法1、用于运行演示2、用于开发人员2.1. 探索无/地图数据2.2. 使用 /map 数据进行探索 三、提供的组件1、explore_client1.1. 调用的操作1.2. 订阅主题1.3. 发布主题 2、explore_server2.1. 提供的操作2.2. 调用的操作2.3. 调用的服务…

web前端开发基础----标准流布局和非标准流布局

1&#xff0c;标准流布局 标准流&#xff0c;也称文档流或普通流&#xff0c;是所有元素默认的布局方式。 在标准流中&#xff0c;元素按照其在 HTML 中出现的顺序&#xff0c;自上而下依次排列&#xff0c;并占据其父容器内的可用空间。 标准流中的元素按照其自然尺寸和位置进…

uniapp实现多时间段设置

功能说明&#xff1a; 1 点击新增时间&#xff0c;出现一个默认时间段模板&#xff0c;不能提交 2 点击“新增时间文本”&#xff0c;弹出弹窗&#xff0c;选择时间&#xff0c;不允许开始时间和结束时间同时为00:00&#xff0c; <view class"item_cont"> …

TCP/IP协议:最流行的电子邮件协议SMTP(简单邮件传输协议)详解

SMTP 是一种电子邮件协议&#xff0c;用于通过互联网从一个电子邮件帐户向另一个电子邮件帐户发送电子邮件。它是TCP/IP协议应用层的一部分。作为一种电子邮件协议&#xff0c;它建立了不同电子邮件客户端和帐户之间轻松信息交换的规则。这样&#xff0c;简单邮件传输协议就可以…

ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用

ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用 HarmonyOS,作为一款全场景分布式操作系统,为了推动更广泛的应用开发,采用了一种先进而灵活的编程语言——ArkTS。ArkTS是在TypeScript(TS)的基础上发展而来,为HarmonyOS提供了丰富的应用开发工具,使开…

Educational Codeforces Round 158 (Rated for Div. 2)(A~E)(贪心,树形DP)

A - Line Trip 题意&#xff1a;有一条路&#xff0c;可以用一条数线来表示。你位于数线上的点 0 &#xff0c;你想从点 0 到点 x &#xff0c;再回到点 0。你乘汽车旅行&#xff0c;每行驶 1个单位的距离要花费 1 升汽油。当您从点 0出发时&#xff0c;汽车已加满油(油箱中的…

麒麟linux离线安装dotnet core

1. 下载 dotnet core,以3.1为例 下载地址: 下载 .NET Core 3.1 (Linux、macOS 和 Windows) 查看linux cpu类型,然后根据类型下载 uname -m #结果是: aarch64 2. 放到指定目录,比如:/usr/dotnet 3. 解压dotnet-sdk-3.1.426-linux-arm64.tar.gz cd /usr/dotnet tar –zxvf a…

Ubuntu 22.04.3编译AOSP13刷机

文章目录 设备信息下载AOSP并切换分支获取设备驱动编译系统编译遇到的问题Cannot allocate memoryUbuntu设置USB调试刷机参考链接 设备信息 手机&#xff1a;Pixel 4XL 下载AOSP并切换分支 在清华大学开源软件镜像站下载初始化包aosp-latest.tar。 解压缩&#xff0c;切换到…

解决LocalDateTime传输前端为时间的数组

问题出现如下&#xff1a; 问题出现原因&#xff1a; 默认序列化情况下会使用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。使用这个解析时就会打印出数组。 解决方法&#xff1a; 我在全文搜索处理方法总结如下&#xff1a; 1.前端自定义函数来书写 ,cols: [[ //表头{…

Langchain的Agents介绍

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Redis -- 介绍

1、NoSQL: 指的是非关系型数据库&#xff0c;主要分成四大类&#xff1a;键值存储数据库、列存储数据库、文档型数据库、图形数据库。 2、什么是Redis&#xff1a; Redis是一种基于内存的数据库&#xff0c;一般用于做缓存的中间件。 3、Redis的主要的特点&#xff1a; 1、Rd…

一、TIDB基础

TIDB整个逻辑架构跟MYSQL类似&#xff0c;如下&#xff1a; TIDB集群&#xff1a;相当于MYSQL的数据库服务器&#xff0c;区别是MYSQL数据库服务器为单进程的&#xff0c;TIDB集群为分布式多进程的。 数据库&#xff1a;同MYSQL数据库&#xff0c;数据库属于集群&#xff0c;…

SSL握手失败的解决方案

一、SSL握手失败的原因&#xff1a; 1&#xff0c;证书过期&#xff1a;SSL证书有一个有效期限&#xff0c;如果证书过期&#xff0c;就会导致SSL握手失败。 2&#xff0c;证书不被信任&#xff1a;如果网站的SSL证书不被浏览器或操作系统信任&#xff0c;也会导致SSL握手失败…

线性代数的艺术

推荐一本日本网友Kenji Hiranabe写的《线性代数的艺术》。这本书是基于MIT大牛Gilbert Strang教授的《每个人的线性代数》制作的。 虽然《线性代数的艺术》这本书仅仅只有12页的内容&#xff0c;就把线性代数的重点全画完了&#xff0c;清晰明了。 《线性代数的艺术》PDF版本&…