QT学习之signals

xiaoxiao2021-02-27  239

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

转载请注明原文地址: https://www.6miu.com/read-10629.html

最新回复(0)