信号槽是QT最重要的机制之一,QT5中对这一机制进行了升级,使之更好用。
首先看下这个例子:
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton button("Quit");
// qt 5.0 signal-slot
QObject::connect(&button, &QPushButton::clicked, &QApplication::quit);
button.setDefault(true);
button.show();
return a.exec();
}
在qt4.*的里是不能编译运行的。
QT5的信号槽连接基本形式没有变:
connect(sender, signal, receiver, slot);
但是参数有变化QObject的connect有五个重载:
QMetaObject::Connection connect(const QObject *, const char *,
const QObject *, const char *,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
const QObject *, const QMetaMethod &,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, const char *,
const char *, Qt::ConnectionType) const;
缺少receiver,其实是省略了this。
以上三种是QT4所有的,以下为QT5中新增的。(我们的例子是使用了下面第二种)
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
const QObject *, PointerToMemberFunction,
Qt::ConnectionType)
PointerToMemberFunction: 指向成员函数的指针
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
Functor);
Functor: 这个类型可以接受 static 函数、全局函数以及 Lambda 表达式
但是一些特殊的信号和槽方法还是必须要用宏SIGNAL() SLOT(),例如:
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));
如果我们查看这两个宏的定义,就会发现他们是const char *的类型。