2014-06-23 11 views
8

Ich entwickle eine BlackBerry 10 Mobile-Anwendung mit der Momentics IDE (natives SDK).Wie kann ich QVariant in eine benutzerdefinierte Klasse umwandeln?

Ich habe eine Listview, die ich ihre Elemente behandeln möchte klicken Sie auf C++ (ich brauche C++ nicht QML).

Ich kann den Indexpfad mit der Anweisung "connect" abrufen, aber ich habe Probleme mit dem Parsen eines QVariant zu einer benutzerdefinierten Klasse;

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

QVariant selectItem = m_categoriesListDataModel->data(indexPath); 

Ich hat versucht, den statischen Guss wie unter

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

zu verwenden, aber es gibt:

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

jemand mir auf diesem helfen?

+0

können Sie Code hinzufügen, um anzuzeigen, wie Sie Daten zum Modell hinzufügen? – Kunal

+7

Verwenden Sie in solchen Fällen nicht Q_ASSERT! Q_ASSERT wird in Release Build nicht funktionieren und das Signal wird nicht verbunden. –

Antwort

12

Sie könnten versuchen mit qvariant_cast und qobject_cast.

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

Setzen Sie auch keine persistente Anweisung in Q_ASSERT. Es wird nicht verwendet, wenn die Bestätigung nicht aktiviert ist.

+1

danke für die Information. Über "Q_DECLARE_METATYPE" habe ich versucht, es in die Klassendefinition wie dieses [Beispiel] (http://blackberry.github.io/Qt2Cascades-Samples/docs/threads-queuedcustomtype-src-block-hpp.html) zu schreiben funktioniert nicht; Es gibt "innerhalb dieses Kontexts" zurück (ich denke, das liegt daran, dass die Klasse ein QObject ist "class Category: public QObject") und wenn ich versuche, sie irgendwo außerhalb der Klassendefinition zu setzen, die eine Template-Deklaration nicht im Blockbereich erscheinen lässt ". –

+0

@ user2072762: aktualisiert die Antwort dann. – lpapp

+0

es funktioniert, thx. viel !! –

10

EDIT: funktioniert für nicht QObject abgeleiteten Typen (siehe Endausscheidung Antwort für diesen Fall)

Zunächst einmal müssen Sie Ihre Art registrieren Teil QVariant seinen Typ

verwaltet
//customtype.h 
class CustomType { 
}; 

Q_DECLARE_METATYPE(CustomType) 

Dann können Sie Ihre benutzerdefinierten Typ von QVariant auf diese Weise abrufen:

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

das ist equi valent to:

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

Vielen Dank für Ihre Hilfe. Ich habe versucht, die "Q_DECLARE_METATYPE" -Anweisung wie beschrieben zu setzen, aber es gibt einen Fehler "in diesem Kontext" zurück, weil mein eigener Typ von der QOBject-Klasse erbt: "class Category: public QObject" –

+0

@FinalContest hat Recht. Frage erwähnt nicht, dass Sie einen von QObject abgeleiteten Typ behandelten. – jbh

+0

Ihr Kommentar hat mir sehr geholfen, ich denke, dass Ihr die Antwort sein sollte, und dass ldapps eine Antwort auf eine ganz andere Frage sein sollte, da J.M.J nicht angegeben hat, dass sie von QObject im ursprünglichen Beitrag abgeleitet wurden – snb