QT学习之signals

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

猜你喜欢

转载自blog.csdn.net/hhm853610070/article/details/72878194
今日推荐