QT学习笔记:QT的信号与槽

news2024/9/22 15:44:58

一、信号与槽(Signal & Slot)的基本概念

1、了解信号与槽

(1)信号(Signal):在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号;
(2)槽(Slot):对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。
    信号与槽,实现了对象与对象之间的通信,一个对象发生了改变就会发送信号通知另外一个对象,另外一个对象收到信号就会执行一个函数,这个函数我们称为槽。简单地说,就是“发布-订阅者”模式。

    要实现信号与槽函数的绑定,我们需要做以下几步。

  (1)头文件中声明这个槽函数;

  (2)在.cpp文件中定义这个槽函数,也就是把需要做什么事这个活动内容写下来;

  (3)在.cpp文件中的构造函数里面连接信号与槽,用connect()函数。

2、信号与槽的自动绑定

    (除了用connect()函数,信号与槽也可以自动连接,不需要connect(),但是槽函数名需要设置成,举例:on_函数名_clicked)

    比如,在设计的ui界面上,将鼠标放置于pushButton上面,点击右键,选项“转到槽...”。

     此时会出现如下窗口,若是选择按钮单击有效则选择click(),然后点击OK。此时将会自动生成如下函数:

void Dialog::on_MyButton_clicked()
{
    //添加自己的业务逻辑
}

3、信号与槽的手工绑定

(1)信号的声明

signals:
    void mysignal_1();
    void mysignal_2(int data);

QT自带很多控件,这些控件本身就定义了很多信号,比如button的clicked(), pressed()等。

(2)槽的声明

public slots:
    void myslot_1();
    void myslot_2(int data);

(3)信号与槽的绑定

connect(sender, SIGNAL(signals), receiver, SLOT(slot));

(4)发射信号

emit mySignal_1(); // 发射信号mySignal_1

(5)信号和槽的连接规则

(5.1)信号参数可以比槽函数多,反之则不可以
(5.2)一个信号可以连接多个槽
(5.3)多个信号可以连接到一个槽
(5.4)一个信号可以与另一个信号连接

二、例子

用Qt Creator创建一个project。

1、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();
    int a = 0;

signals: //声明信号
    void mySignal_1();
    void mySignal_2(int data);

public slots: //声明槽函数
    void mySlot_1();
    void mySlot_2(int data);
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

2、mainwindow.cpp


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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->pushButton->setText("Hello World");

    //信号与槽的连接
    connect(this, SIGNAL(mySignal_1()), this, SLOT(mySlot_1()));
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(mySlot_1()));

    //发射信号
    emit mySignal_1();
}

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

//槽函数的实现
void MainWindow::mySlot_1(){
    qDebug() << "call mySlot_1()";
    emit mySignal_2(10000);
}

//槽函数的实现(统计按下按钮次数,并在输出显示中输出)
void MainWindow::mySlot_2(int data){
    qDebug() << "call mySlot_2(), data:" << data;
    a++;
    qDebug() << "第" << a << "次按下按钮";
}

//这个pushButton_clicked方法,直接在ui界面右键转到槽就可以自动生成
void MainWindow::on_pushButton_clicked(){
    qDebug() << "on_pushButton_clicked()";
}

 3、执行结果:

(1)程序启动后,会输出:call mySlot_1()

 (2)当点击按钮后,输出如下:

 (3)下面我把signal_2和slot_2关联起来(connect中只有类型 - 比如int,没有参数)

connect(this, SIGNAL(mySignal_2(int)), this, SLOT(mySlot_2(int)));

执行结果如下:

 

参考:

(1)Qt Creator:初识信号与槽

(2)Qt6教程之三(13) TCP/IP通讯与socket编程

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

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

相关文章

Pytest测试框架快速搭建

一、介绍 pytest是一个非常成熟的Python测试框架&#xff0c;能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08;pytestrequests&#xff09;&#xff1b;pytest具有很多第三方插件&#xff0c;并且可…

springboot整合腾讯企业邮箱/企业微信邮箱

springboot整合腾讯企业邮箱/企业微信邮箱 登录后点击“客户端设置” 2.勾选红框中选项并保存 3.点击微信绑定并绑定微信 4.绑定微信后点击生成新密码并保存(复制生成的密码后面会使用) 5.将配置复制到代码中 <dependency><groupId>com.sun

凤凰架构阅读记录-三(分布式算法)

1.Paxos 世界上只有一种共识协议&#xff0c;就是 Paxos&#xff0c;其他所有共识算法都是 Paxos 的退化版本。 算法流程: 1.提案节点&#xff1a;称为 Proposer&#xff0c;提出对某个值进行设置操作的节点&#xff0c;设置值这个行为就被称之为提案&#xff08;Proposal&a…

【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率)

【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率) 目录 【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率) 一、 K-NN 简介 二、K-NN 分类 三、K-NN 分类实例 1、1-NN 分类 : 此时 A 类别…

leetcode 859. Buddy Strings(同伴字符串)

给出字符串s 和 goal, 判断交换 s 中的一对字母是否能得到goal. 必须是不同位置字母的交换。 思路&#xff1a; 先考虑边界情况&#xff0c; s 和 goal 的长度不相等时&#xff0c;s 怎么交换都不会得到goal. s 的长度 < 2时&#xff0c;没有可交换对象&#xff0c;肯定是…

【力扣】94、二叉树的中序遍历

