QT5中的信号与槽与C++ 11的function的配合

最近将公司的界面开发库从WX转换到了QT,有了信号和槽,原本我们在使用WX的时候,为了使用信号,我们是使用BOOST的signal2库,到了QT有了信号槽,这个就没什么必要了

但是前段时间使用QT发现QT的信号和槽没有placeholder,也就是占位符,于是信号和槽声明只能严格地一样,比如

void slot(int val);

void signal( int val);

但是在signals2,我们可用利用placeholder,及时函数声明不一样,也可用进行connect

void slot(int val);

void signal( int val);

void slot1(int val,double x,double y);

void slot2(double x,int val );

这样我们可用少写很多代码来对数据进行binding,组里其他人为了达到这种效果,于是要么声明一个类,然后类里面声明一堆可能用到的数据,再发送,有的则是发送多个信号,非常蛋疼

我本来想把qt的信号换成boost的信号,后来老大不同意,理由是增加学习成本,虽然我一直觉得没什么成本

不过后来写代码的是否发现QT里面connect有多个声明,我看了下,一个声明是由类似于boost的利用模板的,我尝试使用了下,发现确实可用使用匿名函数

connect( sender,&signal,[&](void) {lambdafunctionBody;} );

但是在使用bind的时候,死活都无法connect,一旦connect就会编译错误

auto fnBind = boost::bind( &class::function,this );

connect( sender,&slot,fnBind );

调了一下午才发现,QT的connect是使用模板的,他不会自动把fnBind转换为function,这样在编译的时候,自然因为不符合function的语法而编译错误,而auto是会

把fnBind推导为boost::bind类型的,于是只能自己手动编写了

boost::function<void(void)> fnBind = boost::bind( &class::function,this );

connect( sender,&slot,fnBind );

编译通过,不用写那么蛋疼的代码了

时间: 2024-07-31 14:30:37

QT5中的信号与槽与C++ 11的function的配合的相关文章

第78课 多线程中的信号与槽(上)

1. QThread类中的信号和槽 (1)QThread类拥有发射信号和定义槽函数的能力 (2)QThread中的关键信号 ①void started():线程开始运行时发射该信号 ②void finished():线程完成运行时发射该信号 ③void terminated():线程被异常终止时发射该信号 2. 与线程相关的概念 (1)线程栈 ①进程中存在栈空间的概念(区别于栈数据结构) ②栈空间专用于函数调用(保存函数参数.局部变量等) ③线程拥有独立的栈空间(可调用其它函数) ④只要函数体中

PyQt5中的信号与槽,js 与 Qt 对象之间互相调用

一.PyQt中的信号与槽 信号(Signal)和槽(Slot)是Qt中的核心机制,用在对象之间互相通信.在Qt中每个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制.当信号发射时,连接的槽函数将会执行.在PyQt5中信号与槽通过object.signal.connect()方法连接. 1.1 关于信号和槽的常识 Qt 提供了信号可以使用,当然你也可以QtCore.pySignal()来自定义信号 一个信号可以连接多个槽: 一个信号也

Qt--QGraphicsItem 子类中使用信号与槽

最近,在使用Qt做一个小软件,其中用到了QGraphicsItem,并且需要使用信号与槽机制.QGraphiIcs的子类要实现信号与槽机制需要继承QObject. class Node : public QObject,public QGraphicsItem { Q_OBJECT       .... } 注意:一定要将public QObject放在public QGraphicsItem的前面,并且在该类的定义中添加Q_OBJECT宏. 编译时出现警告 Warning: Class Nod

Qt中使用信号和槽的一点心得

信号(Signal)与槽(Slot)-Qt中的典型机制 这一篇文章中都说得很详细了,这里不再重复,只说一点在实际使用中可能会遇到的问题. 1.一个信号不要同时连接几个槽函数,不然执行的顺序是随机的,最后的结果可能会和自己期待的有出入. 2.基本上,所有的信号连接槽函数之后,会执行完当前连接的槽函数,然后再执行emit信号之后的内容.但是也会有意外的情况发生:如果当前信号里面要执行的内容过于复杂(e.g.slots中又包含emit信号,本身slots函数又比较复杂等等),会导致线程之间的混乱,可能

Qt中的信号和槽函数。

1:写一个close按钮当单击此按钮时就执行槽函数,而关闭窗口. 1 #include "slot.h" 2 #include <QApplication> 3 #include<QPushButton> 4 #include<time.h> 5 #ifndef SLOT_H 6 #define SLOT_H 7 #include <QMainWindow> 8 #include <QObject> 9 #include &l

第八十课、多线程中的信号与槽(下)

一.线程体函数开启了事件循环,线程如何正常结束 1.QThread::exec()使得线程进入事件循环 (1).事件循环结束前,exec()后的语句无法执行 (2).quit()和exit()函数用于结束事件循环 (3).quit() <---->exit(0),exec()的返回值由exit()参数决定 2.注意 (1).无论事件循环是否开启,信号发送后会直接进入所依附线程的事件队列 (2).然而,只有开启了事件循环,对应的槽函数才会在线程中被调用  二.什么时候需要开启事件循环 1.设计原

qt中信号与槽机制

一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信. 信号 当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号.这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用. 槽 用于接收信号,而且槽只是普通的对象成员函数.一个槽并不知

Qt on Android: Qt Quick 事件处理之信号与槽

前面两篇文章< Qt on Android:QML 语言基础>和<Qt on Android: Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简单的 Qt Quick 应用了.接下来呢,哈,我们要介绍 Qt Quick 中一个灰常灰常重要的主题:事件处理.这将是比较长长长长的一篇,哦,不还有后续好几篇--废话少说,还是谈正事儿吧兄弟姐妹们. 本文参加 CSDN 博文大赛,请点这里投我一票,谢

如何在VS2013+QT5.3环境下使用自定义信号与槽函数

图1中标注出来的是VS2013中的QT界面设计师文件,双击默认打开的是Qt设计师工具. 在界面上面拉入一个PushButton,点击编辑信号与槽按钮进入编辑模式. 选择信号clicked(),发现可以从QWidget继承很多槽函数,暂时先选择close()槽函数,点OK 保存后,VS2013中有个文件“ui_testqt.h”会自动生成信号与槽的代码.此文件也是生成界面文件的源代码. 目前都是使用的默认的信号与槽函数,如果想触发自定义的槽函数呢?我们会想到可以直接修改ui_testqt.h里面的