QT中增加了signals和slots,即信号与槽,从字面上来看我们也能大概知道这两个概念的意义。信号与槽的作用便是在两者关联后通过发射信号触发槽的反应。
可以一个信号对应一个槽,可以一个信号对应多个槽,也可以多个信号对应一个槽。
虽然相对来说比较简单,但是使用的时候有些地方需要注意。
1.一定要有signals关键字,定义信号时这个关键字不可或缺,比如我们定义一个信号void signal(),一定要在前面加上关键字“signals:”,
signals:
void signal();
就像类中的public、protected、pravate一样,但是一定不能在signals前面加上public、protected、private,
publi signals:
这样写是错误的
2.slots可以写可以不写,一般的函数也可以与signals下的信号关联,我们定义槽函数时可以像signals那样加上slots关键字,也可以不加,但是需要注意的是,如果加上了,那就必须加上public、protected、paivate
public slots:
void func();这样写
slots:
void func();这样写就是错的
当然不加上slots的一般函数也可以与信号关联
3.signals下的函数必须是void类型,而且只需要给出声明即可,具体实现QT内部自己处理,但是槽函数一定要实现,从我们角度思考是这种信号处理是一致的,但是槽函数的功能确实根据我们需要自己设计,所以有了这种差异。
4.信号与槽的参数不能是宏和函数指针
5.信号一般与emit配合使用,使用emit发射信号给关联的槽
6.使用signals/slots必须要加入宏Q_OBJECT
给出一个实例(非自己编写)
a.h
-----------------------------------------------------------------------------------
#ifndef A_H
#define A_H
#include <QObject>
class A : public QObject
{
Q_OBJECT
signals://定义一个信号
void signal();
public:
void useSignal(){//使用信号
emit signal();
}
};
#endif // A_H----------------------------------------------------------------------------------
b.h
---------------------------------------------------------------------------------
#ifndef B_H
#define B_H
#include <QObject>
#include <iostream>
using namespace std;
class B : public QObject
{
Q_OBJECT
public:
void fun() { //定义一个“槽”
cout<<"接受对象a的信号,运行对象b的函数。"<<endl;
}
};
#endif // B_H-----------------------------------------------------------------------------------
main.cpp
-----------------------------------------------------------------------------------
#include "a.h"
#include "b.h"
int main(int argc, char *argv[])
{
A a;
B b;
//连接信号和槽
QObject::connect(&a,&A::signal,
&b,&B::fun);
//使用信号
a.useSignal();
return 0;
}-----------------------------------------------------------------------------------