【问题标题】:How to declare functor parameter in Qt connect?如何在 Qt 连接中声明函子参数?
【发布时间】:2019-06-20 22:16:39
【问题描述】:

Qt 可以通过使用函子参数as shown here 在信号槽连接中使用 lambda 函数。但是如何在 Qt connect 中声明函子参数呢?例如,

QAction* CreateAction(QString text, QObject* parent, Functor functor)
{
    QAction* action = new QAction(icon, text, parent);
    QObject::connect(action, &QAction::triggered, functor);
    return action;
}

问题是如何包含文件以让编译器知道“Functor”类型。

【问题讨论】:

  • 你的 Functor 类型声明在哪里?
  • Qt 声明了 Functor 类型,如其文档所示。但我找不到它的声明位置。

标签: qt


【解决方案1】:

Functor 不是真正的类型。它是 Qt 文档的占位符。真实类型是模板类型参数。如果您真的感兴趣,请查看QObject.h。在实践中,您可以使用在<functional> 中定义的std::function 来代替它。

对于问题中的函数,最简单的改动就是让它成为一个模板函数:

template<Functor>
QAction* CreateAction(QString text, QObject* parent, Functor&& functor)
{
    QAction* action = new QAction(icon, text, parent);
    QObject::connect(action, &QAction::triggered, std::forward<Functor>(functor));
    return action;
}

【讨论】:

  • @TobySpeight 这是一个针对 Stephens 的 sn-p 答案,因此以 std::function 为例。无论哪种方式,现在都有代码;-)
【解决方案2】:

http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#connect-5

仿函数只是一个void * 或一个空指针。它可能需要是静态的。这似乎类似于常规的回调函数。

这是文档中的一个示例:

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, someFunction);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多