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; } -----------------------------------------------------------------------------------