Могу ли я создать подкласс 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
Как мне это решить и почему? Благодарю.
3 ответа
Dcow дает ответ Corrent.
Ваша ошибка в том, что QEvent
не наследуется от QObject
и ты пытаешься это сделать. Вы не должны использовать Q_OBJECT
макросы или вы должны прервать свой класс из QObject
тоже. Но это темная сторона.
Как уже указывалось: нет Q_OBJECT
, Но позвольте мне добавить кое-что и обратить ваше внимание на редко используемый и широко неизвестный макрос: Q_GADGET
Почти Q_OBJECT
для неQObjects
,
Из Qt Docs:
Используйте Q_GADGET вместо Q_OBJECT, чтобы включить поддержку мета-объектной системы для перечислений в классе, который не является подклассом QObject. Q_GADGET делает доступным член класса staticMetaObject. staticMetaObject имеет тип QMetaObject и предоставляет доступ к перечислениям, объявленным с помощью Q_ENUMS. Q_GADGET предоставляется только для C++.
Время от времени пригодится.
Прежде всего, ПОЧЕМУ? Вы должны написать, зачем вам это нужно, я уверен, что решение вашей проблемы, которое вы пытаетесь исправить, просто неверно!
Во-вторых проблема Q_OBJECT
макро. QEvent
это не QObject
поэтому этот макрос не применим, и именно поэтому у вас есть эта ошибка.