2009-11-12 3 views
13

Bir QListWidget öğesinin yanı sıra başka bir ağaç parçacığındaki öğeleri de sürükleyebilmem için bir alt sınıf QTreeWidget sınıfı oluşturdum.Sürükle ve bırak işlemi için Qt'de "application/x-qabstractitemmodeldatalist" nasıl çözülür?

Sınıfımdaki dropEvent yöntemini geçersiz kıldım ve QTreeWidget uygulamasından aldığım verilere ait mimetype gibi görünüyor/x-qabstractitemmodeldatalist, ağacın öğelerini almak için bunu nasıl çözebilirim? geri mi çıktı?

cevap

19

Bunu deşifre edebilir:

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 */ 
} 

QMap<int, QVariant>(row, col) temsil endeksi için QAbstractItemModel::itemData(index) tarafından döndürülen budur.

+1

Ayrıca, kodlanmış verilerin rollere göre endekslendiğini, böylece gerçek verilerinizi hızlı bir şekilde geri alabileceğinizi, roleDataMap.value (Qt :: Role) 'işlevini kullanacağını ve varyanttan uygun' .to ... 'değerini kullandığını unutmayın. – iKlsR

2

Verilerin kodunu çözmek ve bir öğeyi geri almak için QStandardItemModel kullanabileceğiniz gibi görünüyor.

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

Sonra öğeyi almak için modelden öğe() yöntemini kullanın ve bununla birlikte istediğiniz işleyebilir: Bu olsa bunu yapmak için en iyi yol olup olmadığını bilmiyorum. aşağıdaki gibi

+0

Bu bir çeşit kötü ama işe yarıyor. – andrewrk

+0

Kodun bazı düzeltmeleri olmasına rağmen - QStandardItemModel() 'oluşturulamıyor, bir nedenle 'new' kullanmanız gerekir. Ve Qt.CopyAction 'Qt :: CopyAction' olmalıdır. –