QT信号(SIGNAL)与槽(SLOT)

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

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

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

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

//QT 5.6
#include 
#include 
#include 

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表达式。

你可能感兴趣的:(QT)