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

描述

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); //设置文本可选中属性为falseQTextCursor 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.mzph.cn/news/160486.shtml

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

相关文章

busybox制作根文件系统2

上篇内容使用busybox制作好了根文件系统&#xff0c;接下来需要进行一些测试和功能的完善&#xff01; 根文件系统的测试 测试根文件系统的时候不是直接烧写到EMMC里面&#xff0c;这样测试效率太低了&#xff0c;Ubuntu的rootfs目录已经保存了根文件系统&#xff0c;只需要在…

向量数据库,展望AGI时代

无论是向量数据库&#xff0c;还是大模型&#xff0c;归根结底&#xff0c;大家在追捧它时的心态&#xff0c;焦虑大于需求。 向量数据库的热潮&#xff0c;在一定程度上“外化”了人们的焦虑。 但这并不能否定向量数据库的实际价值&#xff0c;甚至更长远来看&#xff0c;向…

RedisTemplate使用详解

RedisTemplate介绍StringRedisTemplate介绍RedisConnectionFactory介绍RedisConnectionFactory源码解析 RedisOperations介绍RedisOperations源码解析 RedisTemplate使用连接池配置RedisTemplate连接池连接池配置 RedisTemplate应用场景RedisTemplate主要特点RedisTemplate使用…

redis运维(十六) 有序集合

一 有序集合 把握一点&#xff1a; 各种redis 命令都提供各种语言对应的API 接口,后续API是关键 ① 概念 1、sorted set --> 有序集合2、redis有序集合也是集合类型的一部分&#xff0c;所以它保留了集合中元素不能重复的特性3、但是不同的是,有序集合给每个元素多设置…

转型做视频了,博客就是稿子,继续坚持写博客,同时发布视频,能写博客说明思路清晰了,能再讲明白,理解就更透彻了,紧跟上时代发展。

1&#xff0c;今天特别记录下&#xff0c;B站给开通了《合集》功能 最近使用视频制作了几个视频。播放量还不错&#xff0c;最好的已经到了 2.6K了。 然后粉丝也涨到了 200个。 添加链接描述 紧跟时代&#xff1a;从写博客到录视频&#xff0c;粉丝大涨&#xff0c;突破200个&…

接口自动化测试 —— 工具、请求与响应

一、工具&#xff1a; 1.工具介绍 postman &#xff1a;很主流的API测试工具&#xff0c;也是工作里面使用最广泛的研发工具。 JMeter&#xff1a; ApiPost&#xff1a; 2.安装postman&#xff1a; 安装好直接打开&#xff0c;不用注册。 二、通信模式&#xff1a; 1、…

【Java 进阶篇】从Java对象到JSON:Jackson的魔法之旅

在现代的软件开发中&#xff0c;处理数据的能力是至关重要的。而当我们谈及数据格式时&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;通常是首选。为了在Java中轻松地将对象转换为JSON&#xff0c;我们需要一种强大而灵活的工具。这时&#xff0c;Jackso…

【Java 进阶篇】Redis:打开缓存之门

介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值对存储系统&#xff0c;被广泛用作缓存、消息中间件和数据库。它以其快速的读写能力、支持多种数据结构和丰富的功能而闻名。在这篇博客中&#xff0c;我们将深入了解Redis的概念、安装以及基本…

MQTT协议消息代理服务远程连接

目录 1. Linux 搭建 Mosquitto 2. Linux 安装Cpolar 3. 创建MQTT服务公网连接地址 4. 客户端远程连接MQTT服务 5. 代码调用MQTT服务 6. 固定连接TCP公网地址 7. 固定地址连接测试 Mosquitto是一个开源的消息代理&#xff0c;它实现了MQTT协议版本3.1和3.1.1。它可以在不…

第二十章:多线程

进程 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 package twentyth; public class ThreadTest extends Thread { public void run() { for (int i 1; i < 10; i) {//继承重…

Unity开发之C#基础-File文件读取

前言 今天我们将要讲解到c#中 对于文件的读写是怎样的 那么没接触过特别系统编程小伙伴们应该会有一个疑问 这跟文件有什么关系呢&#xff1f; 我们这样来理解 首先 大家对电脑或多或少都应该有不少的了解吧 那么我们这些软件 都是通过变成一个一个文件保存在电脑中 我们才可以…

Spring Boot创建和使用(重要)

Spring的诞生是为了简化Java程序开发的&#xff01; Spring Boot的诞生是为了简化Spring程序开发的&#xff01; Spring Boot就是Spring框架的脚手架&#xff0c;为了快速开发Spring框架而诞生的&#xff01;&#xff01; Spring Boot的优点&#xff1a; 快速集成框架&#x…

2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲…

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 在使用 WAL 的系统中&#xff0c;所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …

【Java开发】 Springboot集成Mybatis-Flex

1 Mybatis-Flex 介绍 1.1简介 Mybatis-Flex 是一个优雅的 Mybatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper 亮点帮助我们极大的减少了 SQL 编写的工作的同时&#xff…

cocos2dx ​​Animate3D(二)

Twirl 扭曲旋转特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 扭曲中心位置 // 扭曲的数量 // 振幅 static Twirl* create(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude)…

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

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

【2018年数据结构真题】

方法一 给定一个含n(n>1)个整数的数组&#xff0c;请设计一个在时间上尽可能高效的算法&#xff0c;找出数组中未出现的最小正整数。例如&#xff0c;数组{-5&#xff0c;3&#xff0c;2&#xff0c;3}中未出现的最小正整数是1&#xff1b;数组{1&#xff0c;2&#xff0c;…

AIGC变革BI行业,永洪发布vividime全球化品牌

大数据产业创新服务媒体 ——聚焦数据 改变商业 国内BI商业智能市场&#xff0c;一直有着“内永洪&#xff0c;外Tableau”的说法。成立于2012年的永洪科技经过十多年的发展&#xff0c;早已崛起为国内大数据行业的一支劲旅。 ChatGPT火爆出圈之后&#xff0c;AIGC快速渗透&am…

【C++】vector的介绍与使用

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…