Qt之connect函数—信号槽连接的几种方式和优缺点
connect函数在qt中作为连接信号和槽的函数,并不陌生。它目前有以下3种写法:
1、使用SIGNAL和SLOT宏
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(onPushButtonClicked()));
2、使用&类名::函数名
connect(ui->pushButton_2,&QPushButton::clicked,this,&Widget::onSetBlockedSignalStatus);
3、Lambda表达式,关联后直接编写信号发射后要执行的代码。不需要定义槽函数。
connect(ui->pushButton,&QPushButton::clicked,[=](void){ui->label->setText("Hello Qt");});
使用SIGNAL和SLOT宏是Qt4的写法,在Qt5中不仅支持使用SIGNAL和SLOT宏的写法,也支持使用&类名::函数名的写法。使用使用&类名::函数名的写法有以下几个好处:
1、不需要写参数更简便。
2、不需要槽函数的参数类型与信号对应的参数类型完全一致,只需要进行隐藏式转换。
3、可以在编译时进行检查,比如信号或槽函数的拼写错误、槽函数参数数量多于信号的参数数量等都能在编译时期发现,而不是运行时。
就如一些qt的书所言:建议在编写Qt5的代码时使用&类名::函数名的connect方式。
demo:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this->ui->pushButton,&QPushButton::clicked,[=](void){emit sigSendArgs("ip","port");});connect(this,SIGNAL(sigSendArgs(QString,QString)),SLOT(onSendArgs(QString,QString,QString)));//connect(this,&Widget::sigSendArgs,this,&Widget::onSendArgs1);
}Widget::~Widget()
{delete ui;
}void Widget::onSendArgs(QString a, QString b)
{qDebug()<<"a:"<<a<<"b:"<<b;
}void Widget::onSendArgs1(QString, QString, QString)
{}
1、sigSendArgs与onSendArgs的参数不一致,但是编译的时候却并没有发现,直到运行才看到日志打印。
2、如果使用connect(this,&Widget::sigSendArgs,this,&Widget::onSendArgs1);的方式在编译期间就会提示参数不一致的问题。
3、 当我们使用SIGNAL的写法connect一个并不存在的槽函数时,编译器并没有提示。但是如果使用类名的方式,编译就会提示错误:
//connect(this,SIGNAL(sigSendArgs(QString,QString)),SLOT(onSendArgs2(QString,QString)));connect(this,&Widget::sigSendArgs,this,&Widget::onSendArgs2);
Qt之connect函数—信号槽连接的几种方式和优缺点相关推荐
- Qt——P13 Q4版本信号槽连接
widget.cpp #include "widget.h" #include "ui_widget.h" #include <QPushButton&g ...
- QT源码剖析-QT对象通信机制信号槽的绑定具体实现
本文详细介绍QT核心机制之一 信号和槽. 我们在此根据Qt源代码一步一步探究其信号槽的实现过程. 核心知识点: 模板元编程技术. Qt moc预编译机制. QObject类. 目录 1. QObjec ...
- 【Qt开发经验】Qt信号槽连接不成功问题原因汇总
以下几种情况会导致信号槽连接不成功,下面分别描述. 1. 拥有信号槽的类,必须继承QObject,声明Q_OBJECT宏. Qt帮助手册里搜索 "Signals & Slots&qu ...
- VS2008 Qt Designer 中自定义信号槽
一.Qt Designer自定义槽函数 发现:在VS2008 +Qt4.7 中打开ui文件,所用的英文QT Designer工具,没有转到槽函数的功能,不如QtCreator自带的QtDesigne ...
- Qt的connect函数和disconnect函数
Qt的connect函数和disconnect函数 connect的使用方式 disconnect的使用方式 connect的使用方式 qt的connect函数,信号与槽的机制,是QObject的核心 ...
- pyqt5界面与逻辑分离--信号槽的装饰器实现方式
pyqt5界面与逻辑分离--信号槽的装饰器实现方式 本文展示了 pyqt5 信号槽的装饰器实现方式(借鉴自 eirc6) 一个简单的例子.实现功能:两个数相加,显示结果.如图 两个文件,第一个是界面文 ...
- python中如何连接两个字符串_python字符串连接的N种方式总结
python中有很多字符串连接方式,今天在写代码,顺便总结一下: 最原始的字符串连接方式:str1 + str2 python 新字符串连接语法:str1, str2 奇怪的字符串方式:str1 st ...
- Java连接Oracle两种方式thin与oci区别
Java连接Oracle两种方式thin与oci区别 前几天同事跑过来跟我说, 机房中的一台tomcat服务器跟oracle数据库机连接很慢,查看控制台中的hibernate日志, 基本上是一条sql ...
- 计算机连接到网络的接口,路由器与计算机连接的三种方式及设置介绍
如何将路由器连接到计算机进行设置?目前,随着计算机.智能手机.平板电脑等网络设备的普及,人们对网络的需求日益增加,这促进了路由器的广泛使用.然而,大多数用户不知道如何将路由器与计算机连接起来,然后进行 ...
最新文章
- 安卓没删干净导致报错
- 计算机职称在线考试报名系统,计算机职称考试报名时间及入口2021年9月
- PowerDesigner中的对象与关系映射建模
- python语言里数字包括_4.1Python语言中的数字、字符串数据类型讲解
- 【前端就业课 第一阶段】HTML5 零基础到实战(五)基础元素
- python文件和数据的格式化_Python在文本文件中格式化特定数据
- 9 CO配置-控制-成本中心会计-在成本控制范围激活成本中心会计核算
- Springboot vue.js html 跨域 前后分离 Activiti6 shiro 权限
- 分布式文件系统(FastDFS+Tengine+fastdfs-nginx-module)
- 什么是NVMe驱动器,您应该购买一个吗?
- 概率论总结(《概率论与数理统计》第四版 浙江大学)
- 电脑系统运行框代码大全
- Android应用层读写设备节点
- 阿里云OSS使用详解(java版本)
- Android 线程 Damo
- 高通烧录报ufs需要重新provision
- 一分钟详解智能快递柜锁控板方案和原理
- windows 远程桌面无法连接的问题
- 点餐系统Sprint1总结
- 注入(Injection)