当前位置: 首页 > news >正文

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口,其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框,第二个按钮点击时会执行一个特定的操作(在这个例子中,仅打印一条调试信息)。

在这里插入图片描述

功能描述:

  1. 创建窗口和布局: 使用 QWidgetQVBoxLayout 创建主窗口并设置垂直布局,将按钮放置在布局中。

  2. 按钮操作: 创建多个按钮,并且为每个按钮连接了不同的操作,例如显示消息框或执行特定操作。

基础知识点:

  1. QWidget 和布局管理器(QLayout): QWidget 是Qt应用程序中所有用户界面对象的基类,它代表一个窗口或一个控件。QVBoxLayout 是Qt提供的一种布局管理器,用于垂直排列控件。

  2. QPushButton 和信号槽机制: QPushButton 是Qt中的按钮类,通过信号槽机制,按钮的点击事件(clicked信号)连接到槽函数(showMessageBoxperformSpecificAction)来执行相应的操作。

  3. QMessageBox: QMessageBox 是Qt提供的对话框类之一,用于在程序中显示消息框、警告框、错误框等。

  4. 事件循环: Qt中的应用程序需要进入事件循环(QApplication::exec())来响应用户的交互操作,比如按钮点击等。

  5. Q_OBJECT 和元对象系统: Q_OBJECT 宏用于启用Qt的元对象系统,这是信号和槽机制的基础,允许在运行时识别对象及其属性、方法和信号。对包含 Q_OBJECT 的类,需要使用元对象编译器(moc)进行预处理。

示例在Clion中运行步骤:

1. 新建项目

在这里插入图片描述

