作用
在 Qt 中,QOverload 是一个用于解决信号和槽函数重载问题的辅助工具。当信号或槽函数有多个重载版本时,编译器无法直接确定应该使用哪个版本,这时就需要使用 QOverload 来明确指定要连接的信号或槽的签名。
QOverload 是一个模板工具,用于显式指定信号或槽的签名。它可以帮助编译器确定要连接的函数指针类型。
背景
在 Qt 中,信号和槽是通过 connect 函数连接的。如果信号或槽有多个重载版本,编译器无法自动推断出正确的函数指针类型。例如:
class MyClass : public QObject {
Q_OBJECT
public:
MyClass(QObject* parent = nullptr) : QObject(parent) {}
signals:
void mySignal(int);
void mySignal(const QString&); // 重载版本
};
在这种情况下,直接使用 connect 会导致编译错误,因为编译器无法确定要连接的是哪个 mySignal函数。
用法
1、对于信号有重载,槽没有重载
connect(sender, QOverload<参数类型>::of(&SenderClass::signal), receiver, &ReceiverClass::slot);
2、对于信号无重载,槽函数有重载
connect(sender, &SenderClass::signal, receiver, QOverload<参数类型>::of(&ReceiverClass::slot));
3、信号和槽都有重载
connect(sender, QOverload<参数类型>::of(&SenderClass::signal), receiver, QOverload<参数类型>::of(&ReceiverClass::slot));
简化版本
从 Qt 5.7 开始,qOverload 是 QOverload 的简化版本,语法更简洁,这是更推荐的写法。例如:
connect(sender, qOverload<int>(&SenderClass::signal), receiver, &ReceiverClass::slot);