❝最近使用Qt5风格的信号槽,可是写起来太晦涩难看了,看了下Qt的API,原来可以简化的。❞
常规使用:
QPushButton *button = new QPushButton();
connect(button, /* 信号者(对象) */
static_cast<void (QPushButton::*)(bool)>(&QPushButton::clicked), /* 信号 */
[](bool checked) { /* lambda表达式,可以看成槽函数 */
qDebug() << "1" << checked;
});
可以看出使用static_cast转换函数指针非常繁琐,我们不如使用qOverload试试看:
connect(button, /* 信号者(对象) */
qOverload<bool>(&QPushButton::clicked), /* 信号 */
[](bool checked) { /* lambda表达式,可以看成槽函数 */
qDebug() << "2" << checked;
});
可以看出使用qOverload更简洁。
qOverload返回指向(成员)函数的指针。
auto qOverload(T functionPointer)
qNonConstOverload与qOverload类似。区别在于它是「返回指向const(成员)函数指针」。
auto qNonConstOverload(T memberFunctionPointer)
例子:
struct Example {
void function_1(bool, const QString &);
void function_2(bool, const QString &) const;
};
qConstOverload<bool, const QString &>(&Example::function_1)
qNonConstOverload<bool, const QString &>(&Example::function_2)
注意:「qOverload和qNonConstOverload只能在Qt 5.7版本以上使用」。