【发布时间】:2014-04-10 07:24:44
【问题描述】:
为什么我们通常只在私有部分给出 Q_OBJECT?
我尝试了一个示例程序,在公共部分给出它,我发现没有区别。
如果有人知道,你能告诉我原因。
【问题讨论】:
为什么我们通常只在私有部分给出 Q_OBJECT?
我尝试了一个示例程序,在公共部分给出它,我发现没有区别。
如果有人知道,你能告诉我原因。
【问题讨论】:
默认情况下,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,您可能会产生有趣的后果,即之后的事情不再公开:)
【讨论】:
如果你把 Q_OBJECT 放在公共标识符下,你所有的公共声明都会变成私有的。例如:
class Dialog : public QDialog
{
public:
Q_OBJECT
Dialog(QWidget *parent = 0); // <- now declared as private
【讨论】: