现在的位置: 首页 > 综合 > 正文

QT5 信号槽连接机制

2018年04月02日 ⁄ 综合 ⁄ 共 1679字 ⁄ 字号 评论关闭

信号槽是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);

但是参数有变化QObjectconnect有五个重载:

    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::ConnectionTypeconst;

   缺少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 *的类型。


抱歉!评论已关闭.