当前位置: 首页 > 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表达式来解决这个问题。无论哪种方法,都能确保在编译时进行类型检查,从而提高代码的可靠性。

http://www.lryc.cn/news/378960.html

相关文章:

  • 梯度提升决策树(GBDT)的训练过程
  • 路由器的Wi-Fi性能是否限制了你的网速?这里有你想要的答案
  • 简站WordPress是最简洁好用易上手的wordpress企业建站主题
  • 阿里云 debian10.3 sudo apt-get updat 报错的解决方案
  • vite中使用scss技巧
  • PyQt5/Pyside2学习记录
  • 记一次通过脚本来实现自定义容器的自动重启
  • 基于Django、Bootstrap的电影推荐系统,算法基于用户的协同过滤算法,有爬虫有可视化后台
  • mysql、mariadb 登录主机的含义,如何修改登录主机,如何删除登录主机
  • c++ 设计模式 的课本范例
  • QT中绘制点阵
  • 机器人里程计(Odometry)
  • 后端实现预览pdf,mp4,图片
  • 【C++】数据类型、函数、头文件、断点调试、输入输出、条件与分支、VS项目设置
  • Spring框架的原理及应用详解(六)
  • C++ | Leetcode C++题解之第151题反转字符串中的单词
  • Leetcode 415. 字符串相加-大数相加
  • IDEA集成Docker实现快捷部署
  • 五十四、openlayers官网示例LineString Arrows解析——在地图上绘制箭头
  • 内核学习——3、自旋锁的作用及其实现
  • 恒昌公益第五所“云杉校园”于湖南怀化正式揭牌
  • 番外篇 | YOLOv8算法解析和实战应用:车辆检测 + 车辆追踪 + 行驶速度计算
  • 【React】useState 的原理
  • 从二元一次方程组到二阶行列式再到克拉默法则
  • 示例:WPF中绑定枚举到ComboBox想显示成中文或自定义名称如何实现
  • 嵌入式系统软件架构设计方法
  • 【面试题】风险评估和应急响应的工作流程
  • Vue70-路由的几个注意点
  • Aidlux 1.4 部署Nextcloud 2024.6实录 没成功
  • 网络与协议安全复习 - 电子邮件安全