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()";
}