Qt模块化笔记之core——使用信号与槽

来源:互联网 发布:产品研发部 数据公司 编辑:程序博客网 时间:2024/05/16 01:58

信号(signal)与槽(slot)就像插头与插座,有些不同的是,信号可以连接多个槽,槽也可以被多个信号连接。

Qt中的信号形式上像是一个函数,不需要具体实现,槽也是一个函数,需要书写内部的执行代码。信号一触发,所连接的槽函数就执行。

它们之间用语句connect连接:

当前Qt5版本有传统的信号槽与新推出的两种,使用形式分别如下:

QObject::connect(sender, SIGNAL(signalName(T)), receiver, SLOT(slotFunction(T)));QObject::connect(&sender, &sender::sinal,&receiver, &receiver::slotFunction);

QObject部分可省略,它也表明connect 像是QObject的一个函数。不是QObject就不能使用信号槽。

SIGNAL与SLOT是传说中的宏了,本篇倾向于初学者,不讨论。记住两种形式。

新推出的方法中,&表示引用。在连接信号槽之前,对象要已经存在。

用汉语表示的形式:

传统形式:QObject::connect(信号发送者,SIGNAL(信号名(参数1,参数2))),信号接收者,SLOT(槽函数(参数1,参数2));

新式形式,省略了两个宏。而且参数部分不需要写了。信自动一一对应传递。


查看下面两个类的声明代码:

#include <QObject>class Sender : public QObject{    Q_OBJECTpublic:    Counter();signals:    void valueChanged(int Value);};


#include <QObject>class Receiver: public QObject{    Q_OBJECTpublic:    Counter();public slots:    void setValue(int value);};


要使用信号槽机制,必需让你定义的类继承自QObject或它的子类,而且需要在声明最顶部放上Q_OBJECT宏。就像上面那样。

那connect放在哪?一般在函数的构造函数中使用它,类一初始化完成,信号槽就连接好。当然也可以临时连接。

使用如下:

Sender a;Receiver b;    QObject::connect(&a, &Sender ::valueChanged,                     &b, &Receiver ::setValue);    //connect(a, SIGNAL(valueChanged(int)), b, SLOT(setValue(int)));





0 0