【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.hqwc.cn/news/207854.html

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

相关文章

使用Xshell连接云服务器

文章目录 下载Xshell配置云服务器查找外网IP设置云服务器登录密码 配置Xshell登录成功的标志特别注意 下载Xshell 下载地址&#xff1a;https://www.netsarang.com/en/free-for-home-school/ 注&#xff1a;在点击下载之后需要输入用户名和邮箱地址进行验证&#xff0c;验证成…

加速你的自动化测试:3种等待方式!

在自动化测试中&#xff0c;等待是一个重要的技术&#xff0c;用于处理页面加载、元素定位、元素状态改变等延迟问题。 等待能够确保在条件满足后再进行后续操作&#xff0c;提高自动化测试的稳定性以及可靠性。 等待方式&#xff1a;显示等待、隐式等待、线程睡眠 1. 显式等…

Win10系统无法登录Xbox live的四种解决方法

在Win10系统中&#xff0c;用户可以登录Xbox live平台&#xff0c;畅玩自己喜欢的游戏。但是&#xff0c;有用户却遇到了无法登录Xbox live的问题。接下来小编给大家详细介绍四种简单的解决方法&#xff0c;解决后用户在Win10电脑上就能成功登录上Xbox live平台。 Win10系统无法…

【电路笔记】-电流源

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

java算法学习索引之字符串问题

一 判断两个字符串是否互为变形词 【题目】给定两个字符串str1和str2&#xff0c;如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样&#xff0c;那么str1与str2互为变形词。请实现函数判断两个字符串是否互为变形词。 public boolean isDeformation(String str1…

【蓝桥杯选拔赛真题25】C++两个数比大小 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++两个数比大小 一、题目要求 1、编程实现 2、输入输出 二、算法分析

JSP内置对象

一、request对象 1、访问请求参数 2、在作用域中管理属性 3、获取Cookie 4、解决中文乱码 5、获取客户端信息 6、显示国际化信息 是一个javax.servlet.http.HttpServletRequest对象 request封装了用户浏览器提交的信息&#xff0c;因此可以调用相应的方法可以获取这些封…

CSS画一条线

<p style"border: 1px solid rgba(0, 0, 0, 0.1);"></p> 效果&#xff1a;

Node.js入门指南(一)

目录 Node.js入门 什么是Node.js Node.js的作用 Node.js安装 Node.js编码注意事项 Buffer(缓冲器&#xff09; 定义 使用 fs模块 概念 文件写入 文件读取 文件移动与重命名 文件删除 文件夹操作 查看资源状态 路径问题 path模块 Node.js入门 什么是Node.js …

C#开发的OpenRA游戏之属性RenderSprites(8)

C#开发的OpenRA游戏之属性RenderSprites(8) 本文开始学习RenderSprites属性,这个属性是跟渲染有关的,因此它就摄及颜色相关的内容,所以我们先来学习一下调色板,这是旧游戏的图片文件保存的格式,如果放在现代来看,不会再采用这种方法,毕竟现在存储空间变大,便宜了,并…

《C++ Primer》第9章 顺序容器(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 C 中的容器可以分为 3 类&#xff1a;顺序容器、关联容器、无序关联容器。 9.1 顺序容器概述&#xff08;P292&#xff09; 所有顺序容器都提供了快速顺序访问的能力&#xff0c;但在以下方面的性能有所不…

Leetcode—13.罗马数字转整数【简单】

2023每日刷题&#xff08;三十七&#xff09; Leetcode—13.罗马数字转整数 算法思想 当前位置的元素比下个位置的元素小&#xff0c;就减去当前值&#xff0c;否则加上当前值 实现代码 int getValue(char c) {switch(c) {case I:return 1;case V:return 5;case X:return 1…