Могу ли я создать подкласс QEvent?

Я попытался создать класс, который является подклассом QEvent, но после сборки получил ошибку.

Мои шаги,
1. Создайте проект, используя шаблон консоли Qt
2. Создайте следующий код

#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


Как мне это решить и почему? Спасибо.


person CCC    schedule 14.08.2013    source источник


Ответы (3)


Dcow дает правильный ответ.

Ваша ошибка в том, что QEvent не наследуется от QObject, а вы пытаетесь это сделать. Вы не должны использовать макросы Q_OBJECT, или вы также должны интерхитировать свой класс из QObject. Но это темная сторона.

person Dmitry Sazonov    schedule 14.08.2013
comment
Я был на 14 секунд быстрее :) - person Marek R; 14.08.2013
comment
Да :). Белорусский интернет такой медленный. - person Dmitry Sazonov; 14.08.2013
comment
Ладно, я понял. Я думал, что все классы из Qt — это из QObject, так что это вошло в привычку. - person CCC; 14.08.2013
comment
@iСпросите не все! Есть много классов, которые этого не делают! Смотрите контейнеры, строки, QModelIndex и многое другое. - person Dmitry Sazonov; 14.08.2013

Прежде всего ПОЧЕМУ? Вы должны написать, зачем вам это нужно, я уверен, что ваше решение проблемы, которое вы пытаетесь исправить, просто неверно!

Во-вторых проблема Q_OBJECT макрос. QEvent не является QObject, поэтому этот макрос неприменим, и поэтому возникает эта ошибка.

person Marek R    schedule 14.08.2013

Как уже отмечалось: Нет Q_OBJECT. Но позвольте мне кое-что добавить и обратить ваше внимание на редко используемый и малоизвестный макрос: Q_GADGET

Почти Q_OBJECT для не-QObjects.

Из документов Qt:

Используйте Q_GADGET вместо Q_OBJECT, чтобы включить поддержку перечислений в системе метаобъектов в классе, который не является подклассом QObject. Q_GADGET делает доступным член класса staticMetaObject. staticMetaObject имеет тип QMetaObject и обеспечивает доступ к перечислениям, объявленным с помощью Q_ENUMS. Q_GADGET предоставляется только для C++.

Пригодится время от времени.

person Greenflow    schedule 14.08.2013