使用任何c ++函数作为Qt插槽

时间:2012-03-29 08:50:09

标签: c++ qt signals-slots qwidget

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

5 个答案:

答案 0 :(得分:10)

你不能在Qt版本< Qt 5.

为了使用信号/槽,必须调用元对象编译器。为了实现这一目标,您的课程应满足以下要求:

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

有关详细信息,请查看有关meta-object systemsignals & slots

的相应文档页面

另请查看QObject文档:

  

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

编辑:从Qt 5开始,functor和lambda表达式可以用作插槽。请参阅New Signal Slot Syntax in Qt 5

答案 1 :(得分:8)

从Qt 5开始,functor和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

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)