为什么我们只在私人部分提供Q_OBJECT?

时间:2014-04-10 07:24:44

标签: qt private public qobject

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

2 个答案:

答案 0 :(得分:5)

默认情况下,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以确保没有任何内容被破坏。因此,如果您在Q_OBJECT部分声明public,则可能会产生一个有趣的后果,即之后的事情不再公开了:)

答案 1 :(得分:2)

如果您将Q_OBJECT置于公共标识符下,则所有公开声明都将变为私有。例如:

class Dialog : public QDialog
{    
public:
    Q_OBJECT

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