2. 粘贴代码
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QDebug>class MyMainWindow : public QWidget {
Q_OBJECT
public:explicit MyMainWindow(QWidget *parent = nullptr) : QWidget(parent) {setWindowTitle("实用功能示例");auto *layout = new QVBoxLayout(this);auto *button1 = new QPushButton("显示消息框");connect(button1, &QPushButton::clicked, this, &MyMainWindow::showMessageBox);auto *button2 = new QPushButton("执行特定操作");connect(button2, &QPushButton::clicked, this, &MyMainWindow::performSpecificAction);layout->addWidget(button1);layout->addWidget(button2);setLayout(layout);}private slots:void showMessageBox() {QMessageBox::information(this, "消息", "这是一个消息框示例!");}static void performSpecificAction() {// 执行特定的操作qDebug() << "执行了特定操作!";}
};int main(int argc, char *argv[]) {QApplication a(argc, argv);MyMainWindow mainWindow;mainWindow.show();return QApplication::exec();
}#include "main.moc"

这个示例可以作为一个起点,我们可以进一步添加更多按钮,并且为每个按钮连接不同的功能。Qt提供了丰富的UI组件和信号/槽机制,可以轻松创建具有各种实用功能的用户界面。

3. 编译运行

在这里插入图片描述
在这里插入图片描述

代码拆解,知识点总结

这个示例中的代码涉及了许多Qt中的关键概念和功能。我们来拆分讲解一下示例代码:

🟥 1. 创建 MyMainWindow 类:

class MyMainWindow : public QWidget {Q_OBJECT
public:explicit MyMainWindow(QWidget *parent = nullptr) : QWidget(parent) {setWindowTitle("实用功能示例");auto *layout = new QVBoxLayout(this);auto *button1 = new QPushButton("显示消息框");connect(button1, &QPushButton::clicked, this, &MyMainWindow::showMessageBox);auto *button2 = new QPushButton("执行特定操作");connect(button2, &QPushButton::clicked, this, &MyMainWindow::performSpecificAction);layout->addWidget(button1);layout->addWidget(button2);setLayout(layout);}private slots:void showMessageBox() {QMessageBox::information(this, "消息", "这是一个消息框示例!");}static void performSpecificAction() {qDebug() << "执行了特定操作!";}
};
  • 构造函数 MyMainWindow

    • 设置主窗口的标题为 “实用功能示例”。
    • 创建了一个垂直布局管理器 layout
    • 创建了两个按钮 button1button2,并将它们添加到布局中。
    • 使用 setLayout 设置主窗口的布局为 layout
  • 槽函数:

    • showMessageBox() 槽函数在按钮1被点击时被调用,显示一个信息框(消息框)。

    • performSpecificAction() 静态函数与按钮2的点击事件关联。它用于展示静态函数的连接方式,此处用于打印调试信息。

🟥 2. 主函数 main()

int main(int argc, char *argv[]) {QApplication a(argc, argv);MyMainWindow mainWindow;mainWindow.show();return QApplication::exec();
}
  • 应用程序入口 main()
    • 创建了一个 QApplication 对象 a,Qt应用程序的入口点。
    • 创建了 MyMainWindow 对象 mainWindow
    • 调用 show() 函数显示主窗口。
    • 通过 QApplication::exec() 进入事件循环,等待并响应用户的交互操作。

🟥 关键知识点:

  • QWidget 和布局管理器(QLayout): 使用 QWidgetQVBoxLayout 来创建主窗口及其布局。

  • QPushButton 和信号槽: 使用 QPushButton 创建按钮,并使用信号槽机制连接按钮的点击事件与相应的槽函数。

  • QMessageBox: 使用 QMessageBox::information 创建一个信息框,显示消息。

  • 静态函数的使用: 示例中展示了一个静态成员函数与按钮点击事件关联的方法。


在这个示例中,初学者要注意哪些地方?

对于初学者来说,这个示例涉及到了Qt的一些基础概念和常用功能。以下是初学者在阅读和理解这个示例时可能需要注意的地方:

1. 对象和类的基本概念:
  • 继承和构造函数: 了解 MyMainWindow 类继承自 QWidget,并学习构造函数的作用。

  • 布局管理器的使用: 理解如何使用布局管理器(这里使用了 QVBoxLayout)来管理窗口内部的控件。

2. 按钮和信号槽:
  • QPushButton 的创建和连接: 学习如何创建按钮,并且使用 connect 函数将按钮的信号(比如 clicked)连接到槽函数。

  • 槽函数的定义和使用: 理解槽函数的定义方式,以及它们被触发时执行的操作。在这个示例中,showMessageBox()performSpecificAction() 是两个槽函数。

3. Qt中的一些类和方法:
  • QMessageBox 的使用: 了解 QMessageBox 类用于创建不同类型的对话框,并在应用程序中显示消息、警告等。

  • QApplication 和事件循环: 了解 QApplication 的作用是启动Qt应用程序并管理应用程序的资源。QApplication::exec() 进入Qt的事件循环,负责处理用户输入、事件和信号等。

4. 静态成员函数:
  • 静态函数的使用: 在这个示例中,performSpecificAction() 是一个静态成员函数,它与按钮的点击事件关联。初学者可以理解静态成员函数的使用方式和它们的作用。
5. Q_OBJECT 宏和元对象系统:
  • Q_OBJECT 宏的作用: 了解 Q_OBJECT 宏的作用是启用Qt的元对象系统,它是信号和槽机制的基础,在使用信号和槽时需要加上这个宏。

理解以上概念和注意点对于初学者来说是很重要的,因为它们构成了Qt应用程序开发中的基础知识,能够帮助初学者更好地理解和编写Qt应用程序。


这个示例中的QT文档应该去哪查看?

当涉及到Qt文档的查阅时,Qt官方文档是最全面和权威的资源。你可以在以下网址找到Qt的官方文档:https://doc.qt.io/,本示例使用的是Qt5版本 https://doc.qt.io/qt-5/

在这个网站上,你可以找到与Qt相关的全部文档,包括但不限于以下内容:

  1. Qt的类和模块文档: 包括每个Qt类的详细说明,它们的成员函数、属性、信号、槽等。
  2. 教程和示例: 提供了许多用于学习的教程和示例,逐步介绍Qt的各种功能和用法。
  3. Qt的指南和手册: 包括使用Qt开发的指南、最佳实践、Qt Quick、Qt Widgets等方面的手册。
  4. 发布说明和版本信息: 如果你想查看特定版本的Qt的发布说明和变更信息,也可以在官方文档中找到。

对于初学者,Qt的入门指南、教程和示例是很有帮助的,它们可以帮助你快速入门并掌握Qt的基础知识。同时,Qt的类和模块文档是深入了解Qt API的重要资源。

除了官方文档,Qt还提供了许多其他资源,比如Qt的论坛、博客、示例代码等,这些资源也可以帮助你更好地理解和应用Qt。


本文就到这里了,感谢您的阅读,明天还有更多的实例学习文章等着你 🎆。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇。

相关文章:

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口&#xff0c;其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框&#xff0c;第二个按钮点击时会执行一个特定的操作&#xff08;在这个例子中&#xff0c;仅打印一条调试信息&#xff09;。 功能描述&#xff1a; 创建窗口和布局&#xff1a;…...

python实现一个计算器

实现一个计算器首先熟悉一下这个阅读器的属性import subprocess subprocess.run(["espeak", "-v", "enf3", "This is a Calculator"])class Calculator:def speaker(self,word):subprocess.run(["espeak", "-v", …...

C++ 共享内存ShellCode跨进程传输

在计算机安全领域&#xff0c;ShellCode是一段用于利用系统漏洞或执行特定任务的机器码。为了增加攻击的难度&#xff0c;研究人员经常探索新的传递ShellCode的方式。本文介绍了一种使用共享内存的方法&#xff0c;通过该方法&#xff0c;两个本地进程可以相互传递ShellCode&am…...

如何快速移植(从STM32F103到STM32F407)

最近用到F4的地方比较多&#xff0c;网上代码还是F1多一些&#xff0c;便需要移植代码&#xff0c;如何快速移植代码呢&#xff1f; 看下面这篇文章 外设 首先就是STM32的外设了。 STM32F407ZGT6的基本外设 STM32F407ZGT6 作为 MCU&#xff0c;该芯片是 STM32F407 里面配置…...

python高级练习题库实验1(B)部分

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目5代码实验结果题目总结题目1 打包糖果小游戏,用户输入糖果品牌与个数,还有一个盒子里面可以装多少个糖果,输出一些打印信息,如下图所示: 代码 print("Packaging lollies into…...

Qt Rsa 加解密方法使用(pkcs1, pkcs8, 以及文件存储和内存存储密钥)

Qt RSA 加解密 完整使用 密钥格式&#xff1a; pkcs#1pkcs#8 如何区分密钥对是PKCS1还是PKCS8&#xff1f; 通常PKCS1密钥对的开始部分为&#xff1a;-----BEGIN RSA PRIVATE KEY-----或 -----BEGIN RSA PUBLIC KEY-----。而PKCS8密钥对的开始部分为&#xff1a;-----BEGIN…...

区分物理端口与软件端口概念:以交换机端口和Linux系统中的端口为例

文章目录 交换机端口和Linux系统中的端口有什么区别&#xff1f;1. 交换机的端口2. Linux系统中的端口因此&#xff0c;尽管两者都被称为"端口"&#xff0c;但它们代表的含义和用途是完全不同的。 交换机端口和Linux系统中的端口有什么区别&#xff1f; 虽然都被称为…...

力扣226:翻转二叉树

力扣226&#xff1a;翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root [2,1,3]…...

亚马逊鲲鹏系统智能自动注册与AI角色养号,探索数字化新境界

在数字化时代&#xff0c;亚马逊鲲鹏系统以其强大的自动化功能&#xff0c;为用户提供了前所未有的购物体验。如果你想利用鲲鹏系统进行自动化注册&#xff0c;那么准备好邮箱、IP、手机号等关键信息后&#xff0c;你将轻松实现自动注册&#xff0c;为购物之旅开启智能化新篇章…...

AOP操作日志记录

AOP操作日志记录 1.创建注解 Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface PassportLog {String operatePage();String operateType();ClassTypEnum classType();}2.创建切面 对于字典&#xff0c;可以通过注解属性去转换&#xff0c;枚举…...

Linux C语言 42-进程间通信IPC之网络通信(套接字)

Linux C语言 42-进程间通信IPC之网络通信&#xff08;套接字&#xff09; 本节关键字&#xff1a;C语言 进程间通信 网络通信 套接字 TCP UDP 相关库函数&#xff1a;socket、bind、listen、accept、send、recv、sendto、recvfrom 参考之前的文章 Linux C语言 30-套接字操作…...

微服务知识大杂烩

1.什么是微服务? 微服务(Microservices)是一种软件架构风格,将一个大型应用程序划分为一组小型、自治且松耦合的服务。每个微服务负责执行特定的业务功能,并通过轻量级通信机制(如HTTP)相互协作。每个微服务可以独立开发、部署和扩展,使得应用程序更加灵活、可伸缩和可…...

记录一次vscode markdown的图片路径相关插件学习配置过程

插件及说明查找过程 csdn搜索markdown图片路径&#xff0c;找到关于这一款插件的回答。打开vscode拓展搜索Paste Image这款插件&#xff0c;看到下载量挺高的&#xff0c;应该不赖。 点击仓库,进入该插件开源的github仓库,查看README文件阅读说明. 淡然在Vscode 插件项目下的细…...

设计原则 | 依赖转置原则

一、依赖转置原则&#xff08;DIP&#xff1a;Dependence Inversion Principle&#xff09; 1、原理 高层模块不应该依赖低层模块&#xff0c;二者都应该依赖于抽象抽象不应该依赖于细节&#xff0c;细节应该依赖于抽象 2、层次化 Booch曾经说过&#xff1a;所有结构良好的面…...

前端开发实用技巧与经验分享

导语&#xff1a;在前端开发领域&#xff0c;掌握一些实用的技巧和经验可以帮助你更高效地完成任务。本文将分享一些前端开发的实用技巧和经验&#xff0c;帮助你在工作中更好地应对各种挑战。 一、使用开发者工具进行调试和优化 熟练掌握浏览器开发者工具的使用&#xff0c;…...

推荐一款Excel快速加载SQL的插件,方便又好用

如果告诉你只需要双击一下&#xff0c;SQL数据库中存放在表里面的数据&#xff0c;就能加载到你的Excel中&#xff0c;你想不想要&#xff1f; 今天给大家推荐一款好用的Excel插件&#xff0c;安装简单&#xff0c;使用方便&#xff0c;是经常使用SQL数据库的不二。 这款插件…...

Docker快速入门(docker加速,镜像,容器,数据卷常见命令操作整理)

Docker本质是将代码所需的环境依赖进行打包运行,而在Docker中最重要的是镜像和容器 镜像:可以简单地理解为每启动一个docker镜像就会占用计算机一个进程,这个进程和另外起的docker镜像的进程是相互独立的,以数据库为例,每个镜像都会copy一份数据库,在他所在的进程中.别的镜像在…...

http和https的区别有哪些

目录 HTTP&#xff08;HyperText Transfer Protocol&#xff09; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09; 区别与优势 应用场景 未来趋势 当我们浏览互联网时&#xff0c;我们经常听到两个常用的协议&#xff1a;HTTP&#xff08;HyperText Tra…...

使用Keil-MDK生成*.bin格式可执行文件

使用Keil-MDK生成*.bin格式可执行文件 文章目录 使用Keil-MDK生成*.bin格式可执行文件前言一、fromelf.exe工具二、使用方法1.配置输出2.输出格式 前言 在使用Keil MDK的集成开发环境中&#xff0c;默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件。虽然文件可…...

基于springboot+vue篮球联盟管理系统源码

&#x1f345; 简介&#xff1a;500精品计算机源码学习 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 文末获取源码 目录 一、以下学习内容欢迎交流&#xff1a; 二、文档资料截图&#xff1a; 三、项目技术栈 四、项目运行图 背景&#xff1a; 篮球运…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

虚幻基础:角色旋转

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 移动组件使用控制器所需旋转&#xff1a;组件 使用 控制器旋转将旋转朝向运动&#xff1a;组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转&#xff1a;必须移动才能旋转&#xff0c;不移动不旋转控制器…...