作者:朱金灿
来源:http://blog.csdn.net/clever101
QT的事件机制采用的信号槽机制。所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信号,这个按钮的单击处理函数就是一个信号处理函数。因此信号槽机制是需要指定四个参数:信号发送者、发送者、信号接收者和信号处理函数。下面以一个简单的代码示例来说明:
#include "stdafx.h" #include <QtGui/QApplication> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton* pButton = new QPushButton("Quit"); QObject::connect(pButton,SIGNAL(clicked()),&app,SLOT(quit())); pButton->show(); return app.exec(); }
在这段代码中,当单击按钮时,按钮会发送clicked()消息,这个消息可以连接到一个函数上(这个函数在这里成为slot)。这样,当一个消息发送时,slot函数可以自动执行。其中QObject::connect函数的语法如下:connect(snder,SIGNAL(signal),receiver,SLOT(slot));
Sender和receiver是QObject对象指针,signal和slot是不带参数的函数原型。SIGNAL()和SLOT()宏的作用是把他们转换成字符串。
信号槽机制有以下规则:
1.一个信号可以连接到多个槽,当信号发出后,槽函数都会被调用,但是调用的顺序是随机的,不确定的。
2.多个信号可以连接到一个槽,任何一个信号发出,槽函数都会执行。
3.一个信号可以和另一个信号相连,第一个信号发出后,第二个信号也同时发出。除始之外
,信号与信号连接上和信号和槽连接相同。
4.连接disconnect函数删除,这个函数很少使用,一个对象删除后,Qt自动删除这个对象的所有连接。
5.信号和槽函数必须有着相同的参数类型,这样信号和槽函数才能成功连接。如果信号里的参数个数多于槽函数的参数,多余的参数被忽略。如果参数类型不匹配,或者信号和槽不存在,在debug状态时,Qt会在运行期间给出警告。如果信号和槽连接时包含了参数的名字,Qt将会给出警告。