在PyQt4和python3中,如何访问拖放到视图/模型中的数据?在
我正在构建一个有两个QListView
的接口。我希望能够从第一个视图拖动一个项目,并将其放到第二个视图中。但是,列表需要保持唯一性,因此删除已在列表中的项不会起任何作用。在
我不知道如何访问被删除的数据,以验证它不在列表中。在
我找到了QAbstractItemModel
方法dropMimeData()
,它应该返回True
来接受丢失的数据,False
来拒绝它。但是,拖放数据在QMimeData
中,并且是application/x-qabstractitemmodeldatalist
类型。离开the docs,我试图解码数据:
def dropMimeData(self, data, action, row, column, parent=None):
stream = QtCore.QDataStream(data.data('application/x-qabstractitemmodeldatalist'))
text = ''
while not stream.atEnd():
stream >> text
print(text)
但是,如果我运行这个,我会得到
^{pr2}$如果我设置text = 'a'
,那么a
就会重复打印。在
我尝试了this solution,但在Python3中,我无法创建QVariant
对象(每个this answer)。在
那么如何访问PyQt中的拖放数据呢?有没有办法解码QMimeData
的东西?或者有没有其他方法来检查掉下来的东西?在
这不是this question的副本。我的问题是关于访问QAbstractItemView
/QAbstractItemModel
中丢弃的数据,而这个问题是关于PyQt中的基本拖放操作。答案没有说明如何从mimetype 'application/x-qabstractitemmodeldatalist'
获取数据,也没有说明如何防止QAbstractItemModel
中的重复。在
如果你想控制你的拖放行为,你需要设置你自己的mime数据。在
你可以对你想拖放的数据进行编码。我将把拖动的项放入一个列表中,并将它们编码为JSON,因为我很懒。在
在源代码视图的模型中,重写
mimeTypes()
和mimeData()
:当有人从列表中抓取并拖动一个或多个项时,Qt将调用
mimeData()
对这些项进行编码。在这里,我获取每个被拖动索引的项数据,将其放入一个列表中,通过JSON将该列表转换为一个字符串,并将该JSON添加到QMimeData
。在在
mimeTypes()
中,我指定mime数据将包括JSON数据。在在目标视图的模型中,重写
^{pr2}$dropMimeData()
:在第一行中,我从
QMimeData
中获取JSON数据并对其进行解码。然后,在for
循环中,我检查其中一个项是否已经在目标视图中。如果是,请将其移除。在之后,代码的其余部分将确定在何处添加新行并插入新行。在
更多信息是in the docs,特别是关于adding new drag and drop types的部分。在
相关问题 更多 >
编程相关推荐