2014-04-17 15 views
5

Io sto usando un QVariant per memorizzare un puntatore al mio oggetto in un QComboBoxCome recuperare i dati da QVariant per un utente?

void MainFrame::initContainerBox(QComboBox *oBox) 
{ 
    IDataContainer *idc = new CSVContainer(); 
    QVariant v(QVariant::UserType, idc); 

    oBox->addItem(idc->getContainername(), v); 
    void *idc1 = v.data(); 
    if(idc1 == idc) 
     printf("Test\n"); 
} 

ma come faccio a ottenere i dati indietro? Quando uso data() il puntatore è diverso, quindi questo non sembra essere corretto. Da gooogling ho avuto l'impressione che devo registrare un tipo per ogni classe che voglio usare in un QVariant è corretto o posso recuperare il valore senza?

+1

Utilizzare 'QVariant :: value()' –

+0

Sto usando anche 'value', ma non funziona. Puoi dare un esempio funzionante? – Devolus

+0

@Devolus: per curiosità, cosa non ha funzionato? Hai provato l'esempio [qui] (http://qt-project.org/doc/qt-5/qvariant.html#value)? – lpapp

risposta

6

Dopo due giorni di ricerca su google e provando tutti i tipi di combinazioni, ho finalmente scoperto come farlo. Ecco un esempio utilizzando uno QComboBox mettendo un oggetto e recuperandolo. IDataContainer * è una classe arbitraria che non è correlata a Qt.

Q_DECLARE_METATYPE(IDataContainer *) 

void MainFrame::initContainerBox(QComboBox *oBox) 
{ 
    IDataContainer *idc = new CSVContainer(); 
    QVariant v; 
    v.setValue(idc); 

    oBox->addItem(idc->getContainername(), v); 
    QVariant v2 = oBox->itemData(oBox->currentIndex()); 

    IDataContainer *idc1 = v2.value<IDataContainer *>(); 
    if(idc1 == idc) 
     printf("Test\n"); 
} 

Quindi, con il mio primo approccio di utilizzare value() ero sulla strada giusta, gli unici pezzi mancanti sono stati come impostare il valore e utilizzando la macro Q_DECLARE_METATYPE(IDataContainer *).

Apparentemente l'uso del costruttore non funziona, quindi è necessario chiamare setValue(). Se qualcuno sa come usare il costruttore, sarebbe bello mostrarlo.

+1

Prova 'QVariant v (QVariant :: fromValue (idc));'. Anche se non lo so, se è più carino :) –

+0

Grazie (+1) per condividere la risposta. Vorrei che più lo farebbe. Mi ha davvero aiutato. – Mawg

Problemi correlati