我正在编写一个程序,我需要来自 QTreeWidgetItem 的数据,这些数据已放入我的 QTreeWidget 的另一部分。拖放工作完美,我能够在我的 eventFilter 中获得一个 QEvent.Drop 类型的事件。但我无法获得被丢弃的实际对象,或任何其他数据。
我怎样才能得到被丢弃的对象?
我正在编写一个程序,我需要来自 QTreeWidgetItem 的数据,这些数据已放入我的 QTreeWidget 的另一部分。拖放工作完美,我能够在我的 eventFilter 中获得一个 QEvent.Drop 类型的事件。但我无法获得被丢弃的实际对象,或任何其他数据。
我怎样才能得到被丢弃的对象?
不可能通过 eventFilter 或虚拟 dropEvent() 方法的重新实现来获取正在删除的“对象”(在 C++ 意义上)。
原因是Qt下Drag and Drop的设计是为了让它跨应用程序,即你可以在两个不同的应用程序之间拖放“东西”。因此,Application1
不知道 中使用的 C++ 类Application2
,反之亦然。此外,即使使用相同的类,其中使用的地址Application1
也无法访问Application2
(操作系统不允许进程与另一个进程的内存混淆)。因此,Drag and Drop 事件包含通用“数据”,其类型和内容由 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");
。
现在,由你来看看它的样子,看看你是否可以提取你需要的信息。:)