Qt - Q_OBJECT 与 #include <QObject>

Posted

技术标签:

【中文标题】Qt - Q_OBJECT 与 #include <QObject>【英文标题】:Qt - Q_OBJECT vs. #include <QObject> 【发布时间】:2011-04-14 09:48:51 【问题描述】:

使用Q_Object 宏和#include &lt;QObject&gt; 效果一样吗?换句话说,它们是出于相同目的的两种不同方式吗?

谢谢。

【问题讨论】:

【参考方案1】:

没有。您需要 Q_OBJECT 在您想要信号/插槽的类定义中,除了包含正确的标题。

来自QObject api docs:

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

请查看 Qt 文档中的各种示例以获取更多详细信息和示例代码。 Signals and Slots 参考是一个很好的地方。另请查看Object Model 参考。

【讨论】:

感谢您的回复。如果可能的话,你能更详细地解释一下吗? You need Q_OBJECT in the class definition of things you want signals/slots on?谢谢 请阅读 Mat 链接的 Q_Object 的文档。该文档中甚至还列出了一个示例类,它显示了如何使用 Q_OBJECT 宏。【参考方案2】:

它们用于两种不同的目的。

Q_OBJECT:

Q_OBJECT 宏必须出现在声明自己的信号和槽或使用 Qt 元对象系统提供的其他服务的类定义的私有部分中。

如果你想使用信号、槽和其他元对象特性,你需要有Q_OBJECT宏。

#include&lt;QObject&gt;:

这用于包含 qobject.h 头文件,以便您可以使用 QObject.. 类中可用的功能。例如,QObject::connect()

要使用Q_OBJECT 宏,您必须使用#include &lt;QObject&gt;

【讨论】:

【参考方案3】:

没有。将此宏添加到派生自QObject 的类中。但是你仍然需要 Mat 所说的标题!见http://doc.qt.io/qt-5/qobject.html#Q_OBJECT

【讨论】:

以上是关于Qt - Q_OBJECT 与 #include <QObject>的主要内容,如果未能解决你的问题,请参考以下文章

QT中的Q_OBJECT(未定义对vtable xxx的引用)[重复]

Qt类声明中Q_OBJECT的作用与报错解决

为什么cmake没有调整我的Q_OBJECT标头?

Qt:meta.enumeratorCount() 没有元数据用于 Q_OBJECT 中的枚举,为啥?

Qt,来自子类的“没有这样的信号”运行时错误,具有 Q_OBJECT 宏

Qt C++ Q_OBJECT 错误未定义对 vtable 的引用