Qt多文本编辑器项目实战
0x00 引言
本文将详细讲解如何使用Qt实现一个多文本编辑器。涉及的话题包括:Qt框架基础、窗体布局、文本编辑、拓展功能等等。
在阅读本文之前,你需要掌握基本的C++编程知识和Qt框架的使用方法。
0x01 新建Qt项目
在Qt Creator中,新建一个Qt Widgets Application,选取项目名称和路径后直接点击下一步。
在下一个页面,根据自己的需要选取要使用的Qt版本,建议选取较新的版本以兼容更多的功能。接下来勾选要使用的模块,这个项目中需要用到Qt Widgets和Qt Gui两个模块。
最后,点击生成按钮完成新建项目的过程。
0x02 窗口布局
在Qt中,可以使用设计师来定制各种控件的布局,但这里我们将采用手动编写代码的方式实现窗口布局。
在代码中,创建一个继承自QWidget的MyWidget类。在这个类中实现窗口的各种控件,例如菜单栏、文本框、标签、按钮等等。
示例代码:
class MyWidget : public QWidget
{Q_OBJECTpublic:MyWidget(QWidget *parent = nullptr);~MyWidget();private:QLabel *label;QTextEdit *text_edit;QPushButton *button;void init();void init_layout();void init_connections();
};
对于界面的布局和控件的设置,我们可以在init()函数中进行操作。具体实现如下:
老舅推荐:C++Qt项目教程(视频+代码):Qt实战-word文档编辑器软件
Qt-MP3音乐播放器搜索引擎项目
如果你正在挑战Qt开发岗位
这里的每一个项目都能征服你的面试leader,斩获满意offer。
void MyWidget::init()
{label = new QLabel("文本编辑器", this);text_edit = new QTextEdit(this);button = new QPushButton("保存", this);init_layout();init_connections();
}void MyWidget::init_layout()
{QVBoxLayout *main_layout = new QVBoxLayout(this);main_layout->addWidget(label);main_layout->addWidget(text_edit);main_layout->addWidget(button);
}
在这里,我们使用QVBoxLayout、QHBoxLayout等布局管理器来实现控件的布局和排列。
0x03 文本编辑
在多文本编辑器中,文本编辑是重中之重。使用Qt可以非常简单地实现文本编辑功能。在MyWidget类的init()函数中,通过new关键字创建一个QTextEdit对象以实现文本编辑。
text_edit = new QTextEdit(this);
在文本编辑的使用过程中,我们需要掌握QTextEdit对象的各种方法。
例如,设置文本内容:
text_edit->setText("hello world.");
设置文本样式:
QFont font("Times", 16, QFont::Bold);
text_edit->setFont(font);
获取文本内容:
QString text = text_edit->toPlainText();
保存文本内容:
QString filename = QFileDialog::getSaveFileName(this, tr("保存文件"), "", tr("文本文件 (*.txt)"));if (!filename.isNull()) {QFile file(filename);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {QMessageBox::warning(this, tr("警告"), tr("无法保存文件:") + filename, QMessageBox::Ok);}QTextStream out(&file);out << text_edit->toPlainText();
}
更多QTextEdit的方法可以在Qt的官方文档中查看。
0x04 拓展功能
在多文本编辑器中,除了基本的文本编辑功能,还需要拓展一些常用的功能,如新建、打开、保存、撤销、重做等等。
我们在MyWidget类的init()函数中创建QPushButton对象,并在init_connections()中实现各种按钮的操作。
例如,打开文件:
void MyWidget::on_open_button_clicked()
{QString filename = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("文本文件 (*.txt)"));if (!filename.isNull()) {QFile file(filename);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {QMessageBox::warning(this, tr("警告"), tr("无法打开文件:") + filename, QMessageBox::Ok);}QTextStream in(&file);text_edit->setText(in.readAll());}
}
更多拓展功能的代码可以在Qt之家的项目源码中查看。
0x05 总结
在本文中,我们通过实例演示了如何使用Qt框架创建一个多文本编辑器。其中,包括了新建Qt项目、窗口布局、文本编辑、拓展功能等多个方面。
在实际开发过程中,我们可以根据需求来拓展自己的功能,例如实现搜索、替换、拷贝、粘贴、恢复、查找等功能,以达到更好的使用体验。
示例1:使用QFileDialog类创建打开、保存文件的功能
void MyWidget::on_open_button_clicked()
{QString filename = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("文本文件 (*.txt)"));if (!filename.isNull()) {QFile file(filename);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {QMessageBox::warning(this, tr("警告"), tr("无法打开文件:") + filename, QMessageBox::Ok);}QTextStream in(&file);text_edit->setText(in.readAll());}
}void MyWidget::on_save_button_clicked()
{QString filename = QFileDialog::getSaveFileName(this, tr("保存文件"), "", tr("文本文件 (*.txt)"));if (!filename.isNull()) {QFile file(filename);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {QMessageBox::warning(this, tr("警告"), tr("无法保存文件:") + filename, QMessageBox::Ok);}QTextStream out(&file);out << text_edit->toPlainText();}
}
示例2:设置快捷键,使用Ctrl+S保存文件
void MyWidget::init_connections()
{connect(button, &QPushButton::clicked, this, &MyWidget::on_save_button_clicked);connect(text_edit, &QTextEdit::textChanged, this, &MyWidget::on_text_changed);
}void MyWidget::on_save_button_clicked()
{QString filename = QFileDialog::getSaveFileName(this, tr("保存文件"), "", tr("文本文件 (*.txt)"));if (!filename.isNull()) {QFile file(filename);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {QMessageBox::warning(this, tr("警告"), tr("无法保存文件:") + filename, QMessageBox::Ok);}QTextStream out(&file);out << text_edit->toPlainText();}
}void MyWidget::keyPressEvent(QKeyEvent *event)
{if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_S) {on_save_button_clicked();}
}
这里我们实现了一个快捷键,即使用Ctrl+S键保存文件。在keyPressEvent()函数中,我们捕捉用户的按键操作并执行自定义的操作。
相关文章:
Qt多文本编辑器项目实战
0x00 引言 本文将详细讲解如何使用Qt实现一个多文本编辑器。涉及的话题包括:Qt框架基础、窗体布局、文本编辑、拓展功能等等。 在阅读本文之前,你需要掌握基本的C编程知识和Qt框架的使用方法。 0x01 新建Qt项目 在Qt Creator中,新建一个Q…...
CVE-2017-7529 Nginx越界读取内存漏洞
漏洞概述 当使用Nginx标准模块时,攻击者可以通过发送包含恶意构造range域的header请求,来获取响应中的缓存文件头部信息。在某些配置中,缓存文件头可能包含后端服务器的IP地址或其它敏感信息,从而导致信息泄露。 影响版本 Ngin…...
力扣每日一题136:只出现一次的数字
题目描述: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 &#…...
导航栏参考代码
导航栏参考代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>导航栏参考代码</title> </head> <body> <table width"858" border"0" align"center"><tr&g…...
区块链(11):java区块链项目之页面部分实现
addPeer.html <!DOCTYPE html> <html> <head><meta charset="utf-8"> <title>java区块链</title><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="styles…...
RootSIFT---SIFT图像特征的扩展
RootSIFT是论文 Three things everyone should know to improve object retrieval - 2012所提出的 A Comparative Analysis of RootSIFT and SIFT Methods for Drowsy Features Extraction - 2020 当比较直方图时,使用欧氏距离通常比卡方距离或Hellinger核时的性能…...
ChatGPT角色扮演教程,Prompt词分享
使用指南 1、可直复制使用 2、可以前往已经添加好Prompt预设的AI系统测试使用 https://ai.idcyli.comhttps://ai.idcyli.com 雅思写作考官 我希望你假定自己是雅思写作考官,根据雅思评判标准,按我给你的雅思考题和对应答案给我评分,并且按…...
zabbix监控——自定义监控内容
目录 自定义监控项步骤 案例 1、明确需要执行的命令 2、创建 zabbix 的监控项配置文件,用于自定义 key,并重启zabbix-agent2 3、.在服务端验证新建的监控项 4、在 Web 页面创建自定义监控项模板 1)创建模板 2)创建监控项 …...
中断机制-中断协商机制、中断方法
4.1 线程中断机制 4.1.1 从阿里蚂蚁金服面试题讲起 Java.lang.Thread下的三个方法: 4.1.2 什么是中断机制 首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,…...
three.js入门 —— 实现第一个3D案例
前言: three.js入门,根据文档实现第一个3D案例 效果图: 代码实现: const scene new THREE.Scene();//创建一个长方体几何对象Geometryconst geometry new THREE.BoxGeometry(100, 100, 100);//创建一个网络基础材质的材质对象…...
《动手学深度学习 Pytorch版》 8.4 循环神经网络
8.4.1 无隐状态的神经网络 对于无隐藏装态的神经网络来说,给定一个小批量样本 X ∈ R n d \boldsymbol{X}\in\mathbb{R}^{n\times d} X∈Rnd,则隐藏层的输出 H ∈ R n h \boldsymbol{H}\in\mathbb{R}^{n\times h} H∈Rnh 通过下式计算: …...
什么是物联网阀控水表?
物联网阀控水表是一种新型的水表,结合了物联网技术和传统水表的功能,可以实现对水的计量、控制和管理。随着人们对水资源的日益重视,物联网阀控水表的应用越来越广泛,为水资源的合理利用和管理提供了有效手段。 物联网阀控水表是由…...
Kafka 开启SASL/SCRAM认证 及 ACL授权(一)认证
Kafka 开启SASL/SCRAM认证 及 ACL授权(一)认证。 kafka安全涉及3部份:传输加密,用户认证与授权,ZK开启ACL(Zookeeper存储了kafka的元数据以及用户信息,默认不开启acl所有用户可改,内网环境机器不对外开放可考虑使用默认不开启ZK ACL)。 官网地址:https://kafka.ap…...
关于智能控制领域中模糊控制算法的概述
智能控制领域中的模糊控制算法是一种基于模糊逻辑的控制策略,它通过对模糊集合的刻画来处理模糊信息,从而获得模糊输出并进行控制。模糊控制算法在实际控制工程中具有良好的应用前景,它不但具有较强的鲁棒性和适应性,而且可以为复…...
剖析伦敦银最新价格走势图
国际金融市场瞬息万变,伦敦银的价格走势会受到诸多因素的影响,比如重要经济数据的公布,国际间的政治博弈,突发的政经大事,都可以令白银价格的走势,在短时间内暴涨暴跌的情况。 要在伦敦银市场实现良好的收益…...
通用人工智能技术(深度学习,大模型,Chatgpt,多模态,强化学习,具身智能)
目录 前言 1.通用人工智能 1.1 生物学分析 1.2具身智能 1.2.1当前的人工智能的局限 1.2.2 具身智能实现的基础 1.2.3 强化学习(决策大模型) 2.结论 往期文章 参考文献 前言 目前的人工智能实质上只是强人工智能,或者说单个领域的通…...
makefile的特性-部分语法记录
1.变量定义 1.1 来实现a1 $(a2)a2 lib.o1.2 : 来实现, 这种不能通过后面的变量来定义a1 : $(a2) b.0a2 : lib.o1.3 来实现a1 b.0a2 a11.4 ? 来实现,这种方式前面如果定义了,后面定义则无效a1 : a.oa1 ? lib.o //结果 a1 a.o 2.文件查找 2.1 VPATH 目录…...
【Java 进阶篇】JavaScript 正则表达式(RegExp)详解
JavaScript 正则表达式,通常简写为 RegExp,是一种强大的文本匹配工具,它允许你通过一种灵活的语法来查找和替换字符串中的文本。正则表达式在编程中用途广泛,不仅限于 JavaScript,在许多编程语言中也都有类似的实现。 …...
51单片机之串口通信例程
51单片机之串口通信例程 简介原理例程 简介 串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。在串行通信中,数据可以以字符为单位进行传输,也可以以帧为单位进行传输。 在51单片机中&a…...
Hadoop高可用集群(HA)一键启动脚本
高可用集群启动时,需要分别在每个节点上都执行zkServer.sh start启动zookeeper,这个过程比较麻烦,并且当我们节点增多时,这个过程无疑不增加了我们的工作量,因此我们可以写一个一键启动所有节点zookeeper的脚本 脚本实…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
