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

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

【问题讨论】:

    标签: qt private public qobject


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多