Получить объект QTreeWidgetItem при событии перетаскивания Pyside

Я пишу программу, в которой мне нужны данные из QTreeWidgetItem, которые были помещены в другую часть моего QTreeWidget. Перетаскивание работает отлично, и я могу получить событие типа QEvent.Drop в моем eventFilter. Но я не могу получить фактический объект, который удаляется, или какие-либо другие данные, если на то пошло.

Как я могу получить объект, который падает?


person Yvo Götz    schedule 28.08.2013    source источник


Ответы (1)


Невозможно получить «объект» (в смысле C ++), который отбрасывается с помощью eventFilter или повторной реализации виртуального метода dropEvent ().

Причина в том, что дизайн Drag and Drop в Qt состоит в том, чтобы сделать его кроссплатформенным, т.е. вы можете перетаскивать «вещи» между двумя разными приложениями. Следовательно, Application1 не знает о классах C ++, используемых в Application2, и наоборот. Кроме того, даже если используются те же классы, адреса, используемые в Application1, недоступны в Application2 (ОС не позволяет процессу испортить память другого процесса). Следовательно, события перетаскивания вместо этого содержат общие «данные», тип и содержимое которых определяются типом MIME.

При этом ваш случай не безнадежен ;-) Объект QTreeWidgetItem не может быть получен, но данные, которые он содержит, могут быть получены. Для этого вам сначала нужно получить типы MIME, которые используются для описания данных, содержащихся в вашем QTreeWidgetItem, они доступны через:

QStringList QTreeWidget::mimeTypes() const;

Обратите внимание, что это защищенная функция, поэтому вместо QTreeWidget вы должны использовать свой собственный класс MyTreeWidget, который наследуется от него и из которого вы можете вызвать этот метод (и, возможно, сообщить остальному миру). Советую распечатать результат этого метода на qDebug(), чтобы иметь представление о том, как он выглядит. В моем случае это возвращает список только с одним типом MIME: application/x-qabstractitemmodeldatalist. Думаю, для вас будет то же самое, но я не знаю, как это реализовано, поэтому вам лучше проверить это самостоятельно.

Затем вы можете получить доступ к данным, связанным с каждым типом MIME (ну, кажется, есть только один тип MIME ...), используя:

foreach(QString mimeType, mimeTypes)
{
    QByteArray array = dropEvent.mimeData()->data(mimeType);
}

Или, наверное, просто QByteArray array = dropEvent.mimeData()->data("application/x-qabstractitemmodeldatalist");.

Теперь вам нужно посмотреть, как это выглядит, и посмотреть, сможете ли вы извлечь нужную информацию. :)

person Boris Dalstein    schedule 29.08.2013
comment
Спасибо за объяснение. Это действительно имеет смысл. Помимо данных мне все еще нужен объект, созданный после действия drop. Но теперь я знаю, где искать. Мимедата отлично подходит для получения данных :). - person Yvo Götz; 29.08.2013