Qt(制作一个方便的文本编辑器)

news/2025/9/29 19:10:19/文章来源:https://www.cnblogs.com/lxjshuju/p/19119353

目录

功能的简单介绍:

制作过程步骤:

菜单栏、工具栏和文本编辑器的创建和设置:

主窗口:

文本编辑框:

菜单栏、工具栏的创建和设置:

主菜单栏:

创建文件菜单:

为文件菜单添加打开文件、保存文件、关闭的动作:

创建工具栏:

连接信号和槽函数:

打开文件:

保存文件:

关闭:

字体设置:

颜色设置:

完整代码:

MainWindow代码:

主函数:


用QDialog类的文件窗口、颜色窗口、字体窗口、QMessageBox类中的弹窗消息、菜单栏、工具栏、信号和槽函数实现一个简单的文本编辑器。

常用对话框:

https://blog.csdn.net/HMBBLOVEPDX/article/details/151968097?spm=1001.2014.3001.5501

信号和槽函数:

https://blog.csdn.net/HMBBLOVEPDX/article/details/151928089?spm=1001.2014.3001.5501

菜单栏、工具栏、状态栏:

https://blog.csdn.net/HMBBLOVEPDX/article/details/152092439?spm=1001.2014.3001.5501

功能的简单介绍:

制作一个建议的文本编辑器,实现:

打开文件:将选择的文件点击打开之后,内容显示在文本编辑框。

保存文件:将文本编辑框中的内容保存到选择的路径下。

关闭:点击关闭之后,关闭程序。

设置字体:将选中的内容的字体改变为选择的字号和字体。

设置字体:将选中的内容的字体颜色改变为选择的字体颜色。

制作过程步骤:

菜单栏、工具栏和文本编辑器的创建和设置:

先将要使用到的变量定义为成员变量,方便后面对其进行封装,要不然全写构造函数,看起来太多。在成员函数中定义一个createMenuBar()函数,对菜单栏、工具栏、文本编辑框进行设置。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include 
#include 
#include 
#include 
#include 
#include 
#include 
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);~MainWindow();void createMenuBar();
private:Ui::MainWindow *ui;QMenuBar* newmenuBar;//定义一个主菜单栏QMenu* FileMenu;//定义一个文件菜单QAction* openFileMenu;//定义打开文件动作QAction* saveFileMenu;//定义保存文件动作QAction* closeMenu;//定义关闭动作QToolBar* toolBar;//定义一个工具栏QToolButton* FontButton;//定义设置字体的工具按钮QToolButton* ColorButton;//定义一个设置字体颜色的工具按钮QTextEdit* textEdit;//定义一个文本编辑框
};
#endif // MAINWINDOW_H

主窗口:

在构造函数中,先将主窗口的标题和图标进行一个设置:

this->setWindowTitle("文件编辑器");
this->setWindowIcon(QIcon(":/resimage/downloaded-image.png"));
//QIcon("资源路径")

图标需要添加到该项目当中的资源文件中,然后复制图片的路径。这样可以达到:

文本编辑框:

然后对文本编辑框进行设置:

textEdit=new QTextEdit(this);
this->setCentralWidget(textEdit);

创建一个QTextEdit控件实例(多行文本编辑区域),参数this表示将当前窗口设为父对象,实现内存自动管理。将创建的文本编辑器设置为窗口的中央部件,在QMainWindow布局体系中,centralWidget会占据除菜单栏/状态栏外的所有空间。

菜单栏、工具栏的创建和设置:

然后对createMenuBar()函数进行封装:

主菜单栏:

先创建一个主菜单栏,将其添加到主窗口当中:

newMenuBar=this->menuBar();//将获取到的菜单栏指针赋值给newMenuBar变量。
//这种方式相比直接new QMenuBar()更安全,避免了重复创建导致的内存泄漏问题
this->setMenuBar(newMenuBar);

因为菜单栏在一个窗口只有一个,所以这里采用menuBar(),当newMenuBar为空时,就创建,如果不为空,则不会创建,保证只有一个主菜单栏。将菜单栏设置到主窗口。虽然此处newMenuBar就是当前窗口的菜单栏,该操作看似冗余,但实际确保了菜单栏的正确初始化状态。

创建文件菜单:
FileMenu=new QMenu("文件");
newmenuBar->addMenu(FileMenu);

将文件菜单添加到主菜单栏中。

