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的情况下,可以确定所有角色对于始终有效的内容都是有效的
对于QStandarItemModel,以下代码是等效的:

导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) model=QtGui.QStandardItemModel(1,1) it=QtGui.QStandardItem() model.setItem(0,0,it) #以下几行修改了显示的文本 #与Qt::DisplayRole角色和 #与QStandardItem关联的QModelIndex: it.setText(“foo”) it.setData(“foo”,QtCore.Qt.DisplayRole) setData(it.index(),“foo”,QtCore.Qt.DisplayRole) model.setItemData(it.index(),{QtCore.Qt.DisplayRole:“foo”}) #与前几行相同,但在 #项目的背景和文本颜色。 it.set前台(QtGui.QColor(“红色”)) it.setBackground(QtGui.QColor(“蓝色”)) setData(QtGui.QColor(“红色”),QtCore.Qt.ForegroundRole) setData(QtGui.QColor(“蓝色”),QtCore.Qt.BackgroundRole) setData(it.index(),QtGui.QColor(“红色”),QtCore.Qt.ForegroundRole) setData(it.index(),QtGui.QColor(“蓝色”),QtCore.Qt.BackgroundRole) model.setItemData( it.index(), { QtCore.Qt.foreground角色:QtGui.QColor(“红色”), QtCore.Qt.BackgroundRole:QtGui.QColor(“蓝色”), }, )
两个
setData
setItemData
非常相似

您必须了解的是,Qt模型使用角色为每个“索引”分配特定数据。这意味着每个索引(对模型行和列的引用,如果模型支持树,则可能包括父索引)可以附加不同的数据。最常用的数据角色是“
DisplayRole
”,这是项目视图通常显示为文本的角色;但通常会实现其他数据(请参阅),这有助于项目视图向用户正确显示模型数据

setData
setItemData
之间最重要的区别在于映射。您所做的不起作用,因为您使用的关键字无法识别为可用角色。
在您的示例(
{1:a',2:b'}
)中,
1
映射到
DecorationRole
(从项目视图中用于显示装饰-图标)和
2
映射到
EditRole
,每当用户想要编辑该项目的内容时都会使用,这可能与显示的内容不同(考虑以简短的形式输入一个日期,例如“10/11”,该日期可以是f