什么是信号和槽
> 信号和槽是QT自行定义的一种通信机制,实现对象之间的数据交互。
> 当用户或系统触发了一个动作,导致某个控件的状态发生了改变,该控件就会发射一个信号,
即调用其类中一个特定的成员函数(信号),同时还可能携带有必要的参数
> 槽和普通的成员函数几乎没有太多区别,可以是公有的、保护的或私有的 ,可以被重载,也可以被覆盖,其参数可以是任意类型 ,并可以像普通成员函数一样调用
>槽函数与普通成员函数的差别并不在于其语法特性,而在于其功能。槽函数更多体现为对某种
特定信号的处理,可以将槽和其它对象信号建立连接,这样当发射信号时,槽函数将被触发和执行,进而来完成具体功能
信号的定义
class XX : public Qoject{
Q_OBJECT //是一个宏
signals:
void signal_func(..); //信号函数
};
Q_OBJECT:
对于Q_OBECT宏,其是实现任何信号,槽或者属性的强制性要求。不管是否需要实现这些机制,都要求使用这个宏。这个宏包含了Qt中信号和槽的机制。
宏所对应的Qt里面的一个链接工具(MOC)用于处理语法扩展。在构建工程时,有这种处理语法扩展标记,会把信号和槽的语法扩展还原为标准c++代码,通过c++标准编译器,执行连接。
注:信号函数只需要声明,不能写定义
槽的定义
class XX:public QObject{
Q_OBJECT
public slots;
void slot_func(...){...} //槽函数
};
注:槽函数可以连接到某个信号上,当信号被发射时,槽函数将被触发和执行,而且槽函数也可以当做普通的成员函数直接使用。
建立信号和槽的连接
QObject::connect( const QObject*sender, const char*signal,
const QObject* receiver, const char* method);
参数∶
sender∶信号发送对象指针
signal∶要发送的信号函数,可以使用"SIGNAL(.)" 宏进行类型转换 receiver∶信号的接收对象指针
method∶接收信号后要执行的槽函数,,可以使用"SLOT()"宏进行类型转换
只要是QOject类型的指针(不论是QOject或者其子类),都可以作为信号发送者
案例:创建Qt应用程序,包含标签和按钮,两个控件,实现点击按钮关闭标签
>按钮点击时发送信号:clicked()
>实现标签关闭功能的槽:close()
实现:
#include "mainwindow.h"
#include <QApplication>
#include <QWidget>
#include<QLabel>
#include<mainwindow.h>
#include<QDialog>
#include<QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDialog parent; //father window
QLabel label("我是标签",&parent);
label.move(50,40);
QPushButton button("我是按钮",&parent);
button.move(50,140);
parent.show(); //点击按钮关闭标签
QObject::connect(&button,SIGNAL(clicked(void),&label,SLOT(close(void));
MainWindow w;
w.show();
return a.exec();
}
运行结果:
信号和槽连接的语法要求
>信号和槽参数要一致
QObjectconnect(A,SIGNAL(sigfun(int), B,SLOT(slotfun(int));//ok QObject:connect(A,SIGNAL(sigfun(int), B,SLOT(slotfun(int,int));//error
> 可以带有缺省参数
QObject::connect(A,SIGNAL(sigfun(int)), B,SLOT(slotfun(int,int=O);//ok
> 信号函数的参数可以多于槽函数,多余参数将被忽略
QObjectconnect(A,SIGNAL(sigfun(int,int)), B,SLOT(slotfun(int));//ok
信号和槽连接的应用
> 一个信号可以被连接到多个槽(一对多)
QObjectconnect(A,SIGNAL(sigfun(int), B1,SLOT(slotfun1(int))//ok QObjectconnect(A,SIGNAL(sigfun(int),B2,SLOT(slotfun2(int));//ok
> 多个信号也可以连接到同一个槽(多对一)
QObjectconnect(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
原文:https://www.cnblogs.com/LaiY9/p/14596015.html