为文件菜单添加打开文件、保存文件、关闭的动作:
openFileMenu=new QAction(QIcon(":/resimage/open.png"),"打开文件");
openFileMenu->setShortcut(QKeySequence("Ctrl+O"));
FileMenu->addAction(openFileMenu);
saveFileMenu=new QAction(QIcon(":/resimage/save.png"),"保存文件");
saveFileMenu->setShortcut(QKeySequence("Ctrl+S"));
FileMenu->addAction(saveFileMenu);
closeMenu=new QAction(QIcon(":/resimage/close.png"),"退出");
closeMenu->setShortcut(QKeySequence("Ctrl+X"));
FileMenu->addAction(closeMenu);

可以跳到QAction的头文件进行查看其构造函数:

可以知道,创建动作时,可以通过构造函数为其添加图标、标题和父窗口指针。

所以这里采用第三种构造函数,在创建时,就为其添加好图标。

setShortcut(QKeySequence("设置的键"))是Qt框架中为动作或控件设置键盘快捷键的核心方法。

该方法将组合键绑定到目标对象(如QAction或QPushButton),当用户按下该组合键时,会触发对象关联的信号(如QAction的triggered信号或按钮的clicked信号)。快捷键支持跨平台统一处理,在Windows/Linux/macOS中均能生效。

快捷键事件由Qt事件系统全局监听,通过QShortcut类实现底层拦截。当检测到匹配按键时,会直接调用目标对象的槽函数,效果等同于用户手动点击。作用范围默认为当前窗口(Qt::WindowShortcut),可通过setContext()调整。

创建号动作之后还是和之前一样,将动作添加到文件菜单项中。

效果如下:

创建工具栏:

toolBar=new QToolBar("工具栏",this);
//设置工具栏的停靠位置为左边、右边和上边
toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea|Qt::TopToolBarArea);
//设置工具栏的浮空状态,将其关闭
toolBar->setFloatable(false);
//将打开文件、保存文件和关闭动作添加到工具栏中
toolBar->addAction(openFileMenu);
toolBar->addAction(saveFileMenu);
toolBar->addAction(closeMenu);
//将工具栏添加到主窗口中,并设置默认停靠位置为上边
this->addToolBar(Qt::TopToolBarArea,toolBar);
//添加了分割线
toolBar->addSeparator();
//设置字体和颜色按钮的图标并添加到工具栏中
FontButton=new QToolButton(toolBar);
FontButton->setText("字体");
FontButton->setIcon(QIcon(":/resimage/Font.png"));
//添加按钮
toolBar->addWidget(FontButton);
ColorButton=new QToolButton(toolBar);
ColorButton->setText("颜色");
ColorButton->setIcon(QIcon(":/resimage/Color.png"));
toolBar->addWidget(ColorButton);
//添加分割线
toolBar->addSeparator();

addSeparator() 是 Qt 框架中用于在菜单、工具栏或布局中插入分隔符的常用方法。

addWidget() 允许将任意 QWidget 子类‌(如 QToolButtonQLabelQComboBox 等)直接添加到工具栏中。

效果如下:

连接信号和槽函数:

打开文件:

点击打开文件之后设置一个文件弹窗,然后选择文件进行打开,将文件内容写入到文本编辑框中进行显示。

connect(openFileMenu,&QAction::triggered,this,[=](){QString FileDir=QFileDialog::getOpenFileName(this,"文件管理","./","所有文件(*.*);;文本文件(*.txt);;源码(*.cpp *.h *.c)");if(FileDir.isNull()){return;}QFile file(FileDir);file.open(QIODevice::ReadOnly);if(!file.isOpen()){QMessageBox::information(this,"提示","文件打开失败",QMessageBox::Ok);return;}textEdit->clear();while(!file.atEnd()){textEdit->append(QString(file.readAll()));}file.close();
});

可以看到getOpenFileName()函数的返回值是QString,所以创建一个QString类型的变量来接收返回的文件路径。对其进行判断是否为空,判断是否选择了文件,如果没有选择直接结束,如果选择了文件,那么创建一个QFile类来对该文件进行操作,设置为只读操作,判断是否成功打开,如果没有成功打开,那么弹出提示框并结束。如果打开,那么将文件中的内容写入到文本编辑框中。

保存文件:

connect(saveFileMenu,&QAction::triggered,this,[=](){QString FileDir=QFileDialog::getSaveFileName(this,"资源管理","./","所有文件(*.*);;文本文件(*.txt);;编译文件(*.cpp *.h *.c)");if(FileDir.isNull()){return;}QFile file(FileDir);file.open(QIODevice::WriteOnly|QIODevice::Truncate);if(!file.isOpen()){QMessageBox::information(this,"提示","保存文件失败",QMessageBox::Ok);return;}file.write(textEdit->document()->toPlainText().toStdString().c_str());file.close();
});

