QT5 信号槽连接机制

信号槽是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 *的类型。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值