【Qt开发流程】之富文本处理

news2025/1/15 23:48:02

描述

Scribe框架提供了一组类,用于读取和操作结构化的富文本文档。与Qt中以前的富文本支持不同,新的类集中在QTextDocument类上,而不是原始文本信息。这使开发者能够创建和修改结构化的富文本文档,而不必准备中间标记格式的内容。

文档中的信息可以通过两个互补的接口访问:基于光标的接口用于编辑只读分层接口提供文档结构的高层次概述。基于光标的接口的主要优点是,可以使用模拟用户与编辑器交互的操作编辑文本,而不会丢失文档的基础结构。只读分层接口在执行搜索和文档导出等操作时最有用。

Qt中,富文本处理可以使用QTextEditQTextBrowser实现。这两个类都继承自QAbstractScrollArea类,提供了文本的显示和编辑功能。

QTextEdit提供了类似于一个文本编辑器的界面,可以进行编辑和显示富文本。需要注意的是,QTextEdit可以显示图片和嵌入式对象,但不能直接播放音频和视频。

QTextBrowser提供了一个只读的文本显示界面,可以用于显示富文本内容。与QTextEdit不同,QTextBrowser只支持显示图片,不支持嵌入式对象。

Qt中实现富文本处理的流程:

  1. 创建QTextEditQTextBrowser对象,设置其属性和初始文本内容;

  2. 使用QTextCursor操作文本内容,如插入文本、设置字体和颜色、插入图片等;

  3. 将富文本内容保存到文件或使用QClipboard复制到剪贴板中;

  4. 在需要的位置显示富文本内容,如在某个对话框中、在网页中等。

示例代码实现在QTextEdit中插入一张图片和设置不同的字体和颜色:
注意:在使用插入图片功能时,需要将图片资源添加到Qt项目中,并使用相应的路径引用。

    ui->textEdit->setPlainText("Hello World!");  //设置初始文本内容
    ui->textEdit->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard); //设置文本可选中属性为false

    QTextCursor cursor = ui->textEdit->textCursor(); //获取文本光标
    cursor.insertImage(":/images/image.png"); //插入图片

    QFont font("Arial", 16, QFont::Bold); //设置字体
    cursor.movePosition(QTextCursor::End); //将光标移动到文本结尾
    QTextCharFormat format;
    format.setFont(font);
    cursor.insertText("\nQt is great!", format); //插入文本并设置字体

    QColor color(Qt::red); //设置颜色
    cursor.movePosition(QTextCursor::Start); //将光标移动到文本开头
    cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 5); //选中第一个单词
//    cursor.setCharFormat(QTextCharFormat()); //清除之前的格式
//    cursor.setCharFormat(QTextCharFormat(), QTextCharFormat::ForegroundBrush); //设置前景色
    ui->textEdit->setTextCursor(cursor);

在这里插入图片描述

富文本相关类

Qt提供了大量的类来解析、渲染、操作和编辑富文本。

