Как декодировать "application/x-qabstractitemmodeldatalist" в Qt для перетаскивания?
Я создал дочерний класс QTreeWidget, который я хочу, чтобы иметь возможность перетаскивать элементы из другого виджета дерева тоже (я хочу обработать вставку самостоятельно), а также из QListWidget.
Я переопределил метод dropEvent в своем классе, и похоже, что mimetype из данных, которые я получаю от моего QTreeWidget, является application/x-qabstractitemmodeldatalist, как я могу декодировать это, чтобы получить элементы с дерева назад вне дома?
Ответы
Ответ 1
Вы можете расшифровать его следующим образом:
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>
- это то, что возвращается QAbstractItemModel::itemData(index)
для индекса, представляющего (row, col)
.
Ответ 2
Похоже, вы можете использовать QStandardItemModel для декодирования данных и возврата элемента. Не знаю, если это лучший способ сделать это, хотя:
model = QStandardItemModel()
model.dropMimeData(event.mimeData(), Qt.CopyAction, 0,0, QModelIndex())
Затем вы можете использовать метод item() из модели, чтобы получить элемент и обработать его, как хотите.
Ответ 3
В PySide2 это работает для меня
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())