Qt : 如何解决重载引起的歧义

server/2024/9/24 14:21:22/

一、引子

在Qt中编写代码,进行信号和槽函数的连接时,如果采用新的语法,如:

   connect(ui->doubleSpinBox, &QDoubleSpinBox::valueChanged,this,&App::minValueChanged);

当你准备快乐编译时,突然被背刺。卧槽,valueChanged信号是被重载过的,这里无法识别你用的哪一个。


Q_SIGNALS:void valueChanged(double);void valueChanged(const QString &);

痛啊,那怎么解决这个问题呢,办法当然有,如下:

二、解决办法

connect(ui->doubleSpinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,&App::minValueChanged);

三、浅谈下QOverload<double>::of

template <typename... Args>
struct QNonConstOverload
{template <typename R, typename T>Q_DECL_CONSTEXPR auto operator()(R (T::*ptr)(Args...)) const Q_DECL_NOTHROW -> decltype(ptr){ return ptr; }template <typename R, typename T>static Q_DECL_CONSTEXPR auto of(R (T::*ptr)(Args...)) Q_DECL_NOTHROW -> decltype(ptr){ return ptr; }
};template <typename... Args>
struct QConstOverload
{template <typename R, typename T>Q_DECL_CONSTEXPR auto operator()(R (T::*ptr)(Args...) const) const Q_DECL_NOTHROW -> decltype(ptr){ return ptr; }template <typename R, typename T>static Q_DECL_CONSTEXPR auto of(R (T::*ptr)(Args...) const) Q_DECL_NOTHROW -> decltype(ptr){ return ptr; }
};template <typename... Args>
struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...>
{using QConstOverload<Args...>::of;using QConstOverload<Args...>::operator();using QNonConstOverload<Args...>::of;using QNonConstOverload<Args...>::operator();template <typename R>Q_DECL_CONSTEXPR auto operator()(R (*ptr)(Args...)) const Q_DECL_NOTHROW -> decltype(ptr){ return ptr; }template <typename R>static Q_DECL_CONSTEXPR auto of(R (*ptr)(Args...)) Q_DECL_NOTHROW -> decltype(ptr){ return ptr; }
};

解读:
这段代码定义了三个结构体:QNonConstOverloadQConstOverloadQOverload,它们用于Qt信号和槽机制中解决成员函数重载的问题。这些结构体允许你在连接信号和槽时明确指定使用哪个重载版本的成员函数。

QNonConstOverload

QNonConstOverload结构体专门用于非const成员函数的重载。它包含两个模板方法:
operator(): 一个调用操作符重载,接受一个非const成员函数指针并返回它。这允许在使用对象时通过调用操作符语法选择特定的重载。
of: 一个静态方法,功能与operator()相同,但可以在不创建QNonConstOverload实例的情况下使用。

QConstOverload

QConstOverload结构体与QNonConstOverload相似,但专门用于const成员函数的重载。

QOverload

QOverload结构体继承自QConstOverloadQNonConstOverload,结合了它们的功能,使得既可以用于const成员函数也可以用于非const成员函数的重载。此外,它还提供了对普通函数(非成员函数)的支持。

using QConstOverload<Args...>::of;using QConstOverload<Args...>::operator(); 语句导入QConstOverload中的ofoperator()方法,使它们可以在QOverload实例中使用。

using QNonConstOverload<Args...>::of;using QNonConstOverload<Args...>::operator();语句导入QNonConstOverload中的ofoperator()方法,同样使它们可以在QOverload实例中使用。

QOverload还定义了自己的operator()of方法,用于处理普通函数的重载。


http://www.ppmy.cn/server/10425.html

相关文章

批量更新 AWS ECS Fargate 服务

AWS ECS Fargate 是一种全托管的容器部署服务,可以帮助用户轻松地管理和运行容器化的应用程序。在实际应用中,经常需要对多个服务进行更新以保持系统的稳定性和安全性。本文将介绍如何使用 Python SDK 批量更新 AWS ECS Fargate 服务,并提供完整的代码示例。 1. 准备工作 …

C++奇迹之旅:从0开始实现日期时间计算器

文章目录 &#x1f4dd;前言&#x1f320; 头文件Date.h&#x1f309;日期计算函数&#x1f320;前后置&#x1f309;前后置-- &#x1f320;两对象日期相减&#x1f309;自定义流输入和输出 &#x1f309; 代码&#x1f309; 头文件Date.h&#x1f320;Date.cpp&#x1f309; …

LLAMA 3的测试之旅:在GPT-4的阴影下前行

Meta终于发布了他们长期期待的LLAMA 3模型&#xff0c;这是一个开源模型&#xff0c;实际上提供了一系列新的功能&#xff0c;使得模型在回答问题时表现得更好。这对AI社区来说是一个真正的里程碑事件。 Meta正在发布新版本的Meta AI&#xff0c;这是一种可以在他们的应用程序和…

『docker』 容器虚拟化技术之空间隔离实战

文章目录 容器虚拟化基础之 NameSpaceNameSpace 隔离实战实战目的基础知识dd 命令详解mkfs 命令详解df 命令详解mount 命令详解unshare 命令详解 实战操作一&#xff08;PID 隔离&#xff09;实战操作二&#xff08;Mount 隔离&#xff09; 容器虚拟化基础之 NameSpace 什么是…

灭火器检查记录卡模板如何制作

灭火器是常见的消防设备&#xff0c;为确保灭火器正常使用&#xff0c;需要定期对灭火器进行检查和维护&#xff1b;而灭火器检查记录卡就是用来记录灭火器检查的重要工具。然而传统的灭火器检查记录卡都是纸质的&#xff0c;哪怕我们采购多好多贵材质做的检查卡终归记录有限、…

【大语言模型+Lora微调】10条对话微调Qwen-7B-Chat并进行推理 (聊天助手)

代码&#xff1a;https://github.com/QwenLM/Qwen/tree/main 国内源安装说明&#xff1a;https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary 通义千问&#xff1a;https://tongyi.aliyun.com/qianwen 一、环境搭建 下载源码 git clone https://github.com/QwenLM/Qwen…

MySQL 8.0.23 临时表空间文件ibtmp1暴增原因及解决方法

背景描述 同事反馈现场的MySQL8.0.23支撑库异常停止。分析发现是临时表空间过大撑爆了磁盘导致MySQL异常终止。 分析过程 查看MySQL版本 [rootsjjhpt182 mysql]# mysql -V mysql Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL) You have mail in /var/spool/m…

如何在PostgreSQL中备份和恢复整个数据库,包括相关的用户和权限设置?

文章目录 备份数据库恢复数据库 PostgreSQL数据库管理系统提供了多种备份和恢复策略&#xff0c;其中pg_dump和psql工具是最常用的。但需要注意的是&#xff0c;pg_dump主要用于备份数据库的结构和数据&#xff0c;而不包括用户和权限设置。为了备份这些设置&#xff0c;我们需…