QT QTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能

news/2024/5/6 16:17:24/文章来源:https://blog.csdn.net/txwtech/article/details/126671120

QT QTextEdit富文本插入字体-表格-编号-图片与查找功能,输入char 自动变成蓝色-语法高亮功能

QTQTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能.rar-QT文档类资源-CSDN下载QTQTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能.rarhttps:/更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/txwtech/86507476

什么是富文本?
word 上的字体可以更改,变换颜色等的是rich text 富文本
而window记事本那种是纯文本(plain text)
关于它的帮助可以看助手 Rich Text Processing 关键字查找

富文本 文档结构
QT对富文本的处理只有只读和编辑二种方式
对于文档的读取和编辑要使用二种不同的接口

文档的光标主要基于QTextCursor类,而文档的框架主要基于QTextDocument类。

一个富文本文档的结构分为几种元素来表示,分别是框架(QTextFrame)、文本块(QTextBlock)、表格(QTextTable)和列表(QTextList)。
每种元素的格式又使用相应的 format类来表示,分别是框架格式(QTextFrameFormat)、文本块格式(QTextBlockFormat),表格格式(QTextTableFormat)和列表格式(QTextListFormat),这些格式一般在编辑文档时使用,所以常和QTextCursor类配合使用。

QTextEdit类就是一个富文本编辑器,所以在构造QTexrEdit类的对象时就已经构建了一个QTextDocument类对象和一个QTextCursor类对象,只须调用它们进行相应的操作即可

一个空的文档包含了一个根框架(Root frame),这个根框架又包含了一个空的文本块(Block)。
框架将一个文档分为多个部分,在根框架里可以再添加文本块、子框架和表格等,一个文档的结构

