一、原理
- 信号和槽是QT 自行定义的一种通信机制,实现对象之间的数据交互。
- 当用户或系统触发了一个动作,导致某个控件的状态发生了改变,该控件就会发射一个信号,即调用其类中一个特定的成员函数(信号),同时还可能携带有必要的参数
- 槽和普通的成员函数几乎没有太多区别,可以是公有的、保护的或私有的,可以被重载,也可以被覆盖,其参数可以是任意类型,并可以像普通成员函数一样调用
- 槽函数与普通成员函数的差别并不在于其语法特性,而在于其功能。槽函数更多体现为对某种特定信号的处理,可以将槽和其它对象信号建立连接,这样当发射信号时,槽函数将被触发和执行,进而来完成具体功能。
二、信号的定义
信号函数只需声明,不能写定义
class XX:public QObject{ QObject{
Q_OBJECT
signals:
void void signal_func signal_func signal_func(..); // 信号函数
};
三、槽函数的定义
槽函数可以连接到某个信号上,当信号被发射时,槽函数将被触发和执行,另外槽函数也可以当做普通的成员函数直接调用
//槽的定义
class class XX:public QObject{ QObject{
Q_OBJECT
public slots: public slots:
void void slot_func slot_func slot_func(...){...}// (...){...}//槽函数
};
四、信号和槽函数的连接
一般用法:
例子:用 connect() 函数将 But 按钮的 clicked() 信号函数和 widget 窗口的 close() 槽函数关联起来;实现了“按下按钮会关闭窗口”的功能。
//构造函数
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
//例子:
connect(&But, SIGNAL(clicked()), &widget, SLOT(close()));
参数:
sender :信号发送对象指针
signal :要发送的信号函数,可以使用“SIGNAL(..) ”宏进行类型转换
receiver :信号的接收对象指针
method :接收信号后要执行的槽函数,可以使用“SLOT(..)”宏进行类型转换
type:用于指定关联方式,默认的关联方式为 Qt::AutoConnection,通常不需要手动设定
新版本:
Qt5 版本中,connect() 函数引入了新的用法,新版的 connect() 函数改进了指定信号函数和槽函数的方式,不再使用 SIGNAL() 和 SLOT() 宏。新版 connect() 函数关联 But 按钮的 clicked() 信号函数和 widget 窗口的 close() 槽函数,实现代码为:
//构造函数
QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
//例子
connect(&But, &QPushButton::clicked, &widget, &QWidget::close);
五、槽函数语法要求
一个信号可以被连接到多个槽(一对多)
QObject::connect(A,SlGNAL(sigfun(int)),B1,SLOT(slotfun1(int)));//ok
QObject:connect(A,SIGNAL(sigfun(int)), B2,SLOT(slotfun2(int)));//ok
多个信号也可以连接到同一个槽(多对一)
QObject::connect(A1,SIGNAL(sigfun1(int)),B,SLOT(slotfun(int)));//ok
QObject::connect(A2,SIGNAL(sigfun2(int)), B,SLOT(slotfun(int)));//ok
两个信号可以直接连接(信号级联)
QObject::connect(A1,SIGNAL(sigfun1(int)), A2,SIGNAL(sigfun2(int)));//ok