当前位置: 首页 > news >正文

使用新语法连接Qt 5中重载的信号和槽

在使用Qt 5中的新信号和槽连接语法(使用成员函数指针)时,我遇到了一些问题。根据新的信号槽语法的描述,我尝试将以下代码:

QObject::connect(spinBox, SIGNAL(valueChanged(int)),slider, SLOT(setValue(int)));

改为:

QObject::connect(spinBox, &QSpinBox::valueChanged,slider, &QSlider::setValue);

但在编译时出现错误:

error: no matching function for call to QObject::connect(QSpinBox*&,<unresolved overloaded function type>, QSlider*&, void(QAbstractSlider::*)(int))

我在Linux上使用clang和gcc编译,且都使用了-std=c++11选项。

问题分析

错误消息指出:"unresolved overloaded function type"。编译器无法确定你是指QSpinBox::valueChanged(int)还是QSpinBox::valueChanged(QString),因为这两个信号名称是重载的。

解决方法

使用qOverload (Qt 5.7及更高版本)

从Qt 5.7开始,提供了一些辅助函数来简化选择特定重载的方法,可以这样写:

connect(spinBox, qOverload<int>(&QSpinBox::valueChanged),slider, &QSlider::setValue);

早期版本的解决方案

对于Qt 5.6及更早版本,你需要通过类型转换明确指定要使用的重载信号:

connect(spinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),slider, &QSlider::setValue);

虽然这种方法看起来不美观,但这是解决问题的唯一办法。因此,最好避免信号和槽的重载。

使用宏定义简化代码

你可以定义一个宏来简化类型转换:

#define CONNECTCAST(OBJECT, TYPE, FUNC) static_cast<void(OBJECT::*)(TYPE)>(&OBJECT::FUNC)

之后,使用这个宏来连接信号和槽:

QObject::connect(spinBox, CONNECTCAST(QSpinBox, int, valueChanged),slider, &QSlider::setValue);

使用lambda表达式

另一种方法是使用lambda表达式将槽包装起来:

connect(spinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),[slider](int value) { slider->setValue(value); });

这样可以避免显式的类型转换,使代码更简洁。

总结

在Qt 5中,当处理重载信号和槽时,有多种方法可以选择正确的重载。根据你的Qt版本,可以使用辅助函数qOverload、类型转换、宏定义或者lambda表达式来解决这个问题。无论哪种方法,都能确保在编译时进行类型检查,从而提高代码的可靠性。

相关文章:

  • 输出数据到excel中
  • 如何优雅地使用 console.log 打印数组或对象
  • 51单片机STC89C52RC——4.1 独立按键(数码管显示按键值)
  • 机器人里程计(Odometry)
  • Meta-Llama-3-8B 部署
  • 英语(1)-读音规则-连读-失去爆破
  • AJAX 数据库
  • 发那科机器人IO 分配
  • C# WPF入门学习主线篇(二十三)—— 控件模板(ControlTemplate)和数据模板(DataTemplate)
  • [pycrypto][python]pycrypto所有whl文件下载地址汇总
  • 基于自编码器的心电图信号异常检测(Python)
  • 近期学习文章
  • 基于单电阻采样的电流重构
  • <Rust><iced><resvg>基于rust使用iced构建GUI实例:使用resvg库实现svg转png
  • 数据仓库的实际应用示例-广告投放平台为例
  • [译]前端离线指南(上)
  • java第三方包学习之lombok
  • jquery ajax学习笔记
  • Koa2 之文件上传下载
  • NSTimer学习笔记
  • Puppeteer:浏览器控制器
  • uva 10370 Above Average
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue学习第二天
  • yii2权限控制rbac之rule详细讲解
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端知识点整理(待续)
  • 如何合理的规划jvm性能调优
  • NLPIR智能语义技术让大数据挖掘更简单
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ######## golang各章节终篇索引 ########
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #pragma data_seg 共享数据区(转)
  • #vue3 实现前端下载excel文件模板功能
  • (07)Hive——窗口函数详解
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Git) gitignore基础使用
  • (java)关于Thread的挂起和恢复
  • (PADS学习)第二章:原理图绘制 第一部分
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (九)One-Wire总线-DS18B20
  • (论文阅读11/100)Fast R-CNN
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .net FrameWork简介,数组,枚举
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET/C# 的字符串暂存池
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @NestedConfigurationProperty 注解用法
  • @WebServiceClient注解,wsdlLocation 可配置
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt