0

我正在编写一个程序,我需要来自 QTreeWidgetItem 的数据,这些数据已放入我的 QTreeWidget 的另一部分。拖放工作完美,我能够在我的 eventFilter 中获得一个 QEvent.Drop 类型的事件。但我无法获得被丢弃的实际对象,或任何其他数据。

我怎样才能得到被丢弃的对象?

4

1 回答 1

0

不可能通过 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");

现在,由你来看看它的样子,看看你是否可以提取你需要的信息。:)

于 2013-08-29T04:25:56.777 回答