QT系列教程(10) QTextEdit学习

2024-06-08 17:20

本文主要是介绍QT系列教程(10) QTextEdit学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

QTextEdit是文本编辑器,支持富文本功能。接下来我们创建一个Qt Application 应用,然后在ui中添加一个QTextEdit插件。
运行程序后,可以在QTextEdit中输入任何文字也包括富文本。

文本块

我们在MainWindow的ui文件中添加了textedit插件,然后在MainWindow的构造函数中写代码,修改文本框样式

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QTextDocument *doc= ui->textEdit->document();QTextFrame* root_frame = doc->rootFrame();QTextFrameFormat format;format.setBorderBrush(Qt::blue);format.setBorder(3);root_frame->setFrameFormat(format);
}

通过textEdit的document函数返回文本块,再通过rootFrame获取根框架,设置这个框架的边框样式为蓝色,边框为3.
运行程序后可以看到主窗口的textedit会显示一个蓝色边框的输入框,那就是根节点。我们可以插入两个纯文本

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QTextDocument *doc= ui->textEdit->document();QTextFrame* root_frame = doc->rootFrame();QTextFrameFormat format;format.setBorderBrush(Qt::blue);format.setBorder(3);root_frame->setFrameFormat(format);ui->textEdit->insertPlainText("hello world!\n");ui->textEdit->insertPlainText("Hello Qt\n");
}

运行程序会看到插入的纯文本在根文本块里。我们可以再设置一个文本样式,然后插入到光标所在的位置,这样会生成一个新的文本框架,然后插入两行文字,这样会生成两个文本块

   QTextFrameFormat  frameFormat;frameFormat.setBackground(Qt::lightGray);frameFormat.setMargin(10);frameFormat.setPadding(5);frameFormat.setBorder(2);frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dashed);QTextCursor cursor = ui->textEdit->textCursor();cursor.insertFrame(frameFormat);ui->textEdit->insertPlainText("inner text!\n");ui->textEdit->insertPlainText("Hello inner Text!\n");

效果就是这样
https://cdn.llfc.club/test2.jpg

遍历文本块

我们可以遍历文本块和框架节点。先在构造函数中添加一个菜单,用来打印Frame和TextBlock

   QAction * action_frame = new QAction("Frame",this);connect(action_frame, &QAction::triggered,this, &MainWindow::showTextFrame);ui->mainToolBar->addAction(action_frame);

然后实现showTextFrame

void MainWindow::showTextFrame()
{auto doc = ui->textEdit->document();auto rootFrame = doc->rootFrame();for(auto iter = rootFrame->begin(); iter != rootFrame->end(); iter++){auto cur_frame = iter.currentFrame();auto cur_block = iter.currentBlock();if(cur_frame){qDebug() << "cur node is frame " ;} else if(cur_block.isValid()){qDebug() << "cur node is text block ,text is " << cur_block.text();}}
}

程序输出

cur node is text block ,text is  "hello world!"
cur node is text block ,text is  "Hello Qt"
cur node is text block ,text is  ""
cur node is frame 
cur node is text block ,text is  ""

如果只想打印文本块,我们可以用这种方式, 现在MainWindow的构造函数中添加一个显示文本的菜单项

   QAction* action_textBlock = new QAction(tr("文本块"),this);connect(action_textBlock, &QAction::triggered, this, &MainWindow::showTextBlock);ui->mainToolBar->addAction(action_textBlock);

显示文本块的逻辑如下

void MainWindow::showTextBlock()
{QTextDocument* document = ui->textEdit->document();QTextBlock block = document->firstBlock();for(int i = 0; i < document->blockCount(); i++){qDebug() << tr("文本块%1, 文本块首行行号%2, 长度%3, 内容%4").arg(i).arg(block.firstLineNumber()).arg(block.length())<< block.text();block = block.next();}
}

运行程序后点击文本块菜单,会输出如下

"文本块0, 文本块首行行号0, 长度13, 内容%4" "hello world!"
"文本块1, 文本块首行行号1, 长度9, 内容%4" "Hello Qt"
"文本块2, 文本块首行行号2, 长度1, 内容%4" ""
"文本块3, 文本块首行行号3, 长度12, 内容%4" "inner text!"
"文本块4, 文本块首行行号4, 长度18, 内容%4" "Hello inner Text!"
"文本块5, 文本块首行行号5, 长度1, 内容%4" ""
"文本块6, 文本块首行行号6, 长度1, 内容%4" ""