模块描述解释
QAbstractTextDocumentLayoutAbstract base class used to implement custom layouts for QTextDocuments用于为QTextDocuments实现自定义布局的抽象基类
QFontSpecifies a font used for drawing text指定用于绘制文本的字体
QSyntaxHighlighterAllows you to define syntax highlighting rules, and in addition you can use the class to query a document’s current formatting or user data允许定义语法高亮规则,并且还可以使用该类查询文档的当前格式或用户数据
QTextCursorOffers an API to access and modify QTextDocuments提供访问和修改QTextDocuments的API
QTextDocumentHolds formatted text维护格式化的文本
QTextDocumentFragmentRepresents a piece of formatted text from a QTextDocument表示来自QTextDocument的格式化文本片段
QTextDocumentWriterFormat-independent interface for writing a QTextDocument to files or other devices用于将QTextDocument写入文件或其他设备的格式无关接口
QTextBlockFormatFormatting information for blocks of text in a QTextDocumentQTextDocument中文本块的格式信息
QTextCharFormatFormatting information for characters in a QTextDocumentQTextDocument中字符的格式信息
QTextFormatFormatting information for a QTextDocumentQTextDocument的格式信息
QTextFrameFormatFormatting information for frames in a QTextDocumentQTextDocument中框架的格式信息
QTextImageFormatFormatting information for images in a QTextDocumentQTextDocument中图像的格式信息
QTextLengthEncapsulates the different types of length used in a QTextDocument封装在QTextDocument中使用的不同类型的长度
QTextListFormatFormatting information for lists in a QTextDocumentQTextDocument中列表的格式信息
QTextTableCellFormatFormatting information for table cells in a QTextDocumentQTextDocument中表单元格的格式信息
QTextTableFormatFormatting information for tables in a QTextDocumentQTextDocument中表格的格式信息
QTextInlineObjectRepresents an inline object in a QAbstractTextDocumentLayout and its implementations表示QAbstractTextDocumentLayout及其实现中的内联对象
QTextLayoutUsed to lay out and render text用于布局和呈现文本
QTextLineRepresents a line of text inside a QTextLayout表示QTextLayout内的一行文本
QTextListDecorated list of items in a QTextDocumentQTextDocument中装饰了的列表项
QTextBlockContainer for text fragments in a QTextDocumentQTextDocument中文本片段的容器
QTextBlockGroupContainer for text blocks within a QTextDocumentQTextDocument中文本块的容器
QTextBlockUserDataUsed to associate custom data with blocks of text用于将自定义数据与文本块关联
QTextFragmentHolds a piece of text in a QTextDocument with a single QTextCharFormat在QTextDocument中保留具有单个QTextCharFormat的文本片段
QTextFrameRepresents a frame in a QTextDocument表示QTextDocument中的框架
QTextObjectBase class for different kinds of objects that can group parts of a QTextDocument together不同类型的对象的基类,这些对象可以将QTextDocument的部分组合在一起
QTextFrame::iteratorIterator for reading the contents of a QTextFrame用于读取QTextFrame内容的迭代器
QTextBlock::iteratorQTextBlock::iterator class provides an iterator for reading the contents of a QTextBlockQTextBlock::iterator类为读取QTextBlock内容提供迭代器
QTextOptionDescription of general rich text properties通用富文本属性的描述
QTextTableRepresents a table in a QTextDocument表示QTextDocument中的表格
QTextTableCellRepresents the properties of a cell in a QTextTable表示QTextTable中单元格的属性
QPlainTextDocumentLayoutImplements a plain text layout for QTextDocument为QTextDocument实现纯文本布局
QPlainTextEditWidget that is used to edit and display plain text用于编辑和显示纯文本的小部件
QTextBrowserRich text browser with hypertext navigation富文本浏览器,带有超文本导航
QTextEditWidget that is used to edit and display both plain and rich text用于编辑和显示纯文本和富文本的小部件

QTextEdit的cursor和document关系图

在这里插入图片描述

Documen框架图

在这里插入图片描述

QTextFrame

    QTextDocument* doc = ui->textEdit->document();
    QTextFrame* frame = doc->rootFrame();
    QTextFrameFormat format;
    format.setBorderBrush(Qt::red);
    format.setBorder(3);
    frame->setFrameFormat(format);

运行程序,发现只可以在红色边框内编辑。
在这里插入图片描述
使用光标类对象,在根框架中添加一个子框架。

    QTextFrameFormat frameFormat;
    frameFormat.setBackground(Qt::lightGray);
    frameFormat.setMargin(10);
    frameFormat.setPadding(10);
    frameFormat.setBorder(2);
    frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);
    QTextCursor cursor = ui->textEdit->textCursor();
    cursor.insertFrame(frameFormat);

显示如下:
在这里插入图片描述

文本块

绑定信号和槽,输出文本块,以下只可获取文本块,不可获取frame的内容。

void MainWindow::on_action_frame_triggered()
{
    QTextDocument* doc = ui->textEdit->document();
    QTextFrame* frame = doc->rootFrame();
    QTextFrame::iterator it = frame->begin();
    while (!it.atEnd()) {
        QTextFrame* childFrame = it.currentFrame();
        QTextBlock childBlock = it.currentBlock();
        if(childFrame)
        {
            qDebug() << "frame";
        }else if(childBlock.isValid()){
            qDebug() << "block :" << childBlock.text();
        }

        ++it;
    }
}

显示如下:
在这里插入图片描述
在这里插入图片描述
获取frame的内容:

void MainWindow::on_actionframeText_triggered()
{
   QTextDocument* doc = ui->textEdit->document();
   QTextBlock block = doc->firstBlock();
   for (int var = 0; var < doc->blockCount(); ++var) {
       qDebug() << block.text();

       block = block.next();
   }

}

界面及结果:
在这里插入图片描述
在这里插入图片描述

QTextBlockFormat和QTextCharFormat

