Как декодировать "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())