【问题标题】:Using any c++ function as a Qt slot使用任何 c++ 函数作为 Qt 插槽
【发布时间】:2012-04-12 21:37:13
【问题描述】:

有没有办法将任何 C++ 函数用作 Qt 插槽,而无需从 QWidget 继承其类?

【问题讨论】:

标签: c++ qt signals-slots qwidget


【解决方案1】:

您不能在 Qt 版本

为了使用信号/槽,必须调用元对象编译器。为此,您的班级应满足以下要求:

  • QObject 或任何其他子类(例如QWidgetQPushButton 等)继承
  • Q_OBJECT 宏应在类的私有部分中定义,以启用元对象功能,例如插槽
  • 使用 Qt 关键字 slotssignals 以声明元编译器应将哪些函数作为槽或信号处理

有关更多详细信息,请查看有关 meta-object systemsignals & slots 的相应文档页面

同时查看QObject 文档:

请注意,Q_OBJECT 宏对于任何实现信号、槽或属性的对象都是必需的。您还需要运行 源文件上的元对象编译器。我们强烈推荐使用 这个宏在 QObject 的所有子类中,无论是否 不是他们实际使用信号、槽和属性,因为未能 这样做可能会导致某些函数表现出奇怪的行为。

编辑:从 Qt 5 开始,仿函数和 lambda 表达式可以用作槽。见New Signal Slot Syntax in Qt 5

【讨论】:

  • 然而,重要的是,虽然这在 Qt 4 中是不可能的,但在 Qt 5 中,使用新的信号/槽机制将成为可能。 qt-project.org/wiki/New_Signal_Slot_Syntax
  • 你是对的,但恕我直言,它应该只在极少数情况下使用。使用槽比使用带有简单函数的 tr1::bind 更优雅。
  • 我完全同意,它们应该是一种罕见的情况。很像简短的 cirquit if 语句,它们在非常有限的情况下很有用,并且在这些情况下增加了可读性和易于维护。但是,它们应该只在那时使用,而不是作为一般规则。
【解决方案2】:

从 Qt 5 开始,函子和 lambda 表达式可以用作槽(如前所述,此处:http://qt-project.org/wiki/New_Signal_Slot_Syntax)。

由于找不到示例代码,我添加了以下内容:

此示例将boost::function 用于不带参数的类成员ClassName::classMember()

    boost::function<void()> f= boost::bind(&ClassName::classMember, classInstance);
    connect(QObjectInstance, &QObject::signalName, f);

当Qt信号和类成员有参数时(例如ClassName::classMember(int)),boost函数应作如下适配:

    boost::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1);

关于 boost::bind 的更多信息可以在文档中找到:http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html

【讨论】:

    【解决方案3】:

    在 Qt 5 中,您可以。见http://qt-project.org/wiki/New_Signal_Slot_Syntax

    在 Qt 4 中,这不是直接支持的,但是有几个库通过隐藏 QObject 中的插槽代理信号来提供此功能,然后调用您的非插槽函数。我的尝试可以在 https://github.com/robertknight/qt-signal-tools 找到。自述文件底部有其他实现的链接。

    【讨论】:

      【解决方案4】:

      不太可能。 Qt-meta-object-compiler (moc) 包装函数,标记为slot-s,在相对较大的代码包装器中。 moc 创建的文件以 moc_ 开头,查看它们。

      【讨论】:

        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-09
          • 1970-01-01
          • 2015-01-12
          • 1970-01-01
          • 2013-11-12
          • 1970-01-01
          相关资源
          最近更新 更多