Russian Qt Forum
Ноябрь 25, 2024, 08:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает макрос Q_DECLARE_METATYPE  (Прочитано 6707 раз)
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 все было нормально. Это первый раз, когда я регистрировал класс.
Подскажите, если кто знает, в чем тут может быть дело?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 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.
Может, это?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Август 11, 2011, 15:01 »

Тип используешь MapItem*. Его и надо объявлять:
Код
C++ (Qt)
Q_DECLARE_METATYPE(MapItem*)
Записан

Qt 5.11/4.8.7 (X11/Win)
bibelwort
Гость
« Ответ #3 : Август 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). Компилятор вроде не ругается больше. Спасибо! Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.284 секунд. Запросов: 22.