概述

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信号连接的几种写法相关推荐

  1. Qt——P12 信号连接信号

    widget.cpp #include "widget.h" #include "ui_widget.h" #include <QPushButton&g ...

  2. mysql多表添加怎么写_mysql多表连接的几种写法

    在数据库进行多张表的查询,必定会用到多表关联,只要是多表关联,就会产生笛卡儿积(什么是笛卡儿积:最简单的解释,就是你要关联的每张表总记录的乘积),所以一定要写关联条件.关联条件就是在所产生的笛卡儿积之 ...

  3. Qt之connect函数—信号槽连接的几种方式和优缺点

    connect函数在qt中作为连接信号和槽的函数,并不陌生.它目前有以下3种写法: 1.使用SIGNAL和SLOT宏 connect(ui->pushButton,SIGNAL(clicked( ...

  4. 技术点:connect函数的几种写法及连接方式

    技术点:connect函数的几种写法及连接方式 沭osTT 0.077 2020.07.21 09:38:09 字数 2,494 阅读 2,336 前言 conncet函数是QT中信号和槽机制的实现函 ...

  5. Qt断开信号与槽的方法,Qt信号的处理 (connect和disconnect和blockSignals的使用方法)

    关于信号与槽的研究 DisConnect: bool QObject::disconnect(const QObject * sender, const char * signal, const QO ...

  6. qt connect函数_Qt Inside信号和槽之connect

    上次和大家分享的是Qt信号和槽的一些宏定义以及元对象编译器.这次和大家分享信号和槽的connect函数到底连接了什么.还有元对象编译器都生成了什么代码. 很多讲Qt信号和槽的文章都会讲到元对象编译器生 ...

  7. Qt connect()的第五种重载[=](){}

    Qt connect()的第五种重载[=](){} 进行网络相关编程时,需要使用信号和槽,碰到一个={}作为槽函数的语句. [用途]实现函数内部的信号接收. [原语句] connect(tcpSock ...

  8. QT多线程的两种写法

    文章目录 第一种写法 第二种写法 第一种写法 写一个类继承QThread重写一个方法run,内部实现需要执行的任务,开始子进程start. Qt4.7版本以前 需求: 主线程:使lcd数字++:子线程 ...

  9. QT下信号与槽不在同一个线程中如何connect

    QT下信号与槽不在同一个线程中如何connect

最新文章

  1. ImageNet训练再创纪录!谷歌提出1个小时训练EfficientNet,准确率高达83%!
  2. 图像处理 区域删除_FotoWorks XL( 图像处理软件 )中文版分享
  3. JDBC连接oracle连接池问题解决
  4. __block 和 __weak的区别
  5. 476. 数字的补数
  6. 对996最客观的描述,一叶知秋
  7. 查看指定进程io状态的iotop命令
  8. sourceInsight
  9. 阿里云磐久服务器M系列研发之路
  10. [2018.10.25 T3] 旅程
  11. 《计算机网络 自顶向下方法》(第7版)答案(第九章)
  12. 外星人m15键盘灯光设置_Alienware Command Center灯光软件高级设置
  13. 轨迹路线生成与运动插件 Curvy Spline 的使用
  14. 模拟京东登陆 java_java京东自动登录
  15. dreamweaver php网站模板,用DreamWeaver模板工具批量制作网页
  16. Python 商务统计学 lesson 01
  17. java读取Excel文件并各方案对比
  18. Pygame实战:这款“欢乐打地鼠”小游戏让几亿人“上瘾“?不玩绝对是你的损失。
  19. 【如何选】校园卡购买必读,移动联通电信校园卡套餐对比及购买策略(1预热)...
  20. 2 PC 有它,你就够了!

热门文章

  1. 互联网1分钟 |1129
  2. Vue(五)Vue规范
  3. Linux最佳聊天软件:Skype 4.3轻体验
  4. 中国联通SDN/NFV的思考与实践
  5. ci 框架插入时返回插入的id号
  6. S3 Texture Compression
  7. Jenkins构建项目,JAVA_HOME is not defined correctly
  8. const debug = require(‘debug‘)(‘cnpm‘)
  9. Redis 远程连接和基本命令
  10. 【收藏】spark 连接到yarn resourcemanager失败解决方案