为啥我们只在私人部分给出 Q_OBJECT?

Posted

技术标签:

【中文标题】为啥我们只在私人部分给出 Q_OBJECT?【英文标题】:Why we are giving Q_OBJECT in private section only?为什么我们只在私人部分给出 Q_OBJECT? 【发布时间】:2014-04-10 07:24:44 【问题描述】:

为什么我们通常只在私有部分给出 Q_OBJECT?我尝试了一个示例程序,在公共部分给出它,我发现没有区别。如果有人知道,你能告诉我原因。

【问题讨论】:

【参考方案1】:

默认情况下,Q_OBJECT 宏扩展为:

#define Q_OBJECT \
public: \
    Q_OBJECT_CHECK \
    static const QMetaObject staticMetaObject; \
    Q_OBJECT_GETSTATICMETAOBJECT \
    virtual const QMetaObject *metaObject() const; \
    virtual void *qt_metacast(const char *); \
    QT_TR_FUNCTIONS \
    virtual int qt_metacall(QMetaObject::Call, int, void **); \
private: \
    Q_DECL_HIDDEN static const QMetaObjectExtraData staticMetaObjectExtraData; \
    Q_DECL_HIDDEN static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);

至少在我的 Qt 4.8 上,因此您可以看到它切换到 public 可见性级别以声明所需的功能,然后返回到 private 以确保没有任何损坏。因此,如果您在 public 部分声明您的 Q_OBJECT,您可能会产生有趣的后果,即之后的事情不再公开:)

【讨论】:

这意味着如果我们在公共部分给出任何事情都不会发生。 我其实已经编辑了我的答案,如果你在公共部分声明它会在之后切换到私有 哇,太棒了..HatsUp to C++【参考方案2】:

如果你把 Q_OBJECT 放在公共标识符下,你所有的公共声明都会变成私有的。例如:

class Dialog : public QDialog
    
public:
    Q_OBJECT

    Dialog(QWidget *parent = 0); // <- now declared as private

【讨论】:

以上是关于为啥我们只在私人部分给出 Q_OBJECT?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 margin-top 会将整个部分向下移动? [复制]

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

私人通讯录

我将“朋友班 xxxxx”放在公共部分还是私人部分有区别吗?

我将“朋友班 xxxxx”放在公共部分还是私人部分有区别吗?

Gatsby + contentful + Netlify 的私人/登录部分