在丢弃事件 Pyside 处检索 QTreeWidgetItem 对象



我正在编写一个程序,我需要来自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");.

现在,由

您来查看它的外观,并查看是否可以提取所需的信息。 :)

最新更新