QTextBlockFormat:设置对齐方式、缩进等格式;
QTextCharFormat:设置字体、颜色、下划线等格式。

    QTextBlockFormat blockFormat;
    blockFormat.setAlignment(Qt::AlignCenter);
    cursor.insertBlock(blockFormat);
    QTextCharFormat charFormat;
    charFormat.setBackground(Qt::lightGray);
    charFormat.setForeground(Qt::blue);
    charFormat.setFont(QFont("宋体", 12, QFont::Bold, true));
    charFormat.setFontUnderline(true);
    cursor.setCharFormat(charFormat);
    cursor.insertText("helloworld");

效果如下:
在这里插入图片描述

插入表格、列表、图片

表格相关类:

QTextTableFormatQTextTableCellFormat QTextTable

    QTextTable *insertTable(int rows, int cols, const QTextTableFormat &format);
    QTextTable *insertTable(int rows, int cols);
    QTextTable *currentTable() const;

示例:

    QTextTableFormat tableFormat;
    tableFormat.setCellSpacing(2);
    tableFormat.setCellPadding(10);
    cursor.insertTable(2, 2, tableFormat);

在这里插入图片描述

列表相关类:

QTextListFormatQTextList

    QTextList *insertList(const QTextListFormat &format);
    QTextList *insertList(QTextListFormat::Style style);

    QTextList *createList(const QTextListFormat &format);
    QTextList *createList(QTextListFormat::Style style);
    QTextList *currentList() const;

示例:

    QTextListFormat listFormat;
    listFormat.setStyle(QTextListFormat::ListDecimal);
    cursor.insertList(listFormat);
图片相关类:

QTextImageFormat

    void insertImage(const QTextImageFormat &format, QTextFrameFormat::Position alignment);
    void insertImage(const QTextImageFormat &format);
    void insertImage(const QString &name);
    void insertImage(const QImage &image, const QString &name = QString());

查找

查找到后,可以定位字符串所在的行和列的编号。

qDebug() << ui->textEdit->find("hello world", QTextDocument::FindBackward);

ui->textEdit->textCursor().blockNumber();
ui->textEdit->textCursor().columnNumber();

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

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

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

相关文章

修改 OkHttp3 的超时时间

修改 OkHttp3 的超时时间 一. 前言二. 导入mavengradle 三. 设置超时时间 一. 前言 OkHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司开发。OkHttp3是Java和Android都能用&#xff0c;Android还有一个著名网络库叫Volley&#xff0c;那个…

关于用css设置input输入框hover的时候的样式以及当input为disabled的时候,不要让hover样式生效

效果如果&#xff1a; 编辑状态下的时候&#xff1a; 只读状态下的时候&#xff1a; 代码如图&#xff1a; <input type"text" name"dataForm.exportCode" id"exportCodeItem" required :disabled"editDisabled" />input:not(…

Web自动化测试流程:从入门到精通,帮你成为测试专家!

Web应用程序在今天的软件开发中占据着越来越重要的地位。保证Web应用程序的质量和稳定性是非常必要的&#xff0c;而自动化测试是一种有效的方法。本文将介绍Web自动化测试流程&#xff0c;并提供代码示例。 步骤一&#xff1a;选取测试工具 选择适合自己团队的自动化测试工具…

UML建模图文详解教程——用例图

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;《UML面向对象分析、建模与设计&#xff08;第2版&#xff09;》吕云翔&#xff0c;赵天宇 著 用例图概述 用例图(use case diagram)是表示一个系统…

【数据结构】链表中二级指针的应用

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 (注:为方便演示本篇使用的x86系统,因此指针的大小为4个字节) 目录 &#x1f4cc;形参的改变不影响实参! 1.调用函数更改整型时传值调用与传址调用的区别 &#x1f38f;传值…

【Pytorch】Visualization of Fature Maps(2)

学习参考来自 使用CNN在MNIST上实现简单的攻击样本https://github.com/wmn7/ML_Practice/blob/master/2019_06_03/CNN_MNIST%E5%8F%AF%E8%A7%86%E5%8C%96.ipynb 文章目录 在 MNIST 上实现简单的攻击样本1 训练一个数字分类网络2 控制输出的概率, 看输入是什么3 让正确的图片分…

表格制作软件排行榜,热门做表格的软件推荐

在数字化时代&#xff0c;表格不仅仅是企业管理和数据整理的重要工具&#xff0c;更是学术研究、项目规划以及日常生活中必不可少的一部分。为了更高效地进行表格制作&#xff0c;选择一款优秀的表格制作软件是至关重要的。在众多的软件中&#xff0c;我们特别推荐一款备受好评…

【电路笔记】-电流源

电流源 文章目录 电流源1、概述1.1 理想电流源1.2 实际电流源1.3 连接规则 2、依赖电流2.1 压控电流源2.2 电流控制电流源 3、总结 本文为前面文章 电压源的延续&#xff0c;我们将在本文介绍电流源。 与电压源的情况类似&#xff0c;我们将首先介绍理想电流源的概念&#xff…

