信号和槽用于两个对象之间的通信。信号和槽机制是Qt的核心特征,也是Qt不同于其他开发框架的最突出特征。为了实现对象间的通信,一些工具包中使用了回调机制,而在Qt中使用了信号和槽来进行对象间的通信。当一个特殊的事情发生时便可以发射一个信号,比如按钮被点击就发射clicked()信号;而槽就是一个函数,它在信号发射后被调用来响应这个信号。Qt的部件类中已经定义了一些信号和槽,但是更常用的做法是子类化部件,然后添加自定义信号和槽来实现想要的功能。
一个信号可以关联到多个槽上,多个信号也可以关联到同一个槽上,甚至,一个信号还可以关联到另一个信号上。如果存在多个槽与某个信号相关联,那么当这个信号被发射时,这些槽将会一个接一个地执行,执行顺序与关联顺序相同。
在声明一个信号要使用signals关键字,在signals前面不能用public、private和protected等限定符,因为信号默认是public函数。
信号只用声明,不需要也不能对它进行定义实现,而且信号没有返回值,只能是void类型的。
只有QObject类及其子类派生的类才能使用信号和槽机制,以下面代码为例,使用信号和槽还必须在类声明的最开始处添加Q_OBJECT宏,不过这个一般在创建的Qt的类中会自动生成。
槽就是普通的C++函数,可以像一般的函数一样使用。声明槽要使用slots关键字,槽可以是private、public或者protected类型的,槽也可以被声明为虚函数。槽的最大特点就是可以和信号关联。
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class My_Dialog; }
QT_END_NAMESPACE
class My_Dialog : public QDialog
{
Q_OBJECT //一般创建Qt类时会自动生成
public:
My_Dialog(QWidget *parent = nullptr);
~My_Dialog();
signals:
void Mysignal(); //声明一个信号,无返回值,不需要实现信号函数
public slots:
void Myslot(); //声明一个公有的、无返回值的槽函数
QString MyFunc(); //声明一个共有的、返回值为QString类型的槽函数
private:
Ui::My_Dialog *ui;
};
总结使用信号和槽需要注意以下几点:
1、需要继承自QObject或其子类;
2、在类声明的最开始处添加Q_OBJECT宏;
3、槽中参数的类型要和信号参数的类型相对应,且不能比信号的参数多;
4、信号只用声明,没有定义,且返回值为void类型。