【六】【QT开发应用】信号和信号槽的五种写法

news2024/11/27 14:36:48

第一种写法

在这里插入图片描述

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

在这里插入图片描述

第二种写法

在这里插入图片描述

第三种写法

在这里插入图片描述

第四种写法

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

在这里插入图片描述

第五种写法

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

完整代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void btnSlot();
    void slot2();
    void on_btnOpen_clicked();
    void on_actionexit_triggered();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //第一种写法
    //connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(btnSlot()));

    //第二种写法
    //connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::btnSlot);

    //第三种写法
    // connect(ui->pushButton,&QPushButton::clicked,[=]{
    //     QMessageBox::information(this,"title","clicked");
    // });

    //第四种写法


    //第五种写法

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::btnSlot(){
    QMessageBox::information(this,"title","clicked");
}

void MainWindow::slot2(){
    QMessageBox::information(this,"title","clicked");
}

void MainWindow::on_btnOpen_clicked(){
    QMessageBox::information(this,"title","clicked");
}

void MainWindow::on_actionexit_triggered(){
    QMessageBox::information(this,"title","clicked open ");
    close();
}

复盘

第一种写法

旧的信号和槽机制

在 Qt 4 及更早版本中,信号和槽的连接使用的是字符串形式的信号和槽。这种方式通过 SIGNAL 和 SLOT 宏将信号和槽的签名转换为字符串。

connect(senderObject, SIGNAL(signalSignature()), receiverObject, SLOT(slotSignature()));

在本文中的例子:

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btnSlot()));

信号 (SIGNAL):
SIGNAL(clicked()):这里的 clicked() 是 QPushButton 类的一个信号。当按钮被点击时,这个信号会被发射。
SIGNAL 宏将 clicked() 转换为字符串 “2clicked()”。这里的 2 是内部使用的一个标记,表示这是一个信号。
槽 (SLOT)
SLOT(btnSlot()):这里的 btnSlot() 是你的槽函数,它将在信号发射时被调用。
SLOT 宏将 btnSlot() 转换为字符串 “1btnSlot()”。这里的 1 是内部使用的一个标记,表示这是一个槽。
连接:
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btnSlot())):
当 ui->pushButton 被点击时,clicked() 信号被发射。
连接机制捕获到 clicked() 信号,并调用与之连接的槽函数 btnSlot()。

缺点:
缺乏编译时类型检查。如果信号和槽的参数不匹配,错误只能在运行时发现,而不是编译时。

非常不推荐.

第二种写法

现代信号和槽机制

在 Qt 5 及更高版本中,推荐使用基于函数指针的信号和槽连接方式。这种方式提供了编译时类型检查,更加安全和现代化。

connect(senderObject, &SenderClass::signal, receiverObject, &ReceiverClass::slot);

在本文中的例子:

connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::btnSlot);

信号:
&QPushButton::clicked: 这是 QPushButton 类的一个信号。当按钮被点击时,这个信号会被发射。
使用 & 获取成员函数指针,这是 C++ 标准的写法,确保在编译时进行类型检查。
槽:
&MainWindow::btnSlot: 这是你的槽函数,它将在信号发射时被调用。
同样使用 & 获取成员函数指针。
连接:
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::btnSlot):
当 ui->pushButton 被点击时,clicked() 信号被发射。
连接机制捕获到 clicked() 信号,并调用与之连接的槽函数 btnSlot()。

推荐.

第三种写法

使用 Lambda 表达式作为槽函数

在现代 Qt 编程中,可以使用 C++11 引入的 lambda 表达式作为槽函数。Lambda 表达式是一种匿名函数,可以在定义时捕获变量,并且直接在连接信号和槽时使用。这种方式非常灵活,尤其适用于简单的槽函数。

connect(ui->pushButton, &QPushButton::clicked, [=] {
    QMessageBox::information(this, "title", "clicked");
});

信号:
&QPushButton::clicked: 这是 QPushButton 类的一个信号。当按钮被点击时,这个信号会被发射。
Lambda 表达式:
[=]:这是 lambda 捕获列表,表示按值捕获外部作用域中的所有变量。在这个例子中,this 指针会被捕获,以便在 lambda 内部使用。
{ … }:这是 lambda 表达式的主体,包含要在信号发射时执行的代码。
QMessageBox::information
QMessageBox::information 是一个静态函数,用于显示信息消息框。它接受父窗口、标题和消息内容作为参数。
this 作为父窗口指针传递给 QMessageBox::information,表示消息框的父窗口是当前窗口。
“title” 和 “clicked” 是消息框的标题和消息内容。

