QT信号(SIGNAL)与槽(SLOT)

来源:互联网 发布:古筝调音器安卓软件 编辑:程序博客网 时间:2024/05/22 06:54

QT中的信号槽是QT框架中十分重要,同时也是十分特别的机制之一。

对于它的理解,你可以把它当做Windows系统中的消息处理函数。比如,当一个按钮控件被单击了一下,那么它就会发出一个信号(signal),这如同一个广播的消息,等待一个对其感兴趣的对象作出回应。当有一个对象作出回应时会使用连接(connect)函数,意思是,调用自己的一个槽(SLOT)来处理这个信号。也就是说,当信号发生时,被连接的槽会自动被回调。

至于该机制是如何实现的,目前还不关我的事。

接下来,以下面的代码为例说明一下:

//QT 5.6#include <QApplication>#include <QtCore>#include <QPushButton>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QPushButton button("OK");    QObject::connect(&button, &QPushButton::clicked, &QApplication::quit);    button.show();    return a.exec();}

首先说明 一下,我使用的是QT5.6的版本,代码在QT4中可能会编译错误。
我们首先创建一个空的QT Widgets工程,在main.cpp中加入上述代码。点击运行,在弹出的对话框中会有一个“OK”的按钮,点击后,程序会自动退出。

QT中与按钮对应的类叫做“QPushBotton”。继承自QAbstractButton,它基本的显示与创建如同上述代码。代码中的connect函数,用于将button对象的函数clicked()与quit()关联起来。下面仔细说明这个函数。

在QT5中,QObject::connect()有五个重载,在帮助文档中都可找到:

[static]QMetaObject::Connection QObject::connect(const QObject *sender,                                         const char *signal,                                         const QObject *receiver,                                         const char *method,                                         Qt::ConnectionType type = Qt::AutoConnection);[static] QMetaObject::Connection QObject::connect(const QObject *sender,                                          const QMetaMethod &signal,                                          const QObject *receiver,                                          const QMetaMethod &method,                                          Qt::ConnectionType type = Qt::AutoConnection);QMetaObject::Connection QObject::connect(const QObject *sender,                                         const char *signal,                                         const char *method,                                         Qt::ConnectionType type = Qt::AutoConnection) const;[static] QMetaObject::Connection QObject::connect(const QObject *sender,                                          PointerToMemberFunction signal,                                          const QObject *receiver,                                          PointerToMemberFunction method,                                          Qt::ConnectionType type = Qt::AutoConnection);[static]QMetaObject::Connection QObject::connect(const QObject *sender,                                         PointerToMemberFunction signal,                                         Functor functor);

这五个函数的返回值都是“QMetaObject::Connecttion”,现在先不要关心这个,因为我也不知道。在QT中一般使用“connect()”函数的形式是:

connect(object1,    signal,        object2,        slot);

这是常用的方式,需要在信号(signal)外加一个SIGNAL()的宏,槽外加SLOT()宏。上述五个重载函数中第三个比较特别,它不需要传入object2,它其实会自动this作为object2。第五个中的functor参数是Functor,该类型可以接收静态函数,全局函数或者Lambda表达式。

0 0
原创粉丝点击