保存文件和打开文件整体上流程是相同的,不同的是,必须将创建的QFile类的权限设置为可写,这样才能将文本编辑框中的文本写入到创建的文件当中。

textEdit->document()->toPlainText()
获取文本编辑控件中的纯文本内容(去除富文本格式),返回QString类型对象。

toStdString()
QString转换为C++标准库的std::string类型,便于跨平台处理字符串编码。

c_str()
std::string转换为C风格字符串(const char*),这是QFile::write()方法所需的参数类型。

file.write()
调用QFile的写入方法,将转换后的字符串内容写入已打开的文件中。需确保文件已通过open()以可写模式(如QIODevice::WriteOnly)打开。

关闭:

connect(closeMenu,&QAction::triggered,this,[=](){this->close();
});

直接关闭当前窗口。

字体设置:

connect(FontButton,&QToolButton::clicked,this,[=](){bool ok=false;QFont font=QFontDialog::getFont(&ok,this);if(!ok){return;}textEdit->setFont(font);textEdit->setCurrentFont(font);
});

bool ok=false;
声明布尔变量ok用于接收字体选择是否成功的状态,初始值为false。

QFont font=QFontDialog::getFont(&ok,this);
调用静态函数QFontDialog::getFont()打开字体选择对话框。

参数&ok传递ok变量的地址,对话框关闭后会更新其值(true表示用户确认选择),参数this指定父窗口,返回值是用户选择的QFont对象。

if(!ok) return;
如果用户取消选择(ok为false),则直接返回不执行后续操作。

textEdit->setFont(font);
将选择的字体应用到QTextEdit控件的全局字体样式。

textEdit->setCurrentFont(font);
设置当前光标位置或选中文本的字体样式,会覆盖全局字体设置。
与setFont()的区别在于:setCurrentFont()仅影响当前选区/插入点的格式,而setFont()影响整个控件。

颜色设置:

connect(ColorButton,&QToolButton::clicked,this,[=](){QColor color=QColorDialog::getColor(QColor(Qt::white),this,"颜色框");if(!color.isValid()){return;}QTextCharFormat tcfmp;tcfmp.setForeground(QBrush(color));textEdit->mergeCurrentCharFormat(tcfmp);
});

通过QColorDialog::getColor()静态方法弹出颜色选择窗口,参数QColor(Qt::white)设置默认初始颜色为白色,this指定父窗口,"颜色框"为对话框标题。若用户取消选择或关闭窗口,返回的color.isValid()为false,直接退出函数。

QTextCharFormat类是Qt框架中用于处理富文本字符格式化的核心类,继承自QTextFormat,主要用于设置和修改文本的视觉属性和功能特性。创建QTextCharFormat对象tcfmp,调用setForeground()方法将用户选择的颜色(通过QBrush包装)设置为文本前景色。该操作会修改格式对象中的字体颜色属性。

mergeCurrentCharFormat(tcfmp)是Qt富文本处理中的关键方法,用于将指定的字符格式(QTextCharFormat对象)合并到当前光标选区或插入点位置,通过textEdit->mergeCurrentCharFormat(tcfmp)将设置好的文本格式合并到当前光标选区或输入位置。若存在选中文本则修改选中部分颜色,否则对后续输入文本生效。

完整代码:

