重载信号、槽的多种 connect 方式
以QComboBox的currentIndexChanged信号为例:
void QComboBox::currentIndexChanged(const QString &text)
void QComboBox::currentIndexChanged(int index)
可以看出QComboBox的currentIndexChanged信号有两个重载函数,参数分别为QString和int,如果直接使用connect函数则会导致编译不通过。
方法1:基于字符串匹配
auto *comboBox = new QComboBox;
auto *label = new QLabel;
// 基于字符串匹配 connect
connect(comboBox, SIGNAL(currentIndexChanged(const QString&)),
label, SLOT(setText(const QString&)));
方法2:基于方法地址匹配(static_cast)
auto *comboBox = new QComboBox;
auto *label = new QLabel;
// 基于方法地址匹配 connect. 使用 static_cast 实现
connect(comboBox,
static_cast<void(QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged),
label,&QLabel::setText);
方法3:基于方法地址匹配(方法地址)
auto *comboBox = new QComboBox;
auto *label = new QLabel;
// ③ 基于方法地址匹配 connect, 使用 方法地址 实现
void(QComboBox::*curChangeSiganl)(const QString&) = &QComboBox::currentIndexChanged;
connect(comboBox, curChangeSiganl, label, &QLabel::setText);
方法4:基于方法地址匹配(QOverload和qOverload)
注意:此方法需要QT5.7以上版本
auto *comboBox = new QComboBox;
auto *label = new QLabel;
// 基于方法地址匹配 connect, 使用 QOverload 实现
connect(comboBox, QOverload<const QString&>::of(&QComboBox::currentIndexChanged),
label, &QLabel::setText);
// 基于方法地址匹配 connect, 使用 qOverload 实现. 需要 支持 C++14
connect(comboBox, qOverload<const QString&>(&QComboBox::currentIndexChanged),
label, &QLabel::setText);
qOverload、qNonConstOverload和qConstOverload
qOverload
qOverload返回指向(成员)函数的指针。
auto qOverload(T functionPointer)
例子:
struct Foo {
void overloadedFunction();
void overloadedFunction(int, const QString &);
};
... qOverload<>(&Foo::overloadedFunction)
... qOverload<int, const QString &>(&Foo::overloadedFunction)
qNonConstOverload 和 qConstOverload
针对函数有const重载时, 可以使用qConstOverload和qNonConstOverload来区分。
其中qConstOverload返回有const重载的函数,qNonConstOverload返回非const重载的函数
auto qNonConstOverload(T memberFunctionPointer) //返回非const重载
auto qConstOverload(T memberFunctionPointer) //返回const重载
例子:
注意:qOverload 需要 C++14 支持. 因此针对 C++11, 可以使用 QOverload、QConstOverload、QNonConstOverload 辅助类
struct Foo {
void overloadedFunction(int, const QString &);
void overloadedFunction(int, const QString &) const;
};
//针对const重载, 可以使用qConstOverload和qNonConstOverload
... qConstOverload<int, const QString &>(&Foo::overloadedFunction)
... qNonConstOverload<int, const QString &>(&Foo::overloadedFunction)
struct Foo {
void overloadedFunction();
void overloadedFunction(int, const QString &);
void overloadedFunction(int, const QString &) const;
};
... QOverload<>::of(&Foo::overloadedFunction)
... QOverload<int, const QString &>::of(&Foo::overloadedFunction)
... QConstOverload<int, const QString &>::of(&Foo::overloadedFunction)
... QNonConstOverload<int, const QString &>::of(&Foo::overloadedFunction)