2009-11-12 4 views
13

Ho creato una classe figlia di QTreeWidget che voglio essere in grado di trascinare elementi da un altro albero (anche io voglio gestire l'inserimento personalmente), nonché da un QListWidget.Come decodificare "application/x-qabstractitemmodeldatalist" in Qt per il drag and drop?

Ho scavalcato il metodo dropEvent nella mia classe e sembra che il tipo di dati che sto ricevendo da QTreeWidget sia application/x-qabstractitemmodeldatalist, come posso decodificarlo per ottenere gli elementi dall'albero indietro?

risposta

19

Si può decodificare come segue:

QByteArray encoded = qMimeData->data("application/x-qabstractitemmodeldatalist"); 
QDataStream stream(&encoded, QIODevice::ReadOnly); 

while (!stream.atEnd()) 
{ 
    int row, col; 
    QMap<int, QVariant> roleDataMap; 
    stream >> row >> col >> roleDataMap; 

    /* do something with the data */ 
} 

Il QMap<int, QVariant> è ciò che viene restituito dalla QAbstractItemModel::itemData(index) per l'indice rappresentativo (row, col).

+1

Inoltre, ricorda che i dati codificati sono indicizzati in base ai ruoli in modo tale da riportare rapidamente i tuoi dati effettivi, utilizzare 'roleDataMap.value (Qt :: Role)' e utilizzare l'appropriato '.to ...' dalla variante. – iKlsR

2

Sembra che sia possibile utilizzare QStandardItemModel per decodificare i dati e recuperare un elemento. Non so se questo è il modo migliore per farlo però:

model = QStandardItemModel() 
    model.dropMimeData(event.mimeData(), Qt.CopyAction, 0,0, QModelIndex()) 

quindi è possibile utilizzare il metodo item() da modello a recuperare l'oggetto e gestirlo nel modo desiderato.

+0

è un po 'brutto ma funziona. – andrewrk

+0

Tuttavia, il codice richiede alcune correzioni - non è possibile creare 'QStandardItemModel()', per qualche motivo è necessario utilizzare 'new'. E 'Qt.CopyAction' dovrebbe essere' Qt :: CopyAction'. –