<Qt> 在connect中使用lambda实现高效的信号/槽关联

在Qt中,使用QCoreApplication::connect()函数连接信号(signal)与槽(slots)的功能。
以下是connect函数的三种重载形式:

static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);

static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,const QObject *receiver, const QMetaMethod &method,Qt::ConnectionType type = Qt::AutoConnection);

inline QMetaObject::Connection connect(const QObject *sender, const char *signal,const char *member, Qt::ConnectionType type = Qt::AutoConnection) const;

可以在函数声明中明显看出各个形参对应的意义,分别是[信号发送者,信号,接收者,槽],比如需要实现一个widget中点击button关闭窗口的功能,在Qt4这等老版本中,connect的写法是这样的:

connect(button,SIGNAL(QPushButton::cliked()),widget,SLOT(QWidget::close()));

每次都要添加SIGNAL/SLOT修饰符就显得很麻烦,所以在Qt5中,改进了connect的写法,可以直接用&代替修饰符

connect(button,&QPushButton::cliked,widget,&QWidget::close);

这样的写法更简洁但是有一个问题就是无法向signal/slot函数传参,只能对无参版本的信号/槽生效,所以在有参数的情况下,只能选用第一种写法。

connect函数中,还有一个重要的限制!在传参的情况下,slot函数的参数个数一定要小于等于signal函数的参数个数,这样当signal函数是clicked()这样的无参形式时,我们不能与带参数的slot函数进行关联,这就意味着:如果我们想通过点击一个按钮实现一个较为复杂的功能,而这个功能的实现必须按需将实参传入slot函数,那么用传统的connect方法时行不通的。

在Qt5的新版本中,connect函数添加了对lambda的支持!——可以用lambda替代signal/slot函数。

这一feature的引进大大简化了slot函数的实现,更自由地扩充其功能,并且可以不受signal参数的影响(因为lambda可以捕获参数)而且connect的形式也进一步精简了。

比如我希望在点击一个button时,实现数据库的更新,页面的跳转,然后页面的关闭,那么只需要这么写:

connect(button,&QPushButton::cliked,[this,new_data,new_page]{
  UpdateDatabase(new_data);
  OpenNewPage(new_page);
  close();
});

甚至连信号的接受者都不用指定了。

lambda is powerful!!!

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值