推荐.

第四种写法

连线法,不推荐,因为当信号和槽多了,连线会很复杂且繁琐.

第五种写法

使用命名槽函数

在 Qt 中,可以通过在类中定义成员函数并将其作为槽函数来处理信号。使用命名槽函数是一个非常常见和推荐的方法,特别是在处理较复杂的逻辑时。这种方法具有更好的可读性和可维护性。
在你的示例中:

void MainWindow::on_btnOpen_clicked(){
    QMessageBox::information(this,"title","clicked");
}

槽函数定义
void MainWindow::on_btnOpen_clicked():这是在 MainWindow 类中定义的一个槽函数。命名约定通常是 on_< widget_name >_< signal >(),表示这是 widget_name 触发的 signal 的处理函数。

QMessageBox::information(this, “title”, “clicked”):当槽函数被调用时,会弹出一个信息框,显示标题为 “title” 的消息,内容为 “clicked”。
连接信号和槽
可以在 Qt Designer 中通过 UI 文件自动生成连接,也可以在代码中手动连接。

在 Qt Designer 中自动生成连接

UI 文件中设置槽函数
使用 Qt Designer 创建界面时,可以直接为按钮的 clicked 信号指定槽函数。例如,在按钮的属性编辑器中找到 Signals and Slots,然后设置 clicked 信号的处理函数为 on_btnOpen_clicked。
自动生成连接代码
Qt Designer 会在生成的 UI 文件代码中自动创建连接,通常在 setupUi 函数中。
你不需要手动编写 connect 函数调用,Qt 框架会在运行时自动找到并连接信号和槽。

推荐.

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

【STM32--Cortex-M3】

STM32-Cortex-M3 ■ Cortex-M3 处理器内核到基于Cortex-M3的MCU■ ARM的各种架构版本■ 指令集■ Cortex-M3简介■ Cortex-M3寄存器组■ Cortex-M3■ Cortex-M3■ Cortex-M3 ■ Cortex-M3 处理器内核到基于Cortex-M3的MCU Cortex-M3处理器内核是单片机的中央处理单元&#xff…

Linux系统开机自启动脚本(案例:Raspberry Pi 4B脚本)

前言&#xff1a;本篇博客为手把手教学的 Linux 系统开机自启动脚本教程&#xff0c;且额外包含有 Raspberry Pi 4B 的开机自启动案例。日常工程项目中往往需要 Linux 系统能够自启动一些代码程序&#xff0c;本篇博客利用虚拟机下的 Ubuntu 自启动脚本来进行教学&#xff0c;且…

React的State和setState

如何确地使用 State 不要直接修改 State.修改State应该使用 setState():构造函数是唯一可以给 this.state 赋值的地方 State 与 props 类似&#xff0c;但是 state 是私有的&#xff0c;并且完全受控于当前组件 我们可以在我们的自定义组件中添加私有的State jcode class C…

mac怎么压缩pdf文件,苹果电脑怎么压缩pdf文件大小

在当今数字化时代&#xff0c;PDF文件已成为广泛使用的文档格式之一。然而&#xff0c;PDF 文件可能会因其包含的图像、图形和其他元素而导致文件较大&#xff0c;这可能会影响文件的传输、存储和共享。因此&#xff0c;对 PDF 文件进行压缩以减小其文件大小是很有必要的。今天…

【详细】一步一步实现一个BP神经网络-逐行代码解说

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ ​ 要如何使用代码实现一个BP神经网络呢&#xff1f; 下面跟随笔者&#xff0c;一步一步详细来实现&#xff0c;再对代码进行详细解说。 通过本文可以详细掌握怎么使用matlab来实现一个BP神经网络。 一、一步一步实…

MFC GDI绘制卡通人物

文章目录 主要代码完整visual studio工程下载主要代码 // DrawFrogView.cpp : implementation of the CDrawFrogView class //#include "stdafx.h" #include "DrawFrog.h"#include "DrawFrogDoc.h" #include "DrawFrogView.h"#includ…

路由器基础配置以及静态路由配置

1、搭建网络 搭建网络拓扑、分配IP地址、划分网段、连接端口 2、配置路由器 路由器基础配置 //进入全局配置模式 Router#enable Router#conf t Enter configuration commands, one per line. End with CNTL/Z.//配置高速同步串口serial2/0 Router(config)#int ser2/0 Route…

html侧导航栏客服栏

ico 替换 ICO <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>返回顶部</title><script src"js/jquery-2.0.3.min.js"…

gitlab升级16.11.3-ee

