【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); //设置文本可选中属性为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();

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】泛型编程 ⑫ ( 类模板 static 关键字 | 类模板 static 静态成员 | 类模板使用流程 )

文章目录 一、类模板使用流程1、类模板 定义流程2、类模板 使用3、类模板 函数 外部实现 二、类模板 static 关键字1、类模板 static 静态成员2、类模板 static 关键字 用法3、完整代码示例 将 类模板 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 : 类模板 的 函数声明…

linux ld 链接器学习笔记

ld链接器笔记 1. 首先编写一段汇编代码 这里的汇编语法时 AT&T语法,是gcc原生支持的语法,底层使用 gas(gnu assembler) 完成汇编,相较于 Intel x86语法, AT&T 语法要更加古老,因此大多数人更加偏向于使用 Intel 的语法. nasm 编译器支持x86语法.自从2.10版本&#xf…

问鼎web服务

华子目录 www简介常见Web服务程序介绍&#xff1a;服务器主机主要数据浏览器网址及http介绍urlhttp请求方法 http协议请求的工作流程www服务器类型静态网站动态网站 快速安装Apache安装准备工作httpd所需目录主配置文件 实验操作 www简介 Web网络服务也叫www&#xff08;world…

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

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

Vue3常用操作

一、Vue3项目构建 1、安装最新版本vue npm create vuelatest 2、选择需要的配置 3、进入项目 cd 项目名称 4、下载依赖 npm install 5、启动项目 npm run dev

数据结构—链表

链表结构-----“银行自助叫号” 链表&#xff08;Linked List&#xff09;是一种常见的数据结构&#xff0c;用于存储一个序列的元素。它由一系列结点组成&#xff0c;每个结点包含两个部分&#xff1a;数据部分和指针部分。数据部分存储着当前结点的数据&#xff0c;而指针部分…

CSDN最新最全pytest系列——pytest-base-url插件之配置可选的项目系统UR

前言 ①当我们的自动化代码完成之后&#xff0c;通常期望可以在不同的环境进行测试&#xff0c;此时可以将项目系统的URL单独拿出来&#xff0c;并且可以通过pytest.ini配置文件和支持pytest命令行方式执行。 ② pytest-base-url 是一个简单的pytest插件&#xff0c;它通过命…

12-25v转3.3v高清水下钓鱼摄像头电源供电芯片方案

高清水下钓鱼摄像头电源芯片方案&#xff1a;12-25V转3.3V&#xff0c;支持超宽电压输入范围和30米长线视频放大 在水下钓鱼摄像头设计中&#xff0c;为了实现高清画质和稳定的电源供应&#xff0c;需要一款能够将12-25V转换为3.3V输出的高效电源芯片。这款电源芯片不仅支持高…

【电路笔记】-电流源

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

第二十章:多线程

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

Shell判断:模式匹配:case(三)

系统管理工具箱 1、需求&#xff1a;Linux提供的丰富的管理命令&#xff0c;用户管理&#xff0c;内存管理&#xff0c;磁盘管理&#xff0c;进程管理&#xff0c;日志管理&#xff0c;文件管理&#xff0c;软件管理&#xff0c;网络管理等等数十个工具包。如果你能通过shell编…

二十、虚拟机网络配置

1、Linux网络配置原理 我自己Linux虚拟机的IP地址是&#xff1a;192.168.159.131 vmnet8&#xff1a;192.168.159.1 无线网卡&#xff1a;192.168.159.1 2、查看网络IP和网关 查看虚拟网络编辑器和修改IP地址 如果把这个位置的子网IP换成&#xff1a;192.168.8.0的话重启虚拟机…

【兔子王赠书第8期】AI短视频制作一本通: 文本生成视频+图片生成视频+视频生成视频

文章目录 写在前面推荐图书关键点内容简介作者简介推荐理由写在后面 写在前面 1本书精通AI短视频制作&#xff0c;文本生成视频图片生成视频视频生成视频AI短视频应用&#xff01;高效视频制作技巧&#xff0c;助你快速成长为行业大咖&#xff01; 推荐图书 《AI短视频制作一…

Java小游戏之飞翔的小鸟

创建三个包&#xff0c;存放代码。把图片放进文件中 APP包&#xff08;运行&#xff09; GameApp类 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包&#xff08;主内容&#xff09; Barrie…

SQL基础理论篇(九):存储过程

文章目录 简介存储过程的形式定义一个存储过程使用delimiter定义语句结束符存储过程中的三种参数类型流控制语句 存储过程的优缺点参考文献 简介 存储过程Stored Procedure&#xff0c;SQL中的另一个重要应用。 前面说的视图&#xff0c;只能勉强跟编程中的函数相似&#xff…

2023年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品生产单位安全生产管理人员证模拟考试题库是根据危…

Unsupervised MVS论文笔记

Unsupervised MVS论文笔记 摘要1 引言2 相关工作3 实现方法 Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and Martial Hebert. Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and …

【java】想要限制每次查询的结果集不能超过10000行,该如何实现?

文章目录 前言 前言 对于一些Saas化软件&#xff0c;当某个租户在执行查询SQL时&#xff0c;如果查询条件出现了BUG&#xff0c;导致去查了所有租户的数据&#xff0c;这种情况是非常严重的&#xff0c;此时就需要在架构层面做限制&#xff0c;禁止一些特殊SQL的执行&#xff…

Axios 请求响应结果的结构

发送请求 this.$axios.get(https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/,{params: {id: 10}}).then(res > {console.log(res)})输出返回结果 confing 请求时的配置对象&#xff0c;如果请求的url&#xff0c;请求的方法&#xff0c;请求的参数&#xff0c…

数字孪生助力污水处理升级

随着科技的发展&#xff0c;数字孪生技术在各行各业中得到了广泛应用。在污水处理领域&#xff0c;数字孪生技术为流程监控、效率提升、问题诊断等提供了强有力的支持。本文就借用山海鲸可视化软件的污水处理解决方案为大家介绍数字孪生在污水处理领域的作用。 一、实时监控 …