在我的应用程序中,我有一个带有QStandardItemModel的QListView。我需要项目来保存一些用户数据,通过扩展QStandardItem并添加我自己的数据可以正常工作。但我也想通过拖动重新排序列表中的项目,这里问题就开始了。似乎QT在放下它时克隆了该项目,复制了测试和颜色,但是它并不知道我的用户数据。我尝试在clone()中解决它,但它只用项目原型(这是一个空项)调用。我还试图覆盖setData()函数并使用UserRole作为我的用户数据,但是在拖动时不会复制它。
有没有人有类似事情的工作示例?
答案 0 :(得分:0)
您需要继承QStandardItem
并覆盖clone
方法。您还应该为模型设置项目原型
class MyItem(QStandardItem):
def clone(self):
obj = super(MyItem, self).clone()
... # copy user data as well
return obj
model.setItemPrototype(MyItem())
但我希望QStandardItem
已经复制了userdata。你是如何设置用户数据的?通常它看起来像这样
class MyItem(QStandardItem):
MyDataRole = Qt.UserRole + 1
MyOtherRole = Qt.UserRole + 2
item.setData('a value', MyItem.MyDataRole)
答案 1 :(得分:0)
我终于有时间再次研究这个项目并找到了解决方案。我已经覆盖了setData以确保在设置用户数据时更新了文本和正则表达式模式,只有在进行拖放移动时,才克隆该项而不为我的数据调用此函数。我想实现只是直接复制成员。所以我的解决方案是听取列表中的移动事件,然后更新新项目所需的所有内容。