How to decode “application/x-qabstractitemmodeldatalist” in Qt for drag and drop?

匿名 (未验证) 提交于 2019-12-03 01:12:01

问题:

I've created a child class of QTreeWidget that I want to be able to drag items from another tree widget too (I want to handle the insertion myself though), as well as from a QListWidget.

I've overridden the dropEvent method in my class, and it looks like the mimetype of the data I'm getting from my QTreeWidget is application/x-qabstractitemmodeldatalist, how can I decode this to get the items from the tree back out?

回答1:

You can decode it as follows:

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

The QMap<int, QVariant> is what is returned by QAbstractItemModel::itemData(index) for the index representing (row, col).



回答2:

Looks like you can use QStandardItemModel to decode the data and get an item back out. Don't know if this is the best way to do it though:

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

Then you can use the item() method from model to retrieve the item and handle it however you want.



回答3:

In PySide2 this works for me

def dropEvent(self, event):     if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'):         data = event.mimeData()         source_item = QtGui.QStandardItemModel()         source_item.dropMimeData(data, QtCore.Qt.CopyAction, 0,0, QtCore.QModelIndex())         print(source_item.item(0, 0).text())  


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!