我正在编写一个程序,我需要来自QTreeWidgetItem的数据,这些数据已被放入QTreeWidget的另一部分。拖放工作正常,我能够在我的 eventFilter 中获得 QEvent.Drop 类型事件。但是我无法获得正在丢弃的实际对象或任何其他数据。
如何获取正在丢弃的对象?
通过 eventFilter 或虚拟 dropEvent(( 方法的重新实现来获取正在删除的"对象"(C++意义上(。
原因是Qt下的拖放设计是使其跨应用程序,即您可以在两个不同的应用程序之间拖放"事物"。因此,Application1
不知道Application2
中使用的C++类,反之亦然。此外,即使使用相同的类,Application1
中使用的地址也无法在Application2
中访问(操作系统不允许一个进程弄乱另一个进程的内存(。因此,拖放事件包含通用"数据",其类型和内容由 MIME 类型确定。
话虽如此,您的情况并非没有希望;-(无法获取QTreeWidgetItem
对象,但可以获取它包含的数据。为此,您首先需要获取用于描述QTreeWidgetItem
中包含的数据的 MIME 类型,这些类型可通过以下方式访问:
QStringList QTreeWidget::mimeTypes() const;
请注意,这是一个受保护的函数,因此您必须使用自己的类MyTreeWidget
,而不是 QTreeWidget
,该类继承自它,您可以从中调用此方法(也可能告诉世界其他地方(。我建议您打印此方法的结果,以qDebug()
了解它的外观。就我而言,这将返回一个只有一种 MIME 类型的列表:application/x-qabstractitemmodeldatalist
。我想这对你来说是一样的,但我不知道它是如何实现的,所以你最好自己检查一下。
然后,您可以访问与每种MIME类型关联的数据(好吧,似乎只有一个哑剧类型...用:
foreach(QString mimeType, mimeTypes)
{
QByteArray array = dropEvent.mimeData()->data(mimeType);
}
或者可能只是QByteArray array = dropEvent.mimeData()->data("application/x-qabstractitemmodeldatalist");
.
您来查看它的外观,并查看是否可以提取所需的信息。 :)