QStandardItemModel的setData,setItemData和setIem方法有什么区别?

问题描述 投票:0回答:2

[我对如何使用setDatasetItemDatasetItemQStandardItemModel方法感到困惑,这些方法似乎具有相同的效果,我想知道应该选择哪种方法是最佳方法?

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()

pyqt pyqt5 qabstractitemmodel
2个回答
0
投票

如果您想了解Qt模型的概念,则应阅读以下指南:

以前的概念:

  • QStandarItemModel:这是一个从QAbstractItemModel继承的类,该类允许存储任何类型的信息,这与仅定义行为的QAbstractItemModel不同。

考虑到您已经仔细阅读了前面的链接,我们将尝试解释您指出的不同方法之间的区别:

  • 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允许您以简单的方式修改项目的信息,并且可以以简单的方式将其说成是模型的项目。

  • setItemData():该方法允许您通过检查角色是否有效来修改与QModelIndex关联的多个角色的信息,通常,如果使用无效模型,该方法将不会更新信息,但是QStandardItemModel处理通用信息的过程,它确定所有角色对于始终有效的角色都是有效的。
  • 对于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"),
        },
    )

0
投票

setDatasetItemData都非常相似。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.