Как декодировать «application / x-qabstractitemmodeldatalist» в Qt для перетаскивания? - PullRequest
15 голосов
/ 12 ноября 2009

Я создал дочерний класс QTreeWidget, который я хочу иметь возможность перетаскивать элементы из другого виджета дерева (хотя я хочу обрабатывать вставку самостоятельно), а также из QListWidget.

Я переопределил метод dropEvent в моем классе, и похоже, что mimetype данных, которые я получаю из моего QTreeWidget, это application / x-qabstractitemmodeldatalist, как я могу декодировать это, чтобы получить элементы из дерева обратно из

Ответы [ 3 ]

25 голосов
/ 01 мая 2010

Вы можете расшифровать его следующим образом:

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).

3 голосов
/ 12 ноября 2009

Похоже, вы можете использовать QStandardItemModel, чтобы декодировать данные и вернуть элемент обратно. Не знаю, если это лучший способ сделать это:

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

Затем вы можете использовать метод item () из модели, чтобы извлечь элемент и обработать его так, как вы хотите.

0 голосов
/ 06 октября 2018

В 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()) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...