无重复元素的拖放

2024-09-28 22:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在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中的重复。在


Tags: 数据方法text视图列表datastreamapplication
1条回答
网友
1楼 · 发布于 2024-09-28 22:30:52

如果你想控制你的拖放行为,你需要设置你自己的mime数据。在

你可以对你想拖放的数据进行编码。我将把拖动的项放入一个列表中,并将它们编码为JSON,因为我很懒。在

在源代码视图的模型中,重写mimeTypes()mimeData()

def mimeTypes(self):
    return ['text/json']

def mimeData(self, indexes):
    dragData = json.dumps([index.data() for index in indexes])
    mimeData = QtCore.QMimeData()
    mimeData.setData('text/json', dragData)
    return mimeData

当有人从列表中抓取并拖动一个或多个项时,Qt将调用mimeData()对这些项进行编码。在这里,我获取每个被拖动索引的项数据,将其放入一个列表中,通过JSON将该列表转换为一个字符串,并将该JSON添加到QMimeData。在

mimeTypes()中,我指定mime数据将包括JSON数据。在


在目标视图的模型中,重写dropMimeData()

^{pr2}$

在第一行中,我从QMimeData中获取JSON数据并对其进行解码。然后,在for循环中,我检查其中一个项是否已经在目标视图中。如果是,请将其移除。在

之后,代码的其余部分将确定在何处添加新行并插入新行。在


更多信息是in the docs,特别是关于adding new drag and drop types的部分。在

相关问题 更多 >