Qt connect信号连接的几种写法
概述
Qt 中的信号和槽应该是最熟悉不过的了,连接信号和槽的关键字 connect有五种连接类型,今天不是介绍这五种连接类型,而是简单的总结一下 connect 的几种新旧写法,其实在新版本中几种写法都能适用,看个人习惯吧。
第一种
首先来看看老版本的 connect 写法,比较复杂些,需要将信号和槽进行明确的指定,包括形参。
看一个示例:
为方便演示,先自定义一个 Button,然后定义两个重载的信号
class MyButton : public QWidget
{Q_OBJECT
public:explicit MyButton(QWidget *parent = nullptr);signals:void sigClicked();void sigClicked(bool check);
};
那么在用这个 Button 的时候连接这两个信号,按照旧版本的写法,应该是这样:
connect(m_pBtn,SIGNAL(sigClicked()),this,SLOT(onClicked()));
connect(m_pBtn,SIGNAL(sigClicked(bool)),this,SLOT(onClicked(bool)));
这种写法比较麻烦,常常在用的时候缺少括号,不过该写法很明确,一眼就能看出来是将哪个信号连接到哪个槽。
第二种
接着上面的示例,在 Qt5.0以后推出一种新的写法,如下:
connect(m_pBtn,&MyButton::sigClicked,this,&Widget::onClicked);
这种写法看起来很简洁,但是存在一些坑需要注意,这句写法如果用在上面的示例中,会报错下面的错误:
error: no matching member function for call to 'connect' connect(m_pBtn,&MyButton::sigClicked,this,&Widget::onClicked);^~~~~~~
这是因为我们自定义的 Button 中存在两个重载信号,然后用这种 connect 的方式会无法识别到底想要连接哪个信号。所以,如果信号是重载的话,需要用下面的写法来替换:
connect(m_pBtn, static_cast<void (MyButton::*)(bool)>(&MyButton::sigClicked), this, &Widget::onClicked);
问题又来了,如果我的onClicked槽也是重载的话,还是会报同样的错误。因为编译器不知道你想要真正连接哪个槽。所以这里建议,如果信号重载,可以用上面的方法来写,如果槽重载…还是用第一种方法来 connect 吧,比较保险,虽然比较麻烦点。
第三种
最后来看一种最新的写法,忘记是在 Qt 的哪个版本推出的了,主要针对重载信号的连接做了调整,会更简单些:
同样是上面的示例:
connect(m_pBtn, QOverload<bool>::of(&MyButton::sigClicked),this,&Widget::onClicked);
很显然这种写法相对于第二种会比较简单些,但依然不能连接到重载的槽函数,如果连接重载槽函数,还是会报之前的错误。
Lambda 函数写法
个人比较喜欢用lambda函数的方式,如果槽函数中的内容比较简单的话,没必要再去单独定义一个槽来连接, 直接用Lambda 函数会更简单。
来看一下示例:
connect(m_pBtn, QOverload<bool>::of(&MyButton::sigClicked),[=](bool check){/* do something.. */ });
connect(m_pBtn, static_cast<void (MyButton::*)(bool)>(&MyButton::sigClicked), this, [=](bool check){//do something});
Qt connect信号连接的几种写法相关推荐
- Qt——P12 信号连接信号
widget.cpp #include "widget.h" #include "ui_widget.h" #include <QPushButton&g ...
- mysql多表添加怎么写_mysql多表连接的几种写法
在数据库进行多张表的查询,必定会用到多表关联,只要是多表关联,就会产生笛卡儿积(什么是笛卡儿积:最简单的解释,就是你要关联的每张表总记录的乘积),所以一定要写关联条件.关联条件就是在所产生的笛卡儿积之 ...
- Qt之connect函数—信号槽连接的几种方式和优缺点
connect函数在qt中作为连接信号和槽的函数,并不陌生.它目前有以下3种写法: 1.使用SIGNAL和SLOT宏 connect(ui->pushButton,SIGNAL(clicked( ...
- 技术点:connect函数的几种写法及连接方式
技术点:connect函数的几种写法及连接方式 沭osTT 0.077 2020.07.21 09:38:09 字数 2,494 阅读 2,336 前言 conncet函数是QT中信号和槽机制的实现函 ...
- Qt断开信号与槽的方法,Qt信号的处理 (connect和disconnect和blockSignals的使用方法)
关于信号与槽的研究 DisConnect: bool QObject::disconnect(const QObject * sender, const char * signal, const QO ...
- qt connect函数_Qt Inside信号和槽之connect
上次和大家分享的是Qt信号和槽的一些宏定义以及元对象编译器.这次和大家分享信号和槽的connect函数到底连接了什么.还有元对象编译器都生成了什么代码. 很多讲Qt信号和槽的文章都会讲到元对象编译器生 ...
- Qt connect()的第五种重载[=](){}
Qt connect()的第五种重载[=](){} 进行网络相关编程时,需要使用信号和槽,碰到一个={}作为槽函数的语句. [用途]实现函数内部的信号接收. [原语句] connect(tcpSock ...
- QT多线程的两种写法
文章目录 第一种写法 第二种写法 第一种写法 写一个类继承QThread重写一个方法run,内部实现需要执行的任务,开始子进程start. Qt4.7版本以前 需求: 主线程:使lcd数字++:子线程 ...
- QT下信号与槽不在同一个线程中如何connect
QT下信号与槽不在同一个线程中如何connect
最新文章
- ImageNet训练再创纪录!谷歌提出1个小时训练EfficientNet,准确率高达83%!
- 图像处理 区域删除_FotoWorks XL( 图像处理软件 )中文版分享
- JDBC连接oracle连接池问题解决
- __block 和 __weak的区别
- 476. 数字的补数
- 对996最客观的描述,一叶知秋
- 查看指定进程io状态的iotop命令
- sourceInsight
- 阿里云磐久服务器M系列研发之路
- [2018.10.25 T3] 旅程
- 《计算机网络 自顶向下方法》(第7版)答案(第九章)
- 外星人m15键盘灯光设置_Alienware Command Center灯光软件高级设置
- 轨迹路线生成与运动插件 Curvy Spline 的使用
- 模拟京东登陆 java_java京东自动登录
- dreamweaver php网站模板,用DreamWeaver模板工具批量制作网页
- Python 商务统计学 lesson 01
- java读取Excel文件并各方案对比
- Pygame实战:这款“欢乐打地鼠”小游戏让几亿人“上瘾“?不玩绝对是你的损失。
- 【如何选】校园卡购买必读,移动联通电信校园卡套餐对比及购买策略(1预热)...
- 2 PC 有它,你就够了!
热门文章
- 互联网1分钟 |1129
- Vue(五)Vue规范
- Linux最佳聊天软件:Skype 4.3轻体验
- 中国联通SDN/NFV的思考与实践
- ci 框架插入时返回插入的id号
- S3 Texture Compression
- Jenkins构建项目,JAVA_HOME is not defined correctly
- const debug = require(‘debug‘)(‘cnpm‘)
- Redis 远程连接和基本命令
- 【收藏】spark 连接到yarn resourcemanager失败解决方案