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

2024-06-22 08:36

本文主要是介绍【六】【QT开发应用】信号和信号槽的五种写法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一种写法

在这里插入图片描述

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

在这里插入图片描述

第二种写法

在这里插入图片描述

第三种写法

在这里插入图片描述

第四种写法

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

在这里插入图片描述

第五种写法

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

完整代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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 框架会在运行时自动找到并连接信号和槽。

推荐.

结尾

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

这篇关于【六】【QT开发应用】信号和信号槽的五种写法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083787

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来