news 2026/5/8 11:15:04

QT软件开发知识点流程及记事本开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QT软件开发知识点流程及记事本开发

1.界面设计

我们通过选用基本的控件来设计出下面的ui界面:

当然我们的效果还要有选项中的图形显示,如下图所示:

这里的图标我们可以通过阿里巴巴图标库获取,然后将其添加到我们的资源文件中即可,因为对于软件图标只能使用ico格式图片,但是阿里巴巴图标库里面并没有提供该图片格式,所以我们可以通过我们前面开发的图片格式转化工具来进行格式的转化。

2.程序详解

我们设计好了界面之后我们就可以开始进行程序的编写了。程序及详解如下:

void MainWindow::on_textEdit_textChanged() { if(fileName.isEmpty()) { this->setWindowTitle(tr("*无标题 - 记事本")); } else { this->setWindowTitle(tr("*") + QFileInfo(fileName).fileName() + tr(" - 记事本")); } saveflag = true; //textedit没有保存 }

首先我们来编写文本改变的槽函数,但我们像文本框控件中输入了文本后就会进入到该槽函数,该函数的主要功能就是实现在我们输入文本后窗口的标题会多出一个*,表示未被保存。当打开文件改变文本里面的内容后窗口标题则显示出*,同样表示未保存。

void MainWindow::on_action_new_triggered() { if(saveflag) { QMessageBox msgBox; msgBox.setText("记事本"); msgBox.setInformativeText("Do you want to save your changes?"); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Save); int ret = msgBox.exec(); qDebug() << "ret:" <<ret; switch (ret) { case QMessageBox::Save: // Save was clicked //保存textedit on_action_save_triggered(); //这里的保存直接调用保存的槽函数即可 break; case QMessageBox::Discard: // Don't Save was clicked //清空textedit break; case QMessageBox::Cancel: // Cancel was clicked //不做处理 return; break; default: // should never be reached break; } } ui->textEdit->clear(); fileName.clear(); //清空文件路径名 this->setWindowTitle(tr("无标题 - 记事本")); //再次设置一遍窗口标题,解决新建时的显示问题 saveflag = false; }

该槽函数的功能是在新建时如果有文本,我们就会提示是否保存通过你的选择来对文本进行操作。我们的提示时通过一个新的窗口进行提示,那么这个是怎么来实现呢,我们看可以通过qt软件里面一个非常强大的功能来找到完成的思路。我们可以通过qt软件里面的搜索功能,搜索到对应的类的详解,如下:

通过阅读官方给我们例程然后修改即可来实现我们想要一个提示窗的功能了,以及选了提示窗对应的处理,我们只需要实现对应分支里面的处理即可。

void MainWindow::on_action_save_triggered() { if(fileName.isEmpty()) { fileName = QFileDialog::getSaveFileName(this,tr("保存 文件"),".",tr("Files (*.txt);;")); if(fileName.isEmpty()) { return; } } qDebug() << "fileName:" << fileName; QFile file(fileName); //创建一个文件对象 if(!file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)) { return; } //以指定方式打开文件 file.write(ui->textEdit->toPlainText().toUtf8()); //将文本编辑器的内容写入到打开的文件中 file.close(); //关闭文件 saveflag = false; //textedit已保存 this->setWindowTitle(QFileInfo(fileName).fileName() + tr(" - 记事本")); //保存完成后更改窗口名 }

这里我们实现的是保存功能,通过获取到文件路径名,然后文件操作的类来操作文件即可实现文件的保存。

oid MainWindow::on_action_open_triggered() { if(saveflag) //在打开之前textedit有改变,没有保存,要先弹窗判断选择是否保存 { QMessageBox msgBox; msgBox.setText("记事本"); msgBox.setInformativeText("Do you want to save your changes?"); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Save); int ret = msgBox.exec(); qDebug() << "ret:" <<ret; switch (ret) { case QMessageBox::Save: // Save was clicked //保存textedit on_action_save_triggered(); //这里的保存直接调用保存的槽函数即可 break; case QMessageBox::Discard: // Don't Save was clicked //清空textedit break; case QMessageBox::Cancel: // Cancel was clicked //不做处理 return; break; default: // should never be reached break; } } fileName = QFileDialog::getOpenFileName(this,tr("打开 文件"),".",tr("Files (*.txt);;")); //获取打开文件路径名 qDebug() << "fileName:" << fileName; QFile file(fileName); if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) { return ; } QByteArray data = file.readAll(); //读出打开文件中内容,带编码格式 ui->textEdit->setText(QString(data)); file.close(); this->setWindowTitle(QFileInfo(fileName).fileName() + tr(" - 记事本")); saveflag = false; }

这里我们要实现的是打开文件功能,当然如果在打开新的文本文件时我们原来的文本里面有内容没有被保存,我们就会弹出一个提示窗来提示你是否保存,防止原来编辑的文本丢失。我们打开文件的实现也时通过获取到文件路径名,然后通过QFile类来对文件进行操作,因为原来我们打开文件的文本会有这自己的格式,所以我们要采用格式化打开文本,不能将原来文本的格式修改了。所以我们使用了QByteArray来读出里面带编码格式的内容。

void MainWindow::on_action_saveas_triggered() { fileName = QFileDialog::getSaveFileName(this,tr("保存 文件"),".",tr("Files (*.txt);;")); if(fileName.isEmpty()) { return; } qDebug() << "fileName:" << fileName; QFile file(fileName); //创建一个文件对象 if(!file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)) { return; } //以指定方式打开文件 file.write(ui->textEdit->toPlainText().toUtf8()); //将文本编辑器的内容写入到打开的文件中 file.close(); //关闭文件 saveflag = false; //textedit已保存 this->setWindowTitle(QFileInfo(fileName).fileName() + tr(" - 记事本")); //保存完成后更改窗口名 }

接下来在该函数中我们实现另存为的功能,在另存为中以为以另存所以我们不必判断这个文件是否为空都需要在点击了给控件之后就要实现文件的保存,所以只需要将原来保存文件控件的功能中的判断文件是否为空给去掉即可实现另存为的功能了。

void MainWindow::on_action_print_triggered() { QPrinter printer; //打印机对象 QPrintDialog printDialog(&printer , this); if (printDialog.exec() == QDialog::Accepted) { // print ... ui->textEdit->print(&printer); //将textedit内容输出到打印机中 } }

这里我们实现打印的功能通过,QPrinter类和QPrintDialog类来实现,具体的实现我们也可以参考官方例程如下:

void MainWindow::on_action_quit_triggered() { this->close(); //关闭窗体 }

接着我们实现退出的控件功能,对于退出来说我们只需要使用close将窗口关闭即可,但是我们要考虑到的是如果我们的记事本中有文本的话,我们就不能直接进行关闭了所以我们要使用qt中的事件来实现关闭之前有内容如何处理的功能程序如下:

void MainWindow::closeEvent(QCloseEvent *event) { if(saveflag) { QMessageBox msgBox; msgBox.setText("记事本"); msgBox.setInformativeText("Do you want to save your changes?"); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Save); int ret = msgBox.exec(); qDebug() << "ret:" <<ret; switch (ret) { case QMessageBox::Save: // Save was clicked //保存textedit on_action_save_triggered(); //这里的保存直接调用保存的槽函数即可 event->accept(); //传递事件 break; case QMessageBox::Discard: // Don't Save was clicked //清空textedit event->accept(); break; case QMessageBox::Cancel: // Cancel was clicked //不做处理 event->ignore(); //忽视事件 break; default: // should never be reached break; } } }

以为该事件函数是继承自父类的,所以我们要在mainwindow中声明出该函数并且重写其功能。这里实现的功能就是在关闭时判断文本内容是否保存,弹出提示窗供我们选择,当我们选择保存时调用前面写的保存槽函数即可,当我们选择不保存时,直接关闭记事本即可。当我们选择取消时我们就要通过ignore来忽视该事件,停止关闭该窗口的事件。

至此我们记事本第一个选项的功能都实现完成了,我们来看看我们记事本中的第二个功能要实现的是什么呢,如图:

接下来我们继续实现第二个选项中的这些功能。

void MainWindow::on_action_copy_triggered() { ui->textEdit->copy(); //复制textedit选中文本 } void MainWindow::on_action_cut_triggered() { ui->textEdit->cut(); //剪切textedit选中文本 } void MainWindow::on_action_paste_triggered() { ui->textEdit->paste(); //粘贴粘贴板中的文本 } void MainWindow::on_action_redo_triggered() { ui->textEdit->redo(); //恢复操作 } void MainWindow::on_action_undo_triggered() { ui->textEdit->undo(); //撤销操作 }

可见对于第二个选项的功能实现我们只需要调用qt给我们提供的函数即可实现。第二选项的实现还是比较简单的,下面我们来实现第三选项:

首先对于字体的设置我们通过查看官方例程即可实现如:

void MainWindow::on_action_font_triggered() { bool ok; QFont font = QFontDialog::getFont(&ok, QFont("微软雅黑", 10), this); if (ok) { // the user clicked OK and font is set to the font the user selected } else { // the user canceled the dialog; font is set to the initial // value, in this case Helvetica [Cronyx], 10 } qDebug() << "font:" <<font; ui->textEdit->setFont(font); //设置字体 }

然后我们看粗体斜体和下划线的实现。

void MainWindow::on_action_blod_triggered(bool checked) { qDebug() << "checked:" << checked; if(checked) { ui->textEdit->setFontWeight(QFont::Bold); //设置粗体 } else { ui->textEdit->setFontWeight(QFont::Normal); //设置正常字体 } } void MainWindow::on_action_itlic_triggered(bool checked) { if(checked) { ui->textEdit->setFontItalic(true); //设置斜体 } else { ui->textEdit->setFontItalic(false); //取消斜体 } } void MainWindow::on_action_underline_triggered(bool checked) { if(checked) { ui->textEdit->setFontUnderline(true); //设置下划线 } else { ui->textEdit->setFontUnderline(false); //取消下划线 } }

我们通过调用qt给出的相关函数也是可以实现出来的。然后就是第四个选项帮助的实现了。我们看里首先看图:

这里我们通过点击帮助可以提供一些关于记事本的版本实现,和Qt的简介,程序如下:

void MainWindow::on_action_notepad_triggered() { QMessageBox::about(this,tr("关于记事本"),tr("我的记事本,基于QT5.15.2 ")); } void MainWindow::on_action_qt_triggered() { QMessageBox::aboutQt(this); }

最后就是实现我们第一个选项中还没有实习的中英转化的功能了,对于这个功能的实现可以去参考一些定时计数器的中英文转化的实现基本一样,程序如下:

void MainWindow::on_action_English_triggered(bool checked) { QTranslator translator; qDebug() << "checked:" <<checked; if(checked) { translator.load("translations/en_US.qm"); //将语言转化编译文件装载 QApplication::installTranslator(&translator); //安装一个翻译对象,参数是翻译对象的地址该地址下的文件已经被编译成.qm文件了,将用tr和对象编辑中可以进行语言转化的文字进行转化 ui->retranslateUi(this); //重新初始化ui界面 } else { QApplication::installTranslator(nullptr); //安装一个空的翻译对象,即不翻译,重新初始化后即可显示中文 ui->retranslateUi(this); //重新初始化ui界面 } }

最后将工程编译打包即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 2:34:06

ModernWMS仓库管理系统:从零开始的完整使用指南

想要为你的企业找到一款功能强大又完全免费的仓库管理解决方案吗&#xff1f;ModernWMS正是你需要的选择&#xff01;这个现代化的开源系统专为中小企业设计&#xff0c;提供了从收货到发货的全流程管理能力。今天&#xff0c;我将带你从零开始&#xff0c;一步步掌握这个系统的…

作者头像 李华
网站建设 2026/5/1 0:02:32

云计算技术在企业数字化转型中的应用与实践

一、云计算在企业数字化转型中的核心作用随着数字经济时代的到来&#xff0c;企业数字化转型已成为提升竞争力的关键路径。云计算作为数字化转型的技术基石&#xff0c;正在重塑企业的IT架构和业务模式。从基础设施即服务(IaaS)到软件即服务(SaaS)&#xff0c;云计算为企业提供…

作者头像 李华
网站建设 2026/5/6 19:47:33

新能源汽车换电站行业深度分析

目录行业概览 什么是换电站 换电模式的定义 核心特点 应用场景行业驱动因素 政策支持 中国政策推动 欧盟政策引领 政策影响市场需求 新能源汽车保有量增长 充电效率痛点 市场需求推动技术进步 动力电池标准化 自动化换电设备研发 技术进步影响市场规模与增长 全球市场增长 全球…

作者头像 李华
网站建设 2026/5/6 21:45:56

小爱音箱音乐自由:解锁无限播放新姿势

小爱音箱音乐自由&#xff1a;解锁无限播放新姿势 【免费下载链接】xiaomusic 使用小爱同学播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic "小爱同学&#xff0c;播放周杰伦的《晴天》"——"…

作者头像 李华
网站建设 2026/4/30 22:04:52

Spek音频频谱分析工具完整使用指南

Spek音频频谱分析工具完整使用指南 【免费下载链接】spek Acoustic spectrum analyser 项目地址: https://gitcode.com/gh_mirrors/sp/spek Spek是一款专业的声学频谱分析工具&#xff0c;采用C编写并基于FFmpeg库进行音频解码&#xff0c;配合wxWidgets构建图形用户界面…

作者头像 李华
网站建设 2026/4/30 23:39:31

告别PDF翻译中文乱码:技术诊断与完美解决方案

告别PDF翻译中文乱码&#xff1a;技术诊断与完美解决方案 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/Ollama/OpenAI 等服务&#xff0c;提供 C…

作者头像 李华