可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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())