2014-06-23 12 views
8

Zajmuję się tworzeniem aplikacji mobilnej BlackBerry 10 za pomocą IDE Momentics (natywny pakiet SDK).Jak mogę rzucić QVariant do niestandardowej klasy?

Mam listview, który chcę obsłużyć jego elementów kliknij z C++ (muszę użyć C++ nie QML).

Mogę uzyskać ścieżkę indeksu za pomocą instrukcji "połącz", ale mam problem z analizą QVariant dla niestandardowej klasy;

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

QVariant selectItem = m_categoriesListDataModel->data(indexPath); 

Próbowałem użyć statycznej obsady jak poniżej

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

ale zwraca:

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

Czy ktoś może mi pomóc w tej sprawie?

+0

Czy możesz dodać kod, aby pokazać, jak dodać dane do modelu? – Kunal

+7

Nie należy używać Q_ASSERT w takich przypadkach! Q_ASSERT nie będzie działać w wersji release, a sygnał nie będzie podłączony. –

Odpowiedz

12

Możesz spróbować użyć qvariant_cast i qobject_cast.

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

Ponadto, nigdy nie umieszczaj żadnych trwałych instrukcji w Q_ASSERT. Nie będzie używane, gdy assert nie jest włączony.

+1

dzięki za informacje. O "Q_DECLARE_METATYPE", próbowałem umieścić go w definicji klasy w ten sposób [przykład] (http://blackberry.github.io/Qt2Cascades-Samples/docs/threads-queuedcustomtype-src-block-hpp.html), ale nie działa; zwraca "w tym kontekście" (myślę, że dzieje się tak dlatego, że klasa jest klasą QObject "class Category: public QObject") i gdy próbuję umieścić ją w dowolnym miejscu poza definicją klasy, zwraca "deklaracja szablonu nie może pojawić się w zakresie bloku ". –

+0

@ user2072762: zaktualizowano wtedy odpowiedź. – lpapp

+0

to działa, thx. dużo !! –

10

EDIT: pracuje non QObject typu pochodnego (patrz odpowiedź końcowy konkursu dla tego przypadku)

Przede wszystkim, trzeba zarejestrować się do danego typu, aby być częścią QVariant udało Rodzaje

//customtype.h 
class CustomType { 
}; 

Q_DECLARE_METATYPE(CustomType) 

Następnie można odzyskać swój typ niestandardowy z QVariant w ten sposób:

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

który jest equi valent do:

CustomType ct = qvariant_cast<CustomType>(myVariant); 
+0

Dziękuję za pomoc. Próbowałem umieścić instrukcję "Q_DECLARE_METATYPE" tak jak opisujesz, ale zwraca błąd "w tym kontekście", myślę, że to dlatego, że mój niestandardowy typ dziedziczy z klasy QOBject: "class Category: public QObject" –

+0

@FinalContest ma rację. Pytanie nie wspomina o tym, że traktujesz typ pochodny QObject. – jbh

+0

Twój komentarz pomógł mi bardzo, czuję, że twoja powinna być odpowiedzią, a te ldappy powinny być odpowiedzią na zupełnie inne pytanie, ponieważ J.M.J nie sprecyzował, że pochodzą one z QObject w oryginalnym wpisie – snb

Powiązane problemy