基于springboot实现摄影跟拍预定管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现摄影跟拍预定管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要…

【Redis】持久化-RDBAOF混合持久化

文章目录 前置知识RDB&#xff08;定期备份&#xff09;触发机制流程说明RDB文件的处理RDB 的优缺点 AOF&#xff08;实时备份&#xff09;使用AOF命令写入AOF工作流程文件同步重写机制重写触发机制AOF进制重写流程 混合持久化启动时数据恢复 总结 前置知识 回顾MySQL MySQL的事…

UVM项目笔记——通过寄存器模型实现AHB接口的寄存器读写(内含源码)

目录 1.前言 2.DRIVER实现 2.1 AHB二级流水时序 2.2 “队列错位法”实现driver 2.3 driver代码 2.4 仿真log与波形 2.5 多级流水拓展方法 1.前言 UVM driver在接口协议的实现中起着非常重要的作用&#xff0c;因为它一端处理基于类的事务级sequence&#xff0c;另一端处…

Wagtail-基于Python Django的内容管理系统CMS如何实现公网访问

Wagtail-基于Python Django的内容管理系统CMS实现公网访问 文章目录 Wagtail-基于Python Django的内容管理系统CMS实现公网访问前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个…

数字化转型过程中的RPA+X与RPA+B

当前&#xff0c;RPA已成为企业数字转型初始阶段里最受欢迎的自动化解决方案&#xff0c;越来越多的企业开始引入RPA来协助员工&#xff0c;开展各类业务场景的自动化应用。很多企业也都将RPA列为重要流程优化技术&#xff0c;不少公司甚至直接放弃了传统的IT自动化方案&#x…

晶振有哪几种?晶振旁边的两个电容起什么作用?

晶振可以分为普通晶振、温补晶振、压控晶振、恒温晶振、差分晶振。 普通晶振通常用作微处理器的时钟器件&#xff0c;主要应用于那些稳定度要求不要的设备中&#xff0c;例如电视机、微波炉。 温补晶振&#xff0c;在晶振内部采取了对晶体频率、温度特性进行补偿&#xff0c;已…

sap系统连接其它系统

本文来自博客园&#xff0c;作者&#xff1a;Lovemywx2&#xff0c;转载请注明原文链接&#xff1a;https://www.cnblogs.com/1187163927ch/p/8669859.html JAVA连接ORACLE数据库 1&#xff0c;首先需要在Oracle安装完成之后新建一个用户 --新建用户 create user chenh iden…

中国最常用的制作报表的软件有哪些?

​随着信息化时代的浪潮席卷而来&#xff0c;报表制作软件已经成为了企业管理中的得力助手。在中国的大地上&#xff0c;有许多优秀的报表制作软件&#xff0c;而本文将为您揭示五位佼佼者&#xff0c;其中更以VeryReport报表软件为首选。 编辑搜图 请点击输入图片描述&#x…

centos 安装k8s教程(一键安装k8s)

第一步 准备几台机器 第二步 K8s Manager 服务器中添加docker支持 安装教程请查看这个博客 docker 安装详细教程 点我 第三步安装 KuboardSpray 教程在这里 第四步 下载k8s资源包 第五步 安装k8s 点击安装后 显示如下&#xff1a;等待完成

MAX/MSP SDK学习07:list传递

实现自定义Obejct&#xff0c;要求将传入的一组数据100后传出。 #include "ext.h" #include "ext_obex.h" typedef struct _listTrans {t_object ob;void* outLet;t_atom* fArr;long listNum;} t_listTrans;void* listTrans_new(t_symbol* s, long arg…

【GUI】-- 13 贪吃蛇小游戏之食物及成绩判断

GUI编程 04 贪吃蛇小游戏 4.4 第四步&#xff1a;食物及成绩判断 首先&#xff0c;添加食物与分数的数据定义&#xff1a; //食物的坐标int foodX;int foodY;Random random new Random();//积分面板数据结构int score;在初始化方法中&#xff0c;添加(画出)食物与分数&…

层次分析法--可以帮助你做决策的简单算法

作用 层次分析法是一个多指标的评价算法&#xff0c;主要用来在做决策时&#xff0c;给目标的多个影响因子做权重评分。特别是那些需要主观决策的、或者需要用经验判断的决策方案&#xff0c;例如&#xff1a; 买房子&#xff08;主观决策&#xff09;选择旅游地&#xff08;…