Russian Qt Forum

Qt => Общие вопросы => Тема начата: bibelwort от Август 11, 2011, 14:57



Название: Не работает макрос Q_DECLARE_METATYPE
Отправлено: bibelwort от Август 11, 2011, 14:57
Здравствуйте!

У меня возникла проблема с регистрацией типа для использования с QVariant.
А именно мне необходимо зарегистрировать следующий класс:

Код:
class MYLIBSHARED_EXPORT MapItem
{
public:
    enum Type {Root, Tab, Main, Depended};

    MapItem(Type type = Root, MapItem* parent = 0);
    ~MapItem();

    Type type;
    MapItem* parent;
    QList<MapItem*> children;

    QVariant data;
};

Сразу после определения класса, я регистрирую класс с помощью Q_DECLARE_METATYPE:

Код:
Q_DECLARE_METATYPE(MapItem)

При сборке компилятор сообщает следующее:

Код:
...\qmetatype.h:-1: In static member function 'static int QMetaTypeId2<T>::qt_metatype_id() [with T = MapItem*]':
...\qmetatype.h:169: ошибка: 'qt_metatype_id' is not a member of 'QMetaTypeId<MapItem*>'
...\qmetatype.h:169: предупреждение: control reaches end of non-void function

Раньше, когда я регистрировал типы типа struct все было нормально. Это первый раз, когда я регистрировал класс.
Подскажите, если кто знает, в чем тут может быть дело?


Название: Re: Не работает макрос Q_DECLARE_METATYPE
Отправлено: Пантер от Август 11, 2011, 15:00
This macro makes the type Type known to QMetaType as long as it provides a public default constructor, a public copy constructor and a public destructor. It is needed to use the type Type as a custom type in QVariant.
Может, это?


Название: Re: Не работает макрос Q_DECLARE_METATYPE
Отправлено: GreatSnake от Август 11, 2011, 15:01
Тип используешь MapItem*. Его и надо объявлять:
Код
C++ (Qt)
Q_DECLARE_METATYPE(MapItem*)


Название: Re: Не работает макрос Q_DECLARE_METATYPE
Отправлено: bibelwort от Август 11, 2011, 15:15
Тип используешь MapItem*. Его и надо объявлять:
Код
C++ (Qt)
Q_DECLARE_METATYPE(MapItem*)

Если писать:
Код:
Q_DECLARE_METATYPE(MapItem*)

то компилятор возвращает все с точностью до наоборот:
Код:
...\qmetatype.h:-1: In static member function 'static int QMetaTypeId2<T>::qt_metatype_id() [with T = MapItem]':
...\qmetatype.h:169: ошибка: 'qt_metatype_id' is not a member of 'QMetaTypeId<MapItem>'
...\qmetatype.h:169: предупреждение: control reaches end of non-void function

Поэтому я написал и Q_DECLARE_METATYPE(MapItem*) и Q_DECLARE_METATYPE(MapItem). Компилятор вроде не ругается больше. Спасибо! :)