1

I tried to make a class which is a subclass of QEvent, but I got error after building.

My steps,
1. Create a project using Qt console template
2. create the following code

#ifndef MYEVENT_H
#define MYEVENT_H

#include <QEvent>
#include <QObject>

class MyEvent : public QEvent
{
    Q_OBJECT
public:
    explicit MyEvent();

signals:

public slots:
};

#endif

//CPP File
MyEvent::MyEvent() :
    QEvent(QEvent::User)
{
}

moc_MyEvent.cpp:70:21: error: invalid use of non-static data member 'd_ptr'
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
           ~~~~~~~~~^~~~~
moc_MyEvent.cpp:70:21: error: 'd_ptr' is a protected member of 'QObject'
../../../../../../Qt5.1.0/5.1.0/clang_64/include/QtCore/qobject.h:411:33: note: declared protected here
    QScopedPointer<QObjectData> d_ptr;
                            ^

Qt5
Mac OSX 10.8.4


How do I solve it and why? Thanks.

4

3 回答 3

4

Dcow 给出了正确的答案。

您的错误是QEvent不继承自QObject,并且您尝试这样做。你不应该使用Q_OBJECT宏,或者你也应该从中插入你的类QObject。但这是黑暗的一面。

于 2013-08-14T09:13:11.533 回答
2

首先为什么?你应该写下你为什么需要这个,我确信你试图解决的问题解决方案是错误的!

第二个问题是Q_OBJECT宏观的。QEvent不是所以这个宏QObject适用,这就是你有这个错误的原因。

于 2013-08-14T09:12:46.973 回答
2

正如已经指出的那样:不Q_OBJECT。但是让我添加一些内容,并将您的注意力指向一个很少使用且广为人知的宏:Q_GADGET

几乎Q_OBJECT为非QObjects。_

来自 Qt 文档:

使用 Q_GADGET 而不是 Q_OBJECT 来启用元对象系统对非 QObject 子类的类中的枚举的支持。Q_GADGET 使类成员 staticMetaObject 可用。staticMetaObject 是 QMetaObject 类型,并提供对使用 Q_ENUMS 声明的枚举的访问。Q_GADGET 仅用于 C++。

时不时派上用场。

于 2013-08-14T09:33:54.733 回答