2014-06-23 12 views
8

Sto sviluppando un'applicazione mobile BlackBerry 10 utilizzando l'IDE Momentics (SDK nativo).Come posso trasmettere un QVariant alla classe personalizzata?

Ho un listview che voglio gestire i suoi elementi fare clic con C++ (ho bisogno di usare C++ non QML).

È possibile ottenere il percorso dell'indice utilizzando l'istruzione "connect", ma ho problemi con l'analisi di un QVariant in una classe personalizzata;

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

QVariant selectItem = m_categoriesListDataModel->data(indexPath); 

Ho cercato di usare il cast statico come di seguito

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

ma restituisce:

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

Qualcuno mi può aiutare su questo?

+0

è possibile aggiungere codice per mostrare come si aggiungono i dati al modello? – Kunal

+7

Non utilizzare Q_ASSERT in questi casi! Q_ASSERT non funzionerà nella versione di rilascio e il segnale non sarà connesso. –

risposta

12

Si potrebbe provare a utilizzare qvariant_cast e qobject_cast.

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

Inoltre, non inserire mai dichiarazioni persistenti in Q_ASSERT. Non sarà usato quando l'assert non è abilitato.

+1

grazie per l'informazione. Riguardo a "Q_DECLARE_METATYPE", ho provato a inserirlo nella definizione di classe come questo [esempio] (http://blackberry.github.io/Qt2Cascades-Samples/docs/threads-queuedcustomtype-src-block-hpp.html) ma non funziona; restituisce "all'interno di questo contesto" (penso che questo sia dovuto al fatto che la classe è un QObject "classe Category: public QObject") e quando provo a metterlo ovunque fuori dalla definizione della classe restituisce "una dichiarazione modello non può apparire a livello di blocco ". –

+0

@ user2072762: aggiornata la risposta quindi. – lpapp

+0

funziona, grazie. Un sacco !! –

10

EDIT: Lavori per tipo derivato non QObject (vedi la risposta di Finale Concorso per questo caso)

Prima di tutto, è necessario registrarsi al vostro tipo di far parte di QVariant gestito tipi

//customtype.h 
class CustomType { 
}; 

Q_DECLARE_METATYPE(CustomType) 

Quindi è possibile recuperare il tipo personalizzato da QVariant in questo modo:

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

che è equi Valente a:

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

Grazie per il vostro aiuto. Ho provato a inserire l'istruzione "Q_DECLARE_METATYPE" come la descrivi ma restituisce un errore "in questo contesto", penso che il mio tipo personalizzato erediti dalla classe QOBject: "classe Category: public QObject" –

+0

@FinalContest ha ragione. La domanda non dice che hai trattato un tipo derivato da QObject. – jbh

+0

Il tuo commento mi ha aiutato molto, sento che la tua dovrebbe essere la risposta, e che gli ldapp dovrebbero essere una risposta a una domanda completamente diversa, dato che J.M.J non ha specificato che stavano derivando da QObject nel post originale – snb

Problemi correlati