信号和槽是qt用于对象之间通信的核心机制。其目的类似于当一个动作发生的时候,需要对这个动作做出相应的处理,很多时候首选回调函数,通过回调函数完成对此动作的操作。但是有一个小小的问题,如果对一个庞杂的系统,这种回调函数的维护是相当的麻烦和危险的,所以qt为了很好的避免实现了自己的一套通信机制,即信号和槽。
1、信号:是可以看作是一个请求或者一个动作的标志。如果一个对象在达到一个状态或者需要一个请求等操作的时候,其会触发这个信号。qt实现触发请求,使用emit命令。此是qt固有的。
触发的参数是对象声明的信号,即signals下声明的函数类型,其没有实现。因为其目的只是作为一个标志,然后将对应的函数形式及参数传递出去。
注意:signals:是qt自由的关键字,其不需要具体的实现。
2、槽:其实就是一个处理函数,是在对象中声明为slots:之下的函数及其实现,其类似于回调函数一样。槽是一个对象对他感兴趣的对象的某个时间做出处理。
需要注意的是,槽函数也可以当作一个普通的函数进行调用。同时槽函数函数的声明应该和其需要对接的信号一致。
其信号槽工作的过程是:当一个对象通过emit发射一个信号的时候,则和其连接的对象的槽函数进行处理,等槽函数处理完成之后emit退出并执行接下来的内容。
那么信号和槽是怎么连接呢?则是通过qt最根本的元对象QObject的connect进行连接。
其有两个函数,分别完成对象的连接和断开,且都是静态函数,即:
bool QObject::connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) const
将sender对象的信号连接到此对象的槽函数中
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) [static]
将sender对象的信号连接到receiver的槽函数中
bool QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method )
断开sender的信号与receiver的槽
bool QObject::disconnect ( const char * signal = 0, const QObject * receiver = 0, const char * method = 0 ) 断开信号与reciver对象的槽的连接。如果一个对象销毁也会断开
bool QObject::disconnect ( const QObject * receiver, const char * method = 0 )
断开所有与receiver的槽连接的信号,对象被删除时自动执行断开
注释:sender是发出信号的对象,其类型选QObject,可以使用所有的控件,因为其实所有Qt控件的基类
signal是以一个信号函数,经过SIGNAL宏处理为对应的字符
receiver是接收信号的对象
method是接收对象对应的处理槽函数,通过SLOT处理为字符串
下面看一个简单的例子:
#include<QApplcation>
#include <QPushButton>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QPushButton btn;
btn.setText("Quit");
QObject::connect(&btn,SIGNAL(clicked()),&app,SLOT(quit()));//连接信号槽,这样当点击btn时出发clicked信号被app对象接收并用quit槽处理
//QObject::disconnect(&btn,SIGNAL(clicked()),&app,SLOT(quit()));如果断开,则app不会执行quit的槽的
btn.show();
return app.exec();
}
Button主要看作触发一个动作,其被点击的时候会发送一个click的功能,此时会被app对象接收,并相应其quit槽进行处理。此程序的目的是发射一个退出指令,qt程序退出。
QPushButton是qt的一个Button,至于详细内容可查看后期详细讲解。
关于qt信号槽的实现原理在后续文章会进行专题研究。
为了便于理解值得一提的是,qt的信号槽需要moc工具协助完成,其会对signals下的信号及slots下的槽函数进行一个等级管理,在连接的时候通过SIGNAL及SLOT槽完成对应的信号槽的对接,以实现准确调用。
转载于:https://blog.51cto.com/hongbin0720/1230096