如果我只使用插槽,是不是需要使用 Q_OBJECT 宏?

Posted

技术标签:

【中文标题】如果我只使用插槽,是不是需要使用 Q_OBJECT 宏?【英文标题】:Do I need to use the Q_OBJECT macro if I only use slots?如果我只使用插槽,是否需要使用 Q_OBJECT 宏? 【发布时间】:2020-05-25 19:58:14 【问题描述】:

我有几个使用 QWebSocket 的类,似乎我可以调用 connect 来处理连接、关闭等的回调。我的调试器说一切正常。

如果我在我的类中使用 Q_OBJECT 宏,那么我必须在我的 cmake 中运行 MOC 编译器,当我试图从我的类中创建一个 lib 并在另一个应用程序中使用它时,这是一件很痛苦的事情,那将单独发一篇关于。

如果我删除 Q_OBJECT 宏,没有它,一切似乎都可以构建和运行。所以,问题是,如果我只是将 QWebSocket 的信号连接到插槽,我真的需要它吗?

一个相关的帖子是: Using Qt macro Q_OBJECT for slots 但是,这是为了解决由于不使用 MOC 编译器而导致的错误。我知道该怎么做,但我怀疑我是否首先需要 Q_OBJECT。

【问题讨论】:

如果您在课堂上使用信号/插槽,则需要使用 Q_OBJECT。我加倍它确实可以在没有宏的情况下工作,除非你不使用信号连接。 【参考方案1】:

来自 Qt QObject class reference:

请注意,对于任何实现信号、槽或属性的对象,Q_OBJECT 宏都是必需的。

【讨论】:

那为什么在使用插槽时没有它可以工作,但没有信号呢?此外,为什么我可以使用 lambda 作为 Qt5 中的连接插槽?似乎有一些争论forum.qt.io/topic/115188/… 随意进入“未定义/不受支持”的世界!我不维护你的代码:)

以上是关于如果我只使用插槽,是不是需要使用 Q_OBJECT 宏?的主要内容,如果未能解决你的问题,请参考以下文章

qobject_cast没有Q_OBJECT宏错误

使用 static_assert 检查 Q_OBJECT 宏

如果在具有 Q_OBJECT 宏的类之外,则无法在 Qt Linguist 中获取字符串

PayPal Webhook:如果我只使用计费协议,是不是需要发票、付款销售、授权和捕获 Webhook

vue2.0 插槽不是响应性的

vue2.0 插槽不是响应性的