2012-03-29 52 views
11

有没有一种方法可以使用任何C++函数作为Qt插槽,而不需要从QWidget继承它的类?使用任何C++函数作为Qt插槽

+0

我不确定它是否是重复的,但这可能有所帮助:http://stackoverflow.com/questions/8533906/ – 2012-03-29 09:12:23

回答

8

你不能在Qt的版本Qt的< 5.

为了使用信号/插槽元对象编译器被调用。要做到这一点你的类应符合下列要求:

  • QObject继承或任何其他子类(如QWidgetQPushButton等)
  • Q_OBJECT宏应该在类的私有部分的顺序定义使元对象的功能,如槽
  • 使用Qt关键字slotssignals,以宣布它的功能应该是由元编译器狭槽或信号
手柄

详情检查关于和signals & slots

相应的文档页面同时检查QObject文档:

注意,Q_OBJECT宏是强制性的,它实现信号,槽或任何对象属性。您还需要在源文件上运行 元对象编译器。我们强烈建议在QObject的所有子类中使用此宏的 ,而不管它们是否实际上使用信号,槽和属性,因为 的失败可能导致某些函数表现出奇怪的行为。

编辑:由于Qt 5,函子和lambda表达式可以用作插槽。请参阅New Signal Slot Syntax in Qt 5

+1

然而,重要的是,尽管在Qt 4中这是不可能的,在Qt 5中可能,使用新的信号/插槽机制。 http://qt-project.org/wiki/New_Signal_Slot_Syntax – leinir 2012-03-29 10:56:44

+0

你是对的,但恕我直言,它应该只在极少数情况下使用。使用插槽比使用简单函数的tr1 :: bind更优雅。 – pnezis 2012-03-29 11:04:33

+0

我绝对同意,他们应该是一个罕见的发生。非常类似于简短的陈述,它们在非常狭窄的情况下很有用,并且在这些情况下增加了可读性和易于维护。但是,他们应该只用于那里,而不是一般的规则。 – leinir 2012-07-18 17:23:56

0

不太可能。 Qt-meta-object-compiler(moc)封装了这个函数,被标记为slot -s,在相对较大的代码包装中。文件,由moc创建,从moc_开始,请看它们。

8

由于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::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1); 
升压::绑定

的更多信息可在发现文档:http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html