❝最近使用Qt5风格的信号槽,可是写起来太晦涩难看了,看了下Qt的API,原来可以简化的。❞
以连接QPushButton点击事件信号槽为例
常规使用:
代码语言:javascript复制QPushButton *button = new QPushButton();
connect(button, /* 信号者(对象) */
static_cast<void (QPushButton::*)(bool)>(&QPushButton::clicked), /* 信号 */
[](bool checked) { /* lambda表达式,可以看成槽函数 */
qDebug() << "1" << checked;
});
可以看出使用static_cast转换函数指针非常繁琐,我们不如使用qOverload试试看:
代码语言:javascript复制connect(button, /* 信号者(对象) */
qOverload<bool>(&QPushButton::clicked), /* 信号 */
[](bool checked) { /* lambda表达式,可以看成槽函数 */
qDebug() << "2" << checked;
});
可以看出使用qOverload更简洁。
qOverload与qNonConstOverload
qOverload返回指向(成员)函数的指针。
代码语言:javascript复制auto qOverload(T functionPointer)
- 「模板参数是函数的参数类型列表」。
- 「functionPointer是指向(成员)函数的指针」。
qNonConstOverload与qOverload类似。区别在于它是「返回指向const(成员)函数指针」。
代码语言:javascript复制auto qNonConstOverload(T memberFunctionPointer)
例子:
代码语言:javascript复制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版本以上使用」。