有没有一种方法可以使用任何C++函数作为Qt插槽,而不需要从QWidget继承它的类?使用任何C++函数作为Qt插槽
回答
你不能在Qt的版本Qt的< 5.
为了使用信号/插槽元对象编译器被调用。要做到这一点你的类应符合下列要求:
- 从
QObject
继承或任何其他子类(如QWidget
,QPushButton
等) - 的
Q_OBJECT
宏应该在类的私有部分的顺序定义使元对象的功能,如槽 - 使用
Qt
关键字slots
和signals
,以宣布它的功能应该是由元编译器狭槽或信号
详情检查关于和signals & slots
相应的文档页面同时检查QObject
文档:
注意,
Q_OBJECT
宏是强制性的,它实现信号,槽或任何对象属性。您还需要在源文件上运行 元对象编译器。我们强烈建议在QObject的所有子类中使用此宏的 ,而不管它们是否实际上使用信号,槽和属性,因为 的失败可能导致某些函数表现出奇怪的行为。
编辑:由于Qt 5,函子和lambda表达式可以用作插槽。请参阅New Signal Slot Syntax in Qt 5
然而,重要的是,尽管在Qt 4中这是不可能的,在Qt 5中可能,使用新的信号/插槽机制。 http://qt-project.org/wiki/New_Signal_Slot_Syntax – leinir 2012-03-29 10:56:44
你是对的,但恕我直言,它应该只在极少数情况下使用。使用插槽比使用简单函数的tr1 :: bind更优雅。 – pnezis 2012-03-29 11:04:33
我绝对同意,他们应该是一个罕见的发生。非常类似于简短的陈述,它们在非常狭窄的情况下很有用,并且在这些情况下增加了可读性和易于维护。但是,他们应该只用于那里,而不是一般的规则。 – leinir 2012-07-18 17:23:56
不太可能。 Qt-meta-object-compiler(moc)封装了这个函数,被标记为slot -s,在相对较大的代码包装中。文件,由moc创建,从moc_开始,请看它们。
这足以继承QObject的:http://qt-project.org/doc/qt-4.8/signalsandslots.html
在Qt 5中,您可以。请参阅http://qt-project.org/wiki/New_Signal_Slot_Syntax
在Qt 4中,这不是直接支持的,但有几个库通过在隐藏的QObject中通过插槽代理信号来提供此功能,然后调用您的非插槽功能。我的尝试可以在https://github.com/robertknight/qt-signal-tools找到。自述文件底部有其他实现的链接。
由于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
- 1. Qt插槽是如何工作的。 PySide
- 2. QT信号/插槽
- 3. qt插槽柯里
- 4. Qt转发插槽/连接插槽到插槽?
- 5. 在Qt插槽中使用枚举
- 6. C++ Qt设置信号和插槽QMenu
- 7. Qt插槽,没有匹配的调用函数
- 8. QT信号插槽不工作
- 9. QT连接插槽/信号不工作
- 10. libsigC++和函数作为信号连接到另一个函数作为插槽
- 11. 没有插槽,但QMetaObject :: connectSlotsByName错误使用Qt和C++
- 12. 使用Qt信号/插槽而不是工作线程
- 13. Qt连接信号插槽
- 14. 寄过来的Qt插槽
- 15. QT信号和插槽
- 16. Qt不找QStackedWidgets'插槽setCurrentWidget
- 17. 信号和插槽QT
- 18. Qt信号插槽:信号已发送,但未插入插槽
- 19. 通过网络运行Qt信号/插槽的任何想法?
- 20. 为什么我的插槽没有在qt C++中找到?
- 21. Qt如何实现信号和插槽?
- 22. Qt插槽功能未被调用
- 23. 是否使用C++ Lambda函数作为Qt中的槽帮助保存库的二进制兼容性?
- 24. Qt - 使用lambda参数连接槽
- 25. boost :: signals2插槽作为非静态函数成员?
- 26. Qt插槽和信号。获取插槽接收器对象
- 27. 如何在QT的另一个插槽中使用变量
- 28. Qt:如何正确使用QSound的播放插槽?
- 29. 如何使用线程Qt网络中的信号和插槽?
- 30. 如何使用BigQuery插槽
我不确定它是否是重复的,但这可能有所帮助:http://stackoverflow.com/questions/8533906/ – 2012-03-29 09:12:23