带有用户数据的 QStandardItem

QStandardItem with user data

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

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

您需要继承 QStandardItem 并覆盖 clone 方法。您还应该为模型设置项目原型

class MyItem(QStandardItem):

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

model.setItemPrototype(MyItem())

但我希望 QStandardItem 已经复制用户数据。你如何设置用户数据?一般是这样的

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

item.setData('a value', MyItem.MyDataRole)

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