【发布时间】:2012-04-12 21:37:13
【问题描述】:
有没有办法将任何 C++ 函数用作 Qt 插槽,而无需从 QWidget 继承其类?
【问题讨论】:
-
我不确定它是否重复,但这可能会有所帮助:stackoverflow.com/questions/8533906
标签: c++ qt signals-slots qwidget
有没有办法将任何 C++ 函数用作 Qt 插槽,而无需从 QWidget 继承其类?
【问题讨论】:
标签: c++ qt signals-slots qwidget
您不能在 Qt 版本
为了使用信号/槽,必须调用元对象编译器。为此,您的班级应满足以下要求:
QObject 或任何其他子类(例如QWidget、QPushButton 等)继承Q_OBJECT 宏应在类的私有部分中定义,以启用元对象功能,例如插槽Qt 关键字 slots 和 signals 以声明元编译器应将哪些函数作为槽或信号处理有关更多详细信息,请查看有关 meta-object system 和 signals & slots 的相应文档页面
同时查看QObject 文档:
请注意,
Q_OBJECT宏对于任何实现信号、槽或属性的对象都是必需的。您还需要运行 源文件上的元对象编译器。我们强烈推荐使用 这个宏在 QObject 的所有子类中,无论是否 不是他们实际使用信号、槽和属性,因为未能 这样做可能会导致某些函数表现出奇怪的行为。
编辑:从 Qt 5 开始,仿函数和 lambda 表达式可以用作槽。见New Signal Slot Syntax in Qt 5
【讨论】:
从 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
【讨论】:
在 Qt 5 中,您可以。见http://qt-project.org/wiki/New_Signal_Slot_Syntax
在 Qt 4 中,这不是直接支持的,但是有几个库通过隐藏 QObject 中的插槽代理信号来提供此功能,然后调用您的非插槽函数。我的尝试可以在 https://github.com/robertknight/qt-signal-tools 找到。自述文件底部有其他实现的链接。
【讨论】:
不太可能。 Qt-meta-object-compiler (moc) 包装函数,标记为slot-s,在相对较大的代码包装器中。 moc 创建的文件以 moc_ 开头,查看它们。
【讨论】:
【讨论】: