QT ---- Signal & Slot(信号与槽)

Signal & Slot

使用信号与槽的类中,需要在类的定义(.h文件)中加入#include <QObject>

Signal:在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,

Slot:对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。

槽函数需要实现; 信号只需要声明 ,不需要实现。

槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

通俗的讲:信号与槽,实现了对象与对象之间的通信,一个对象发生了改变就会发送信号通知另外一个对象,另外一个对象收到信号就会执行一个函数,这个函数我们称为槽。

1、信号的声明:

signals:

    void mysignal_1();

    void mysignal_2(int data);

2、槽的声明:

public slots:

    void myslot_1();

    void myslot_2(int data);

在ui组件中,右键元素,转到槽即可编写相应的槽函数(如触发cleck()这个按钮的时候你需要实现的功能):

3、信号与槽的连接:

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

4、发射信号

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

5、连接规则:

       1、信号参数可以比槽函数多,反之则不可以

       2、 一个信号可以连接多个槽

       3、多个信号可以连接到一个槽

       4、一个信号可以与另一个信号连接


例:实现点击按钮,要求输出点击的次数 

.............
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 //添加OBJECT类,这个可以在创建的时候选择 c++ Q_Object项目

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

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

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

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

 

...............
mainwindow.cpp
...............
#include "mainwindow.h" 
#include "ui_mainwindow.h"
#include <QDebug> 
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;
}

//槽函数的实现(这里把信号的发送放在了里面) 所以上面只实现了与Signal_1和pushButton的连接
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()";
}

 

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小半、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值