好久没有静下心来思考了,每天靠工作驱动,忙碌但不踏实。QT信号与槽机制一直在用,也会用,但只是知其然不知其所以然。今天临近下班给自己点清醒的时间,详细了解了下,总结如下:
信号与槽机制是QT中不同对象相互通信的一种方法。
有两种写法:第一种是SIGNAL()和SLOT()宏,第二种是&App::member 函数指针
宏方式:connect(obj1, SIGNAL(signal(int)), obj2, SLOT(slot()))
对象方式:connect(obj1, &Obj1::signal, obj2, &Obj2::slot)
马上下班了,以主管说下班吧,作为苦逼的我们赶紧关机走人为为例。主管发出下班的信息。程序中创建BOSS类,并自定义信号void gooffwork(),信号不需要实现
#ifndef BOSS_H
#define BOSS_H
#include <QObject>
class BOSS : public QObject
{
Q_OBJECT
public:
explicit BOSS(QObject *parent = 0);
signals:
void gooffwork(QString name);
public slots:
};
#endif // BOSS_H
自定义STAFF类,定义槽函数 void turnoff(Qstring name),槽函数必须实现
#include "staff.h"
STAFF::STAFF(QObject *parent) : QObject(parent)
{
}
void STAFF::turnoff(Qstring name)
{
qDebug()<<name+"---关机走人!";
}
#ifndef STAFF_H
#define STAFF_H
#include <QObject>
class STAFF : public QObject
{
Q_OBJECT
public:
explicit STAFF(QObject *parent = 0);
signals:
public slots:
void turnoff(QString name);
};
#endif // STAFF_H
在主程序中定义BOSS和STAFF对象
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "boss.h"
#include "staff.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
signals:
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
BOSS *boss; //定义BOSS对象
STAFF *staff; //定义STAFF对象
};
#endif // WIDGET_H
以两种方式创建信号与槽的连接
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
boss=new BOSS(this);
staff=new STAFF(this);
connect(boss,SIGNAL(gooffwork(QString)),staff,SLOT(turnoff(QString))); //方式一
// connect(boss,&BOSS::gooffwork,staff,&STAFF::turnoff); //方式二
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
emit boss->gooffwork("张三");// 按钮点击的时候,boss发送下班信号
}
运行结果:
下班走人。。。。