Невозможно получить «объект» (в смысле 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