背景 这是事后一段时间补充记录的博客。 升级目的&#xff1a;修补漏洞CVE-2024-4835 未经认证的威胁攻击者能够利用该漏洞在跨站脚本 (XSS) 攻击中&#xff0c;轻松接管受害者账户。 gitlab版本为14.6.2-ee升级至16.11.3-ee 思路 翻阅文档找升级方法及升级版本路径。使用…

HarmonyOS父子组件传递参数

HarmonyOS父子组件传递参数 1. 使用State和Prop进行父子组件传递———注意是单向同步 Prop装饰器&#xff1a;父子单向同步 注意&#xff1a;只支持单向同步&#xff0c;同时也只能支持string\number\boolean\enum比较简单的类型。 代码 // 使用 props 进行父子组件传值…

Android翻转动画(卡片翻转效果)

前言 最近好友问计蒙翻转动画&#xff0c;恰好在大二那年看Android Api Demo时记了笔记&#xff0c;由此写一篇文章。 需求 屏幕右滑事件触发卡片的翻转效果 &#xff0c;为了方便&#xff0c;在例子中将右滑事件改成按钮点击事件 老规矩&#xff0c;最后有源码 一、先介绍三…

从 Hadoop 迁移,无需淘汰和替换

我们仍然惊讶于有如此多的客户来找我们&#xff0c;希望从HDFS迁移到现代对象存储&#xff0c;如MinIO。我们现在以为每个人都已经完成了过渡&#xff0c;但每周&#xff0c;我们都会与一个决定进行过渡的主要、高技术性组织交谈。 很多时候&#xff0c;在这些讨论中&#xff…

mac 常用工具命令集合

一、vim 快捷键 1、移动光标 h j k l 左 下 上 右 箭头上 上移一行 箭头下 下移一行 0 跳至行首&#xff0c;不管有无缩进&#xff0c;就是跳到第0个字符 ^ 跳至行首的第一个字符 $ 跳至行尾 gg 跳至文首 G 调至文尾 5gg/5G 调至第5行w 跳到下一个字首&#xff0c;按标点或…

Android修行手册-ImageView的adjustViewBounds和设置透明度

点击跳转>GameFramework文档系列&#xff08;二&#xff09;- 场景相关 点击跳转>GameFramework文档系列&#xff08;三&#xff09;- 日志管理和UI 点击跳转>GameFramework文档系列&#xff08;四&#xff09;- 事件订阅 点击跳转>保姆式Cocos合成大西瓜案例 …

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[3]-参数配置详细版

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[3]-参数配置详细版 在开始参数配置之前,先执行以下脚本 python copy_config_example.py该脚本将会将所有config目录下的配置文件样例复制一份到config目录下,方便开发者进行配置。 接着,开发者可以根据自己的需求,对…

LeetCode---402周赛

题目列表 3184. 构成整天的下标对数目 I 3185. 构成整天的下标对数目 II 3186. 施咒的最大总伤害 3187. 数组中的峰值 一、构成整天的下标对数目 I & II 可以直接二重for循环暴力遍历出所有的下标对&#xff0c;然后统计符合条件的下标对数目返回。代码如下 class So…

graalvm jdk和openjdk

下载地址:https://github.com/graalvm/graalvm-ce-builds/releases 官网: https://www.graalvm.org

【AI作曲】毁掉音乐?早该来了!一个网易音乐人对于 AI 大模型音乐创作的思辨

引言&#xff1a;AI在创造还是毁掉音乐&#xff1f; 正如当初 midjourney 和 StableDiffusion 在绘画圈掀起的风波一样&#xff0c;suno 和 各大音乐大模型的来临&#xff0c;其实早该来了。 AI 在毁掉绘画&#xff1f;或者毁掉音乐&#xff1f; 没错&#xff0c;但也错了。…

Android网络收集和ping封装库

功能Stetho 是 Facebook 开源的一个 Android 调试工具。是一个 Chrome Developer Tools 的扩展&#xff0c;可用来检测应用的网络、数据库、WebKit 、SharePreference等方面的功能。开发者也可通过它的 dumpapp 工具提供强大的命令行接口来访问应用内部。 02.stetho大概流程 …

学校图书借阅管理系统(数据库课设)PS:有前端界面

1.课设要求描述 ●实现图书信息、类别、出版社等信息的管理; ●实现读者信息、借阅证信息的管理; ●实现图书的借阅、续借、归还管理; ●实现超期罚款管理、收款管理; ●创建触发器&#xff0c;分别实现借书和还书时自动更新图书信息的在册数量; ●创建视图查询各种图书…