qOverload与qNonConstOverload

2020-04-15 12:37:11 浏览数 (1)

❝最近使用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)
  1. 「模板参数是函数的参数类型列表」
  2. 「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版本以上使用」

0 人点赞