[我对如何使用setData的setItemData,setItem和QStandardItemModel
方法感到困惑,这些方法似乎具有相同的效果,我想知道应该选择哪种方法是最佳方法?
class DemoD(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
table = QTableView()
model = QStandardItemModel(4, 2)
table.setModel(model)
# delegate = SpinBoxDelegate()
# table.setItemDelegate(delegate)
for row in range(4):
for col in range(2):
item = QStandardItem('china')
model.setItem(row, col, item)
index = model.index(row, col)
value = QVariant((row + 1)*(col + 1))
model.setData(index, value)
model.setItemData(index, {1: 'a', 2: 'b'})
self.setCentralWidget(table)
self.resize(400, 300)
app = QApplication([])
demo = DemoD()
demo.show()
app.exec()
如果您想了解Qt模型的概念,则应阅读以下指南:
考虑到您已经仔细阅读了前面的链接,我们将尝试解释您指出的不同方法之间的区别:
setData():每个Qt模型都继承自QAbstractItemModel,因此此类定义了常规行为,在这种情况下,定义为setData()模型负责修改与QModelIndex相关的角色信息。换句话说,这是您要实现可编辑模型时必须实现的通用方法,例如QStringListModel不是可编辑模型,因此它无法实现,但是在QStandardItemModel情况下它是可编辑的,因此您可以修改通过该方法的模型信息。
setItem(): 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允许您以简单的方式修改项目的信息,并且可以以简单的方式将其说成是模型的项目。
对于QStandardItemModel,以下代码是等效的:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
model = QtGui.QStandardItemModel(1, 1)
it = QtGui.QStandardItem()
model.setItem(0, 0, it)
# The following lines modify the text shown
# to be related to the Qt::DisplayRole role and
# the QModelIndex associated with the QStandardItem:
it.setText("foo")
it.setData("foo", QtCore.Qt.DisplayRole)
model.setData(it.index(), "foo", QtCore.Qt.DisplayRole)
model.setItemData(it.index(), {QtCore.Qt.DisplayRole: "foo"})
# The same as the previous lines but in the case of
# the background and the text colors of the item.
it.setForeground(QtGui.QColor("red"))
it.setBackground(QtGui.QColor("blue"))
it.setData(QtGui.QColor("red"), QtCore.Qt.ForegroundRole)
it.setData(QtGui.QColor("blue"), QtCore.Qt.BackgroundRole)
model.setData(it.index(), QtGui.QColor("red"), QtCore.Qt.ForegroundRole)
model.setData(it.index(), QtGui.QColor("blue"), QtCore.Qt.BackgroundRole)
model.setItemData(
it.index(),
{
QtCore.Qt.ForegroundRole: QtGui.QColor("red"),
QtCore.Qt.BackgroundRole: QtGui.QColor("blue"),
},
)
setData
和setItemData
都非常相似。