Pyqt 什么';QSTANDARDITEM模型的setData、setItemData和setIem方法的差异?
我不知道如何使用,以及Pyqt 什么';QSTANDARDITEM模型的setData、setItemData和setIem方法的差异?,pyqt,pyqt5,qabstractitemmodel,Pyqt,Pyqt5,Qabstractitemmodel,我不知道如何使用,以及QStandardItemModel的方法,这些方法似乎都有相同的效果,我不知道我应该选择哪种方法才是最好的 类解调器(QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() self.init_ui() def初始用户界面(自身): table=QTableView() 模型=QStandardItemModel(4,2) 表2.setModel(模型) #delegate=SpinBoxDelegate() #表.setIt
QStandardItemModel
的方法,这些方法似乎都有相同的效果,我不知道我应该选择哪种方法才是最好的
类解调器(QMainWindow):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.init_ui()
def初始用户界面(自身):
table=QTableView()
模型=QStandardItemModel(4,2)
表2.setModel(模型)
#delegate=SpinBoxDelegate()
#表.setItemDelegate(委托)
对于范围(4)中的行:
对于范围(2)中的列:
项目=QS标准项目(“中国”)
model.setItem(行、列、项)
索引=模型索引(行、列)
值=QVariant((行+1)*(列+1))
model.setData(索引、值)
setItemData(索引,{1:a',2:b'})
self.setCentralWidget(表)
自我调整大小(400300)
app=QApplication([])
demo=demo()
demo.show()
app.exec()
如果您想了解Qt模型的概念,应阅读以下指南:
- 每种方法的文档:,和
- :它是从QAbstractItemModel继承的类,允许存储任何类型的信息,而QAbstractItemModel只定义行为
- 每个Qt模型都继承自QAbstractItemModel,因此该类定义了一般行为,在本例中,定义了setData()模型负责修改与QModelIndex关联的角色的信息。换句话说,如果您想要实现一个可编辑的模型,它是您必须实现的通用方法,例如QStringListModel不是一个可编辑的模型,因此它不会实现它,但是在QStandardItemModel的情况下,它是可编辑的,因此您可以通过该方法修改模型的信息
- QStandardItem是QStandardItemModel的一个概念,在概念上类似于QModelIndex。此元素允许您轻松地与QModelIndex交互。如果QStandardItem未与模型关联,则它将仅存储信息,在为模型分配所有信息时,该模型将通知您可以通过其他方法(如setData)进行的任何更改。与模型的setData等效的是QStandardItem的setData方法,但后者不需要提供QModelIndex,因为该信息在内部可用,或者在建立模型时可以获得
it.setText("foo")
it.setTextAlignment(QtCore.Qt.AlignCenter)
相当于
it.model().setData(it.index(), "foo", QtCore.Qt.DisplayRole)
it.model().setData(it.index(), QtCore.Qt.AlignCenter, QtCore.Qt.TextAlignmentRole)
如您所见,QStandardItem允许您以一种简单的方式修改项的信息,并且可以用一种简单的方式说它是模型的项
- 该方法允许您通过检查角色是否有效来修改与QModelIndex关联的多个角色的信息,通常,如果使用无效的模型,该方法将不会更新信息,但在处理通用信息的QStandardItemModel的情况下,可以确定所有角色对于始终有效的内容都是有效的
两个setData
和setItemData
非常相似
您必须了解的是,Qt模型使用角色为每个“索引”分配特定数据。这意味着每个索引(对模型行和列的引用,如果模型支持树,则可能包括父索引)可以附加不同的数据。最常用的数据角色是“DisplayRole
”,这是项目视图通常显示为文本的角色;但通常会实现其他数据(请参阅),这有助于项目视图向用户正确显示模型数据
setData
和setItemData
之间最重要的区别在于映射。您所做的不起作用,因为您使用的关键字无法识别为可用角色。
在您的示例({1:a',2:b'}
)中,1
映射到DecorationRole
(从项目视图中用于显示装饰-图标)和2
映射到EditRole
,每当用户想要编辑该项目的内容时都会使用,这可能与显示的内容不同(考虑以简短的形式输入一个日期,例如“10/11”,该日期可以是f