#ifndef MAINWINDOW5_3_H
#define MAINWINDOW5_3_H#include <QMainWindow>
class QLineEdit;
class QDialog;
class MySyntaxHiglighter;QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow5_3; }
QT_END_NAMESPACEclass MainWindow5_3 : public QMainWindow
{Q_OBJECTpublic:MainWindow5_3(QWidget *parent = nullptr);~MainWindow5_3();private:Ui::MainWindow5_3 *ui;QLineEdit *lineEdit; //对象指针QDialog *findDialog;MySyntaxHiglighter *my_highlighter;private slots:void showTextFrame();//获取文本框架void showTextBlock();//获取文本块void setTextFont(bool checked);void insertTable();void insertList();void insertImage();void textFind();void findNext();void findPrevious();
};
#endif // MAINWINDOW5_3_H
#include "mainwindow5_3.h"
#include "ui_mainwindow5_3.h"
#include <QTextFrame>
#include <QDebug>
#include <QLineEdit>
#include <QDialog>
#include <QPushButton>
#include <QVBoxLayout>
#include "mysyntaxhiglighter.h"
//编辑器中插入表格,列表,图片的方法
MainWindow5_3::MainWindow5_3(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow5_3)
{ui->setupUi(this);QTextDocument *qDoc=ui->textEdit->document();//获取文档对象QTextFrame *root_frame = qDoc->rootFrame();//获取根框架QTextFrameFormat q_format;//创建框架的格式q_format.setBorderBrush(Qt::red);//边界的颜色q_format.setBorder(2);//边界线的宽度,粗细//  root_frame->setFrameFormat(q_format);//框架使用格式QTextFrameFormat frameFormat;frameFormat.setBackground(Qt::darkGreen);frameFormat.setMargin(1);//边距frameFormat.setPadding(2);//填衬frameFormat.setBorder(2);frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);//边框样式//QTextCursor cursor2=ui->textEdit->textCursor();//获取光标//cursor2.insertFrame(frameFormat);//在光标处插入框架//获取框架 QTextFrame操作QAction *action_textFrame=new QAction(tr("框架"),this);connect(action_textFrame,&QAction::triggered,this,&MainWindow5_3::showTextFrame);ui->toolBar->addAction(action_textFrame);//获取文本块 QTextBlock操作QAction *action_block= new QAction(tr("文本块"),this);connect(action_block,&QAction::triggered,this,&MainWindow5_3::showTextBlock);ui->toolBar->addAction(action_block);//设置字体QAction * action_font=new QAction(tr("字体"),this);action_font->setCheckable(true);//connect(action_font,&QAction::triggered,this,&MainWindow5_3::setTextFont);connect(action_font,&QAction::toggled,this,&MainWindow5_3::setTextFont);ui->toolBar->addAction(action_font);////编辑器中插入表格,列表,图片的方法QAction *action_text_table=new QAction(tr("插入表格"),this);QAction *action_text_list=new QAction(tr("插入列表编号"),this);QAction *action_text_image=new QAction(tr("插入图片"),this);connect(action_text_table,&QAction::triggered,this,&MainWindow5_3::insertTable);connect(action_text_list,&QAction::triggered,this,&MainWindow5_3::insertList);connect(action_text_image,&QAction::triggered,this,&MainWindow5_3::insertImage);ui->toolBar->addAction(action_text_table);ui->toolBar->addAction(action_text_list);ui->toolBar->addAction(action_text_image);//实现查找功能QAction *action_text_find=new QAction(tr("查找"),this);connect(action_text_find,&QAction::triggered,this,&MainWindow5_3::textFind);//绑定工具栏的点击信号到执行函数ui->toolBar->addAction(action_text_find);findDialog=new QDialog(this);findDialog->setWindowTitle(tr("查找功能"));lineEdit = new QLineEdit(findDialog);//创建行编辑器QPushButton * q_pushbutton=new QPushButton(findDialog);//创建按钮// QPushButton * q_pushbutton_upstream=new QPushButton(findDialog);//创建按钮q_pushbutton->setText(tr("查找上一个"));// q_pushbutton_upstream->setText(tr("查找上一个"));connect(q_pushbutton,&QPushButton::clicked,this,&MainWindow5_3::findNext);// connect(q_pushbutton_upstream,&QPushButton::clicked,this,&MainWindow5_3::findPrevious);QVBoxLayout *qvbox_layout=new QVBoxLayout;//创建垂直布局管理器qvbox_layout->addWidget(lineEdit);qvbox_layout->addWidget(q_pushbutton);//qvbox_layout->addWidget(q_pushbutton_upstream);findDialog->setLayout(qvbox_layout);//语法高亮测试my_highlighter= new MySyntaxHiglighter(ui->textEdit->document());//创建MySyntaxHiglighter类对象//使用ui->textEdit->document()作为参数,文档改变将触发MySyntaxHiglighter的highlightBlock函数来设置语法高亮//QTextEdit 富文本 还支持HTML 子集ui->textEdit->append(tr("<h1><font color=gray> 测试使用HTML方式</font></h1>"));}MainWindow5_3::~MainWindow5_3()
{delete ui;
}
//获取框架 QTextFrame操作
void MainWindow5_3::showTextFrame()
{QTextDocument *q_doc =ui->textEdit->document();QTextFrame *q_frame = q_doc->rootFrame();QTextFrame::iterator frame_iterator;for (frame_iterator=q_frame->begin();!(frame_iterator.atEnd());++frame_iterator){QTextFrame *child_frame=frame_iterator.currentFrame();//获取当前框架的指针QTextBlock childBlock=frame_iterator.currentBlock();//获取当前文本块if(child_frame){qDebug()<<"frame";}else if(childBlock.isValid()){qDebug()<<"block:"<<childBlock.text();}}
}
//获取文本块 QTextBlock操作
void MainWindow5_3::showTextBlock()
{QTextDocument *qdoc= ui->textEdit->document();QTextBlock qblock=qdoc->firstBlock();//获取文档的第一个文本块哦for(int i=0;i<qdoc->blockCount();i++){qDebug()<<tr("文本块:%1,首行行号:%2,长度:%3,内容:").arg(i).arg(qblock.firstLineNumber()).arg(qblock.length())<<qblock.text();qblock=qblock.next();}}void MainWindow5_3::setTextFont(bool checked)
{if(checked)//处于选中状态{QTextCursor qcursor=ui->textEdit->textCursor();QTextBlockFormat block_format;//文本块格式block_format.setAlignment(Qt::AlignCenter);//水平居中qcursor.insertBlock(block_format);//插入文本块的格式QTextCharFormat char_format; //字符格式char_format.setBackground(Qt::blue);//背景色char_format.setForeground(Qt::yellow);//字体颜色char_format.setFont(QFont(tr("宋体"),12,QFont::Bold,true));//宋体12号,加粗,斜体字char_format.setFontUnderline(true);//使用下划线qcursor.setCharFormat(char_format);qcursor.insertText(tr("测试一下字体呢"));}else{qDebug()<<tr("字体未设置");}
}void MainWindow5_3::insertTable()
{QTextCursor qcursor=ui->textEdit->textCursor();QTextTableFormat qtext_table_format;qtext_table_format.setCellSpacing(2);qtext_table_format.setCellPadding(10);qcursor.insertTable(2,2,qtext_table_format);//插入2行2列
}void MainWindow5_3::insertList()
{QTextListFormat qtext_list_format;//列表格式qtext_list_format.setStyle(QTextListFormat::ListDecimal);//数字编码ui->textEdit->textCursor().insertList(qtext_list_format);}void MainWindow5_3::insertImage()//插入图片
{QTextImageFormat qtext_image_format;//qtext_image_format.setName("../xxx/duck_dance.png");//qtext_image_format.setName("./duck_dance.png"); //图片放在debug的文件夹里面qtext_image_format.setName("duck_dance.png");//图片放在debug的文件夹里面ui->textEdit->textCursor().insertImage(qtext_image_format);
}void MainWindow5_3::textFind()
{findDialog->show();
}void MainWindow5_3::findNext()
{QString str2=lineEdit->text();//使用查找函数查找指定字符串,查找方式为向后查找// bool b_find=ui->textEdit->find(str2,QTextDocument::FindBackward);bool b_find=ui->textEdit->find(str2,QTextDocument::FindBackward);/** 默认向前查找* FindBackward向后*  FindCaseSensitively = 0x00002,不区分大小写FindWholeWords      = 0x00004,匹配整个单词**/if(b_find){qDebug()<<tr("行号:%1,列号:%2").arg(ui->textEdit->textCursor().blockNumber()).arg(ui->textEdit->textCursor().columnNumber());}else{qDebug()<<tr("未查找到信息");ui->textEdit->moveCursor(QTextCursor::End);//光标移动到句末尾//ui->textEdit->moveCursor(QTextCursor::Start);//光标移动到开始}
}void MainWindow5_3::findPrevious()
{QString str2=lineEdit->text();//使用查找函数查找指定字符串,查找方式为向后查找// bool b_find=ui->textEdit->find(str2,QTextDocument::FindBackward);bool b_find=ui->textEdit->find(str2,QTextDocument::FindBackward);/** 默认向前查找* FindBackward向后*  FindCaseSensitively = 0x00002,不区分大小写FindWholeWords      = 0x00004,匹配整个单词**/if(b_find){qDebug()<<tr("行号:%1,列号:%2").arg(ui->textEdit->textCursor().blockNumber()).arg(ui->textEdit->textCursor().columnNumber());}else{qDebug()<<tr("未查找到信息");}
}

语法高亮类文件

#ifndef MYSYNTAXHIGLIGHTER_H
#define MYSYNTAXHIGLIGHTER_H
#include <QSyntaxHighlighter>class MySyntaxHiglighter : public QSyntaxHighlighter
{Q_OBJECT
public:explicit MySyntaxHiglighter(QTextDocument *parent =0);
protected:void highlightBlock(const QString &text) override;//重新实现该函数
};#endif // MYSYNTAXHIGLIGHTER_H
#include "mysyntaxhiglighter.h"MySyntaxHiglighter::MySyntaxHiglighter(QTextDocument *parent):QSyntaxHighlighter(parent)
{}void MySyntaxHiglighter::highlightBlock(const QString &text)
{QTextCharFormat my_format;my_format.setFontWeight(QFont::Bold);my_format.setForeground(Qt::blue);QString pattern2="\\bchar\\b";//匹配charQRegExp expression2(pattern2);int index2=text.indexOf(expression2);//从位置0开始匹配字符串while(index2>=0){int length2=expression2.matchedLength();setFormat(index2,length2,my_format);//对要匹配的字符串设置格式index2=text.indexOf(expression2,index2+length2);//继续匹配}
}

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

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

相关文章

Vue使用脚手架(ref、props、mixin、插件、scoped)(七)

系列文章目录 第一章&#xff1a;Vue基础知识笔记&#xff08;模板语法、数据绑定、事件处理、计算属性&#xff09;&#xff08;一&#xff09; 第二章&#xff1a;Vue基础知识&#xff08;计算属性、监视属性、computed和watch之间的区别、绑定样式&#xff09;&#xff08;…

四、 java的对象和类

四、 java的对象和类 对象&#xff08;Object&#xff09;&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&#xff1a;颜色、名字、品种&#xff1b;行为有&#xff1a;摇尾巴、叫、吃等。类&#xff08;c…

物理服务器安装CentOS 7操作系统

目录 1、下载系统镜像 2、制作安装盘 2.1 方法一&#xff1a;光盘制作 2.2 方法二&#xff1a;U盘制作 3、更改bios启动顺序 4、安装CentOS 7操作系统 4.1 安装命令选择&#xff0c;及常见错误解决 4.2 语言选择 4.3 时区选择 4.4 软件选择 4.5 安装位置选择 4.6 手…

猿创征文|【C++游戏引擎Easy2D】学C++还不会绘制一个简单的二维图形?一篇文章教会你

&#x1f9db;‍♂️iecne个人主页&#xff1a;&#xff1a;iecne的学习日志 &#x1f4a1;每天关注iecne的作品&#xff0c;一起进步 &#x1f4aa;学C必看iecne 本文专栏&#xff1a;【C游戏引擎】. &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; ✨前…

Apache Maven 3.6.0的下载安装和环境配置(详细图解+不限速下载链接)

标题工具/原料 apache-maven-3.6.0 下载地址 云盘不限速下载 或者进入官网按下图下载 方法/步骤一 安装 打开压缩包&#xff0c;将maven压缩包解压至软件安装处&#xff0c;建议D根目录或其他&#xff0c;记住安装位置 类似于 方法/步骤二 环境变量配置 变量 1.新建变…

Eolink 通过可信云权威认证,数据保护能力业内领先!

Eolink 正式通过由中国信息通信研究院组织发起的可信云评估考核&#xff0c;在数据安全保障领域获得权威认证&#xff0c;并荣获 “企业级 SaaS 服务” 认证证书。 在云时代&#xff0c;保护用户数据安全、预防隐私泄露是数字化企服厂商的重中之重。Eolink 作为一个 API 在线管…

计算机毕业设计ssm+vue基本微信小程序的个人健康管理系统

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数…

IIC协议详解

文章目录1 IIC简介2 IIC物理层2.1 IIC硬件2.2 IIC协议特点3 IIC协议层4数据传输4.1 IIC写数据4.2 IIC读数据1 IIC简介 IIC(Inter&#xff0d;Integrated Circuit)总线是一种由 NXP&#xff08;原 PHILIPS&#xff09;公司开发的两线式串行总线&#xff0c; 用于连接微控制器及其…

s19.基于 Kubernetes v1.25.0(kubeadm) 和 Docker 部署高可用集群(一)

基于 Kubernetes v1.25.0 和 Docker 部署高可用集群 主要内容 Kubernetes 集群架构组成容器运行时 CRIKubernetes v1.25 新特性Kubernetes v1.24 之后不再支持 Docker 的解决方案Kubernetes v1.25 高可用集群架构基于 Kubernetes v1.25.0 和 Docker 部署高可用集群实战案例 …

Redis持久化机制分析

什么是持久化&#xff1f; 简单来说持久化就是将数据保存到磁盘&#xff0c;让即使服务宕机、重启、断电等操作后数据仍热存在&#xff0c;并且是完整的。 1、为什么要持久化&#xff1f; 1、Redis是一个内存数据库&#xff0c;宕机之后存储在内存的数据会消失。2、Redis重启…

传述最详细的干货,让简历面试不再成为你找工作的绊脚石

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

【蓝桥杯省赛真题37】Scratch三国演义字数统计 少儿编程scratch编程蓝桥杯省赛真题讲解

​​​​​​​ 目录 scratch三国演义字数统计 一、题目要求 编程实现 二、案例分析 1、角色分析

Linux内核设计与实现 第三章 进程管理

3.1进程 实际上&#xff0c;进程就是正在执行的程序代码的实时结果。 进程是出于执行期的程序以及相关的资源的总称。 进程的另一个名字是任务。 进程不仅仅局限于一段可执行程序代码通常进程还要包含其他资源&#xff0c;像打开的文件&#xff0c;挂起的信号&#xff0c;内核…

springboot项目整理(持续更新)

SpringSecurity 1.导入依赖&#xff1a; 在pom.xml中导入依赖&#xff0c;再访问页面就会出现login&#xff0c;这是SpringSecurity自己写的页面&#xff0c;用于登录认证 <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

整合流量与资源的分享购商业模式,实现整个生态布局

大多数企业都很容易忽视一个市场&#xff0c;就是我们的日常生活服务板块&#xff0c;所谓民以食为天&#xff0c;我们应该顺应人们的生活习惯而做出来的电商商业模式&#xff0c;才是最贴合民心的&#xff0c;也能够从用户的最基础的需求出发来为其打造商业模式。 将目标放在生…

Room (三) RecyclerView 呈现列表数据

1. 用到的组件 Room&#xff0c;ViewModel&#xff0c;LiveData&#xff0c;Repository&#xff0c;AsyncTack 2. Module 中 build.gradle 文件中添加 dependencies {def room_version "2.4.3"implementation "androidx.room:room-runtime:$room_version&quo…

【Linux操作系统】-- 多线程(三)-- 线程池+单例模式

目录 线程池 场景 代码实现 线程安全的单例模式 懒汉实现方式和懒汉实现方式 饿汉方式实现单例模式 懒汉方式实现单例模式 实战代码演练单例模式 线程池 在C中用户使用new/malloc都是向操作系统OS申请的&#xff0c;在系统的角度&#xff0c;就相当于new/malloc在底层封…

MySQL之临时表

写在前面 本文一起看下MySQL的临时表。 1&#xff1a;什么是临时表 通过create temporary table t语句创建的表&#xff0c;就是临时表&#xff0c;临时表的临时体现在其是其生命周期是和会话一样的&#xff0c;当会话结束&#xff0c;即连接关闭时MySQL会自动将创建的临时表…

氨丙基咪唑离子液体(AMIBr)改性纤维素气凝胶吸附剂(CAgAMIBr)的实验要求

氨丙基咪唑离子液体(AMIBr)改性纤维素气凝胶吸附剂(CAgAMIBr)的实验要求 离子液体(ILs)&#xff0c;是完全由离子组成的液体&#xff0c;可以进一步定义为熔点低于100C的熔盐。 离子液体是在室温或接近室温下可呈现液体的液态有机盐。离子液体因具有一些优良的特性使其在分离…

树的直径 树形dp+2次dfs

题目描述 给定一棵树 T &#xff0c;树 T 上每个点都有一个权值。 定义一颗树的子链的大小为&#xff1a;这个子链上所有结点的权值和 。 请在树 T 中找出一条最大的子链并输出。 输入描述: 第一行输入一个 n,1≤n≤105。 接下来一行包含n个数&#xff0c;对于每个数 ai,−10^5…