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

news2024/11/15 6:52:49

【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();
    // 是否执行Redo
    qDebug() << pDoc->isRedoAvailable();
    // 是否执行Undo
    qDebug() << 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.coloradmin.cn/o/1249592.html

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

相关文章

oled的使用 动态的变量 51

源码均在IIC手写程序中 外部中断实现变量加一 #include "reg52.h" #include "main.h" #include <intrins.h> #include "OLED.h" #include "bmp.h" #include "Delay.h" sbit LED1 P1^0; sbit LED2 P1^1; sbit LED3…

项目实战详细讲解带有条件响应的 SQL 盲注、MFA绕过技术、MFA绕过技术、2FA绕过和技巧、CSRF绕过、如何寻找NFT市场中的XSS漏洞

项目实战详细讲解带有条件响应的 SQL 盲注、MFA绕过技术、MFA绕过技术、2FA绕过和技巧、CSRF绕过、如何寻找NFT市场中的XSS漏洞。 带有条件响应的 SQL 盲注 这篇文章的核心要点如下: 漏洞发现:作者在Portswigger提供的实验室中发现了一个盲SQL注入漏洞。这个漏洞存在于一个应…

【前端】数据行点击选择

前言 【前篇文章】说了,我们公司的核心价值就是让人越来越懒,能怎么便捷就怎么便捷,主打一个简单实用又快捷,为了实现这个目标,我看成这个列表陷入了深思在想,要不要子表的数据加载在点击这个行时,就可以展示数据,这样就不用每次都要点那个小圆圈啦。 查资料 这显然…

2、git进阶操作

2、git进阶操作 2.1.1 分支的创建 命令参数含义git branch (git checkout -b)<new_branch> <old_branch>表示创建分支-d <-D>删除分支 –d如果分支没有合并&#xff0c;git会提醒&#xff0c;-D强制删除-a -v查看分支-m重新命名分支commit id从指定的commi…

centos 7.9 下利用miniconda里的pyinstaller打包python程序为二进制文件操作方法

centos 7.9 下利用miniconda里的pyinstaller打包python程序为二进制文件操作方法 一.centos 7.9 操作系统安装 参考&#xff1a;https://blog.csdn.net/qq_46015509/article/details/134572030?utm_sourceminiapp_weixin 安装完成后用后台连接工具连上虚拟机 二.安装python3 …

「Verilog学习笔记」数据串转并电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 关于什么是Valid/Ready握手机制&#xff1a; 深入 AXI4 总线&#xff08;一&#xff09;握手机制 - 知乎 时序图含有的信息较多&#xff0c;观察时序图需要注意&#xff1a…

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

文章目录 一、rrt_exploration 介绍1、原理2、主要思想3、拟解决的问题4、优缺点 二、安装环境三、安装与运行1、安装2、运行 四、配置自己的机器人1、Robots Network2、Robots frame names in tf3、Robots node and topic names4、Setting up the navigation stack on the rob…

芯能科技-603105 三季报分析(20231123)

芯能科技-603105 基本情况 公司名称&#xff1a;浙江芯能光伏科技股份有限公司 A股简称&#xff1a;芯能科技 成立日期&#xff1a;2008-07-09 上市日期&#xff1a;2018-07-09 所属行业&#xff1a;电气机械和器材制造业 周期性&#xff1a;1 主营业务&#xff1a;分布式光伏解…

计算机思考与整理

应用程序 虚拟机 windows,linux等操作系统&#xff08;向上层应用程序提供接口&#xff09; x86架构&#xff0c;MIPS&#xff0c;ARM(提供指令集) 硬件组件 硬件组件&#xff08;hardware components&#xff09;是指构成计算机或电子设备的实体部分&#xff0c;它们包括各…

数据结构-归并排序+计数排序

1.归并排序 基本思想&#xff1a; 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列段间有序。若将两个有序表合并成一个…

机器人规划算法——movebase导航框架源码分析

这里对MoveBase类的类成员进行了声明&#xff0c;以下为比较重要的几个类成员函数。 构造函数 MoveBase::MoveBase | 初始化Action 控制主体 MoveBase::executeCb收到目标&#xff0c;触发全局规划线程&#xff0c;循环执行局部规划 全局规划线程 void MoveBase::planThread |…

大模型推理加速框架vllm部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

CVE-2023-22515:Atlassian Confluence权限提升漏洞复现 [附POC]

文章目录 Atlassian Confluence权限提升(CVE-2023-22515)漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 Atlassian Confluence权限提升(CVE-2023-22515)漏洞复现 [附POC] 0x01 前言 免责声明&…

C练习题_3

一、单项选择题&#xff08;本大题共20小题&#xff0c;每小题2分&#xff0c;共40分。在每小题给出的四个备选项中,选出一个正确的答案&#xff0c;并将所选项前的字母填写在答题纸的相应位置上。 以下正确的C语言自定义标识符是() A. la B. 2a C. do D. a.12 2.在C语言中,错…

【libGDX】Mesh纹理贴图

1 前言 纹理贴图的本质是将图片的纹理坐标与模型的顶点坐标建立一一映射关系。纹理坐标的 x、y 轴正方向分别朝右和朝下&#xff0c;如下。 2 纹理贴图 本节将使用 Mesh、ShaderProgram、Shader 实现纹理贴图&#xff0c;OpenGL ES 的实现见博客 → 纹理贴图。 DesktopLauncher…

Matplotlib图形注释_Python数据分析与可视化

Matplotlib图形注释 添加注释文字、坐标变换 有的时候单单使用图形无法完整清晰的表达我们的信息&#xff0c;我们还需要进行文字进行注释&#xff0c;所以matplotlib提供了文字、箭头等注释可以突出图形中重点信息。 添加注释 为了使我们的可视化图形让人更加容易理解&#…

软件测试职业规划导图

公司开发的产品专业性较强&#xff0c;软件测试人员需要有很强的专业知识&#xff0c;现在软件测试人员发展出现了一种测试管理者不愿意看到的景象&#xff1a; 1、开发技术较强的软件测试人员转向了软件开发(非测试工具开发)&#xff1b; 2、业务能力较强的测试人员转向了软件…

C++初级项目webserver项目流程介绍(2)

一、引言 C的webserver项目是自己在学完网络编程后根据网课的内容做的一个初级的网络编程项目。 这个项目的效果是可以在浏览器通过输入网络IP地址和端口&#xff0c;然后打开对应的文件目录 效果如下&#xff1a; 也可以打开文件夹后点击目录&#xff0c;打开到对应的文件夹…

北京劲松HPV诊疗中心专业分析:扁平疣有什么特征?

扁平疣是一种常见的皮肤疾病&#xff0c;具有传染性&#xff0c;其主要特征包括皮肤出现扁平的丘疹、轻微瘙痒、好发于青少年等。今日特邀北京劲松HPV诊疗中心主任谭巍将详细介绍扁平疣的特征&#xff0c;希望借此能提高大众认知水平&#xff0c;以更好预防。 年轻漂亮的小芳是…

一体化污水处理设备各种材质的优缺点

一体化污水处理设备的材质有多种&#xff0c;包括不锈钢、玻璃钢、聚乙烯塑料、碳钢等。每种材质都有其独特的优点和缺点。 不锈钢材质的优点是防腐性能好&#xff0c;耐磨损&#xff0c;使用寿命长&#xff0c;且外观美观。其缺点是成本较高&#xff0c;不适合在一些特殊的环…