MainWindow代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include 
#include 
#include 
#include 
#include 
#include 
#include 
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);~MainWindow();void createMenuBar();
private:Ui::MainWindow *ui;QMenuBar* newmenuBar;QMenu* FileMenu;QAction* openFileMenu;QAction* saveFileMenu;QAction* closeMenu;QToolBar* toolBar;QToolButton* FontButton;QToolButton* ColorButton;QTextEdit* textEdit;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle("文件编辑器");this->setWindowIcon(QIcon(":/resimage/downloaded-image.png"));textEdit=new QTextEdit(this);this->setCentralWidget(textEdit);createMenuBar();connect(openFileMenu,&QAction::triggered,this,[=](){QString FileDir=QFileDialog::getOpenFileName(this,"文件管理","./","所有文件(*.*);;文本文件(*.txt);;源码(*.cpp *.h *.c)");if(FileDir.isNull()){// QMessageBox::information(this,"提示","文件打开失败",QMessageBox::Ok);return;}QFile file(FileDir);file.open(QIODevice::ReadOnly);if(!file.isOpen()){QMessageBox::information(this,"提示","文件打开失败",QMessageBox::Ok);return;}textEdit->clear();while(!file.atEnd()){textEdit->append(QString(file.readAll()));}file.close();});connect(saveFileMenu,&QAction::triggered,this,[=](){QString FileDir=QFileDialog::getSaveFileName(this,"资源管理","./","所有文件(*.*);;文本文件(*.txt);;编译文件(*.cpp *.h *.c)");if(FileDir.isNull()){return;}QFile file(FileDir);file.open(QIODevice::WriteOnly|QIODevice::Truncate);if(!file.isOpen()){QMessageBox::information(this,"提示","保存文件失败",QMessageBox::Ok);return;}file.write(textEdit->document()->toPlainText().toStdString().c_str());file.close();});connect(FontButton,&QToolButton::clicked,this,[=](){bool ok=false;QFont font=QFontDialog::getFont(&ok,this);if(!ok){return;}textEdit->setFont(font);textEdit->setCurrentFont(font);});connect(ColorButton,&QToolButton::clicked,this,[=](){QColor color=QColorDialog::getColor(QColor(Qt::white),this,"颜色框");if(!color.isValid()){return;}QTextCharFormat tcfmp;tcfmp.setForeground(QBrush(color));textEdit->mergeCurrentCharFormat(tcfmp);});connect(closeMenu,&QAction::triggered,this,[=](){this->close();});
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::createMenuBar()
{newmenuBar=this->menuBar();this->setMenuBar(newmenuBar);//创建文件菜单项FileMenu=new QMenu("文件");newmenuBar->addMenu(FileMenu);//添加文件子菜单项openFileMenu=new QAction(QIcon(":/resimage/open.png"),"打开文件");openFileMenu->setShortcut(QKeySequence("Ctrl+O"));FileMenu->addAction(openFileMenu);saveFileMenu=new QAction(QIcon(":/resimage/save.png"),"保存文件");saveFileMenu->setShortcut(QKeySequence("Ctrl+S"));FileMenu->addAction(saveFileMenu);closeMenu=new QAction(QIcon(":/resimage/close.png"),"退出");closeMenu->setShortcut(QKeySequence("Ctrl+X"));FileMenu->addAction(closeMenu);//创建工具栏toolBar=new QToolBar("工具栏",this);toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea|Qt::TopToolBarArea);toolBar->setFloatable(false);toolBar->addAction(openFileMenu);toolBar->addAction(saveFileMenu);toolBar->addAction(closeMenu);this->addToolBar(Qt::TopToolBarArea,toolBar);toolBar->addSeparator();FontButton=new QToolButton(toolBar);FontButton->setText("字体");FontButton->setIcon(QIcon(":/resimage/Font.png"));toolBar->addWidget(FontButton);ColorButton=new QToolButton(toolBar);ColorButton->setText("颜色");ColorButton->setIcon(QIcon(":/resimage/Color.png"));toolBar->addWidget(ColorButton);toolBar->addSeparator();
}

主函数:

#include "mainwindow.h"
#include 
int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

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

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

相关文章

购买网站空间后怎么做海南省官网

path_provider获取应用存储路径path_provider是flutter提供的一个获取应用存储路径的插件,它封装了统一的api来获取Android和ios两个平台的应用存储路径,提供的api如下:getTemporaryDirectory():获取应用临时文件夹,该…

长沙建设工程造价网站wordpress连接服务器配置

戳“在看”一起来充电吧!C语言的那些经典程序 第十四期本期小C给大家带来三个用C语言解决实际问题的典例。如果全都理解,相信肯定能给大家带来收获!接下来让我们看看是哪些程序吧!1字符查找源程序:运行结果:程序分析:该…

DeepSeek-V3.2-Exp 完整分析:2025年AI模型突破与稀疏注意力技术深度解析

DeepSeek-V3.2-Exp 完整分析:2025年AI模型突破与稀疏注意力技术深度解析DeepSeek-V3.2-Exp是DeepSeek AI于2025年9月29日发布的实验性大语言模型,标志着该公司在AI架构创新方面的重要里程碑。作为V3.1-Terminus的升级…

Java EE初阶启程记05---线程安全 - 指南

Java EE初阶启程记05---线程安全 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

查域名优化方案2022

简介 上篇文章已经介绍了数据类型,如INTERGER TYPE、BITMASK TYPE、STRING TYPE、LINK LAYER ADDRESS TYPE、 IPV4 ADDRESS TYPE、 IPV6 ADDRESS TYPE、BOOLEAN TYPE、ICMP TYPE、CONNTRACK TYPES等。那么本篇文章主要介绍PRIMARY表达式的相关内容。 PRIMARY EXPR…

tldr的安装与利用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站内容授权书下列关于网站开发中网友上传

基于matlab的结构有限元分析。包括基于4节点四面体单元的空间块体分析、基于4节点四边形单元的矩形薄板分析、基于3节点三角形单元的矩形薄板分析、三梁平面框架结构的有限元分析、四杆桁架结构的有限元分析、基于8节点六面体单元的空间块体分析。每个程序都要相应的文档说明。…

DataGridView表格控件使用说明

可以添加和编辑列设置头部设置列的样子:设置高度 ,需要多个属性配合使用完全居中 ,每个列都需要进行设置效果展示:数据绑定 先设置属性public class SysAlarm{public string AlarmTime { get; set; }public string…

题解:P7126 [Ynoi2008] rdCcot

题意:很简单了,不再赘述。 做法: 考虑怎么数连通块,钦定一个代表元,因为这个东西是 \(C\) 邻域状物,跟深度有关,我们可以考虑一下 bfs 序,那么我们就以 bfs 序最小的元素为代表元。 然后我们就要考虑一个元素什…

阿里云网站 模板建设装修公司报价如何计算

查看源码发现 PHP非法参数名传参问题,详细请参考我的这篇文章:谈一谈PHP中关于非法参数名传参问题 正则这里绕过使用%0a换行符绕过,payload: /?b.u.p.t23333%0a 得到下一步信息:secrettw.php 注释中的是JsFuck,用这…

网站开发项目拖延周期免费建设视频网站

作者 | 徐运元,杭州谐云科技合伙人及资深架构师,云计算行业和 Kubernetes 生态资深从业者 导读:什么是 OAM?2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小…

毕业答辩为什么做网站网站建设云技术公司推荐

1.PC按键控制 移动摄像头:WSADQE、鼠标右键 模拟双手:左手(左Shift)、右手(右Shift) 将模拟的双手保持在视野中:T或Y 旋转模拟手部:按住Ctrl并移动鼠标 捏合手势:左Shift/空格 + 鼠标左键 2.常用脚本 (1)HandInteractionTouch(需搭配NearInteractionTouchableVolum…

专业的网站开发团队xampp php网站模板

相关免费学习推荐:python视频教程原理十进制转n进制都可以使用倒除法:对十进制进行除n的运算,直到商为0为止,然后将各个步骤中得到的余数倒着写出来.n进制转十进制:(例子:二进制转十进制)101001 > 2^5 …

灰系网站深圳建站公司兴田德润放心

.gitignore简介 .gitignore文件是Git 版本控制系统中的一个重要配置文件,它用于指定哪些文件或目录应该被Git忽略,即不被纳入版本控制中。 .gitignore编写规则 在文件中添加要忽略的文件和目录的模式。每一行表示一个模式。 使用通配符来匹配多个文件或目…

网站备案 备注关联性沈阳男科最好的男科医院

1、首先配置正确Project Struct 保证需要引用的jar包库添加到Libraries里,尽管添加到Modules里依然可以测试运行或调试,但导出的jar包会遇到问题。 2、导出jar,方式选择如下 选择”From modules with dependencies" 然后去掉以上“Extr…

MyBatis技术详解:从入门到高效开发 - 详解

MyBatis技术详解:从入门到高效开发 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

做美食网站有哪些网络广告策略有哪些

本博客主要讲述Center的审计策略表安装和策略添加 使用事务添加 1、开启事务 my->StartTransaction(); 2、编写sql语句 //清除原来数据,防止数据污染my->Query("DROP TABLE IF EXISTS t_strategy");string sql "CREATE TABLE t_strategy (…

解码数据结构队列

队列的基础原理 核心定义与原则本质:队列(Queue)是线性结构,与栈同属线性存储,核心差异在于操作原则:栈遵循 “后进先出(LIFO)”,仅允许一端操作; 队列遵循 “先进先出(FIFO,First Input First Output)”,…

实用指南:Linux Shell 脚本:从零到进阶的实战笔记

实用指南:Linux Shell 脚本:从零到进阶的实战笔记pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

解决升级 Windows 11 24H2 后 NAS 共享无法显示的问题

问题原因 Windows 11 24H2 策略强制默认只能访问签名的 SMB 共享用户,并且不允许使用 不安全的来宾(Guest)登录 模式连接文件共享。 解决方法 终端管理员模式下依次运行: Set-SmbClientConfiguration -RequireSecu…