0

在我的应用程序中,我有一个带有 QStandardItemModel 的 QListView。我需要这些项目来保存一些用户数据,通过扩展 QStandardItem 并添加我自己的数据可以正常工作。但我也希望可以通过拖动重新排序列表中的项目,问题就从这里开始了。似乎QT在丢弃它时克隆了它,复制了测试和颜色,但是它不知道我的用户数据。我尝试在 clone() 中解决它,但它只用项目原型(这是一个空项目)调用。我还尝试覆盖 setData() 函数并将角色 UserRole 用于我的用户数据,但拖动时也不会复制。

有没有人有类似的工作示例?

4

2 回答 2

0

You need to subclass QStandardItem and override the clone method. You should also set the item prototype for the model

class MyItem(QStandardItem):

    def clone(self):
        obj = super(MyItem, self).clone()
        ... # copy user data as well
        return obj

model.setItemPrototype(MyItem())

But I would expect the QStandardItem to copy userdata already. How are you setting user data? Generally it looks like this

class MyItem(QStandardItem):
    MyDataRole = Qt.UserRole + 1
    MyOtherRole = Qt.UserRole + 2

item.setData('a value', MyItem.MyDataRole)
于 2016-05-14T09:34:52.590 回答
0

我终于有时间再次处理这个项目并找到了解决方案。我重写了 setData 以确保在设置用户数据时更新文本和正则表达式模式,只是在进行拖放移动时,项目被克隆而不为我的数据调用此函数。我猜这个实现只是直接复制成员。所以我的解决方案是监听列表中的移动事件,然后更新新项目所需的所有内容。

于 2016-08-17T07:22:51.077 回答