Qt中信槽的使用

一、信槽的连接
信槽连接有自动和手动两种模式
自动连接通过按照指定规则来定义槽函数的名称,由框架自动将槽与恰当发送对象、信号匹配,并创减连接对象。

手动连接需要显式调用QObject的静态或成员函数connect,来创建连接connection
1、[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
该静态函数需要指定信号发送对象和接收对象的指针,以及通过SIGNAL\SLOT宏来获取的信号、信槽名称串。它不仅可将信号与信槽绑定,还可以将信号与信号绑定,起到信号转发的作用。
2、QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
与方法1类似,但用对象指针代理了接收对象。
3、[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
4、[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
已成员函数指针的方式将信号、信槽或信号、信号绑定。
5、[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
用一个可调用对象来代替接收对象和槽函数,配合c++11中的lambda表达式,在某些情境下非常便利。例如:
connect(sendObj, &SendClass::signalFun, []{QMessageBox::warn(nullptr, "", "hello");});
二、信槽连接的断开
QObject 在Destory时,所有与其关联的Connnection都将被框架自动删除。
可以手动调用Disconnect函数来断开连接
1、用connect时返回的Connection句柄来断开连接
2、指定sender、receiver对象来删除连接,同时可以指定要删除的signal,slot名称,名称为0时会删除与sender,receiver相关联的所有connection

posted @ 2016-10-14 16:51  思危  阅读(687)  评论(0)    收藏  举报