设置文本块样式

之前我们设置的都是文本框架的样式,这次我们设置文本块的样式.
在构造函数中添加字体菜单,用来设置文本块的字体样式

   QAction* action_font = new QAction(tr("字体"), this);action_font->setCheckable(true);connect(action_font, &QAction::toggled, this, &MainWindow::setTextFont);ui->mainToolBar->addAction(action_font);

setTextFont槽函数实现如下

void MainWindow::setTextFont(bool checked)
{if(checked){QTextCursor cursor = ui->textEdit->textCursor();QTextBlockFormat blockFormat;blockFormat.setAlignment(Qt::AlignCenter);cursor.insertBlock(blockFormat);QTextCharFormat charFormat;charFormat.setBackground(Qt::lightGray);charFormat.setForeground(Qt::blue);charFormat.setFont(QFont(tr("宋体"),12,QFont::Bold,true));charFormat.setFontUnderline(true);cursor.setCharFormat(charFormat);cursor.insertText(tr("插入字体"));}else{QTextCursor cursor = ui->textEdit->textCursor();QTextBlockFormat blockFormat;blockFormat.setAlignment(Qt::AlignLeft);cursor.insertBlock(blockFormat);QTextCharFormat charFormat;
//        charFormat.setBackground(Qt::white);
//        charFormat.setForeground(Qt::black);
//        charFormat.setFont(QFont(tr("微软雅黑"),12,QFont::Normal, false));
//        charFormat.setFontUnderline(false);cursor.setCharFormat(charFormat);cursor.insertText(tr("微软雅黑字体"));}
}

如果选中字体菜单,则设置插入新的文本块,文本块格式为宋体,加粗字样。如果取消选中,则插入新的文本块,设置为微软雅黑字体。
运行程序后, 选中字体菜单,然后再点击字体菜单取消选中,会插入不同字体的文本块,显示如下
https://cdn.llfc.club/1665133829843.jpg

插入表格列表图片

QTextEdit也支持插入表格,列表,图片等资源。在MainWindow的构造函数里增加列表,图片,表格的信号和槽函数连接逻辑

   QAction* action_textTable = new QAction(tr("表格"), this);QAction* action_textList = new QAction(tr("列表"), this);QAction* action_textImage = new QAction(tr("图片"), this);connect(action_textTable, &QAction::triggered,this, &MainWindow::insertTable);ui->mainToolBar->addAction(action_textTable);connect(action_textList, &QAction::triggered,this, &MainWindow::insertList);ui->mainToolBar->addAction(action_textList);connect(action_textImage, &QAction::triggered,this, &MainWindow::insertImage);ui->mainToolBar->addAction(action_textImage);

然后实现这几个槽函数

void MainWindow::insertTable()
{QTextCursor cursor = ui->textEdit->textCursor();QTextTableFormat format;format.setCellSpacing(2);format.setCellPadding(10);cursor.insertTable(2,2,format);
}void MainWindow::insertList(){QTextListFormat format;format.setStyle(QTextListFormat::ListDecimal);ui->textEdit->textCursor().insertList(format);
}void MainWindow::insertImage(){QTextImageFormat format;format.setName(":/img/head.jpg");ui->textEdit->textCursor().insertImage(format);
}

运行程序后,点击这几个菜单,会依次插入表格,列表,图片等。

实现查找功能

在构造函数里添加查找信号和槽函数的连接

   QAction* action_textFind = new QAction(tr("查找"), this);connect(action_textFind, &QAction::triggered, this, &MainWindow::textFind);ui->mainToolBar->addAction(action_textFind);findDialog = new QDialog(this);lineEdit = new QLineEdit(findDialog);QPushButton * btn = new QPushButton(findDialog);btn->setText(tr("查找下一个"));connect(btn, &QPushButton::clicked, this, &MainWindow::findNext);QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(lineEdit);layout->addWidget(btn);findDialog->setLayout(layout);

在构造函数里连接了查找菜单和槽函数textFind。然后创建了一个对话框,对话框上有一个lineedit,以及查找按钮,每次点击这个按钮就执行查找下一个的功能。
运行后显示如下
https://cdn.llfc.club/1665135164965.jpg

总结

源码链接https://gitee.com/secondtonone1/qt-learning-notes

这篇关于QT系列教程(10) QTextEdit学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042822

相关文章

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC