Как включить QVariant в пользовательский класс?

Я разрабатываю мобильное приложение BlackBerry 10 с помощью Momentics IDE (собственный SDK).

У меня есть listview, который я хочу обрабатывать своими элементами, щелкая на С++ (мне нужно использовать С++, а не QML).

Я могу получить указательный путь с помощью команды "connect", но у меня проблема с разбором QVariant в пользовательский класс;

Q_ASSERT(QObject::connect(list1, SIGNAL(triggered(QVariantList)), this, SLOT(openSheet(QVariantList))));

QVariant selectItem = m_categoriesListDataModel->data(indexPath);

Я попытался использовать статический приведение, как показано ниже

Category* custType = static_cast<Category*>(selectItem);

но он возвращает:

"invalid static_cast from type 'QVariant' to type 'Category*'"

Может ли кто-нибудь помочь мне в этом?

Ответ 1

Вы можете попробовать использовать qvariant_cast и qobject_cast.

QObject *object = qvariant_cast<QObject*>(selectItem);
Category *category = qobject_cast<Category*>(object);

Кроме того, никогда не помещайте постоянный оператор в Q_ASSERT. Он не будет использоваться, если assert не включен.

Ответ 2

ОБНОВЛЕНИЕ: работает для производного типа, отличного от QObject (см. ответ на финальный конкурс для этого случая)

Прежде всего, вам нужно зарегистрировать свой тип, чтобы быть частью управляемых типов QVariant

//customtype.h
class CustomType {
};

Q_DECLARE_METATYPE(CustomType)

Затем вы можете получить свой собственный тип из QVariant следующим образом:

CustomType ct = myVariant.value<CustomType>();

что эквивалентно:

CustomType ct = qvariant_cast<CustomType>(myVariant);