94、二叉树的中序遍历 注&#xff1a;二叉树的中序遍历&#xff1a;左根右&#xff1b; // 非递归&#xff1a; var inorderTraversal function (root) {const arr [];//创建新数组&#xff1b;const stack [];//创建一个栈道&#xff1b;let o root;while( stack.length |…

办公实现降本增效,可借助微服务开源平台的力量!

在如今的快节奏发展时代&#xff0c;低代码开发平台拥有了一个广阔的发展天地&#xff0c;逐渐在通信业、医疗、物流、高校等众多大中型企业中获得一个立足之地&#xff0c;是助力企业提质、降本、增效的得力助手。微服务开源平台可以让企业实现这一目的&#xff0c;那么对于企…

AMBER分子动力学能量优化与分析、结合自由能计算专题

AMBER分子动力学能量优化与分析、结合自由能计算专题 第一天 时间:AM9:00~9:50 内容:六.分子动力学入门理/论 教学目标&#xff1a;了解本方向内容、理论基础、研究意义。 主要知识点:4分子力学简介 4.1分子力学的基本假设 4.2分子力学的主要形式 5分子力场 5.1分子力场的简…

passware kit forensic使用

一、从外部注册表文件提取密码 适用于不联网的情况下&#xff0c;例如2023盘古石杯的NAS取证 找到Windows/System32/config并在本地打开 将路径填充到config folder中 跑出来了John电脑对应的密码是paofen&#xff0c;NAS的密码是P88w0rd 后续遇见再补

Linux - 那些年测试服务器带宽的 3 种方式

方式一 speedtest-cli wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.pychmod x speedtest-cliorcurl -Lo speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.pychmod x speedtest-c…

【Linux】基础开发工具——yum篇

目录 &#x1f4d6;Linux下安装软件的三种方案&#x1f4f0;源代码安装&#x1f4f0;rpm安装&#x1f4f0;yum安装 &#x1f4d6;Linux软件包管理器yum&#x1f4f0;rz、sz&#x1f4f0;查看软件包&#x1f4f0;软件安装&#x1f4f0;软件删除 &#x1f4d6;yum源问题&#x1f…

Hadoop:DataNode启动失败:Initialization failed for Block pool

一、问题发现 ​在启动Hadoop集群后&#xff0c;发现原本应该是启动三台机子的数据节点&#xff0c;结果只有一台node2成功启动&#xff0c;另外两台&#xff08;node1、node3&#xff09;并没有启动&#xff0c;如下两图所示&#xff1a; 问题描述&#xff1a; ​确认配置信…

day3 QT对话框

目录 QDialog 标准对话框&#xff08;Standard Dialogs&#xff09;&#xff1a; 内置对话框&#xff08;Built-in Dialogs&#xff09;&#xff1a; 自定义对话框&#xff08;Custom Dialogs&#xff09; 示例 myqdialog.h widget.h myqdialog.cpp widget.cpp QDialog Q…

springboot实现网络图片转存的临时文件后上传腾讯云cos

有时复制一张图片url&#xff0c;想转存到自己的腾讯云cos保存。 实现思路是&#xff1a;先将网络图片url保存到当前项目一个临时文件夹里&#xff0c;然后发送腾讯云cos对象存储&#xff0c;返回一个url&#xff0c;最后&#xff0c;删除该临时文件图片。 测试结果 1. util实…

【C】分支和循环语句

目录 【1】什么是语句 【2】分支语句&#xff08;选择结构&#xff09; 【2.1】if 语句 【2.1.1】语法结构 【2.1.2】悬空else 【2.1.3】书写形式的对比 【2.1.4】练习 【2.2】switch 语句 【3.2.1】语法结构 【3.2.2】在switch语句中的 break 【3.2.3】default子句…

Nginx【Nginx场景实践(fair模块安装、Nginx配置故障转移、跨域问题、跨域问题解决)】(九)-全面详解(学习总结---从入门到深化)

目录 Nginx场景实践_fair模块安装 Nginx场景实践_Nginx配置故障转移 Nginx场景实践_跨域问题 Nginx场景实践_跨域问题解决 Nginx场景实践_fair模块安装 模块介绍 fair采用的不是内建负载均衡使用的轮换的均衡算法&#xff0c;而是可以根据 页面大小、加载时间长短智能的进…

C++(Day5)

思维导图&#xff1a; 全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类…

客户案例:构建可靠海外通邮系统,护航教育行业信息安全

►►►客户背景 某985高校作为一所国内知名的高等教育机构&#xff0c;拥有优质的师生资源和丰富的教学经验&#xff0c;积极开展与国外高校的合作交流&#xff0c;组织师生参与出国交流、学术考察等活动&#xff0c;在跨境科研合作和人才培养等领域开展深入合作&#xff0c;推…

2023-07-03:讲一讲Redis缓存的数据一致性问题和处理方案。

2023-07-03&#xff1a;讲一讲Redis缓存的数据一致性问题和处理方案。 答案2023-07-03&#xff1a; 数据一致性 当使用缓存时&#xff0c;无论是在本地内存中缓存还是使用 Redis 等外部缓存系统&#xff0c;会引入数据同步的问题。下面以 Tomcat 向 MySQL 中进行数据的插入、…

《操作系统》- 操作系统的发展与分类

目录 前言一、手工操作阶段1.1 人工操作方式1.2 脱机输入/输出方式 二、批处理阶段2.1 单道批处理系统2.2 多道批处理系统 三、分时操作系统四、实时操作系统五、微机操作系统的发展六、总结 前言 从第一台计算机诞生至今已过去70多年了&#xff0c;在这期间&#xff0c;计算机…