有没有办法将任何C ++函数用作Qt插槽,而不使其类继承自QWidget?
答案 0 :(得分:10)
你不能在Qt版本< Qt 5.
为了使用信号/槽,必须调用元对象编译器。为了实现这一目标,您的课程应满足以下要求:
QObject
或任何其他子类(例如QWidget
,QPushButton
等)Q_OBJECT
宏,以启用插槽等元对象功能Qt
关键字slots
和signals
来声明哪些函数应由元编译器处理为插槽或信号有关详细信息,请查看有关meta-object system和signals & 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)
继承QObject就足够了:http://qt-project.org/doc/qt-4.8/signalsandslots.html