一、引子
在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; }
};
解读:
 这段代码定义了三个结构体:QNonConstOverload、QConstOverload和QOverload,它们用于Qt信号和槽机制中解决成员函数重载的问题。这些结构体允许你在连接信号和槽时明确指定使用哪个重载版本的成员函数。
QNonConstOverload
 
QNonConstOverload结构体专门用于非const成员函数的重载。它包含两个模板方法:
 operator(): 一个调用操作符重载,接受一个非const成员函数指针并返回它。这允许在使用对象时通过调用操作符语法选择特定的重载。
 of: 一个静态方法,功能与operator()相同,但可以在不创建QNonConstOverload实例的情况下使用。
QConstOverload
 
QConstOverload结构体与QNonConstOverload相似,但专门用于const成员函数的重载。
QOverload
 
QOverload结构体继承自QConstOverload和QNonConstOverload,结合了它们的功能,使得既可以用于const成员函数也可以用于非const成员函数的重载。此外,它还提供了对普通函数(非成员函数)的支持。
using QConstOverload<Args...>::of; 和 using QConstOverload<Args...>::operator(); 语句导入QConstOverload中的of和operator()方法,使它们可以在QOverload实例中使用。
using QNonConstOverload<Args...>::of; 和using QNonConstOverload<Args...>::operator();语句导入QNonConstOverload中的of和operator()方法,同样使它们可以在QOverload实例中使用。
QOverload还定义了自己的operator()和of方法,用于处理普通函数的重载。