欢迎访问宙启技术站
智能推送

利用PySide2.QtCore实现数据模型与视图的分离

发布时间:2023-12-18 23:36:12

在PySide2中,可以使用QtCore模块实现数据模型和视图的分离。数据模型用于存储数据,并提供一些方法来访问和操作数据;视图用于展示数据并与用户交互。

我们可以通过继承QtCore.QAbstractTableModel类来创建一个自定义的数据模型,通过实现其中的方法来定义数据模型的行为。在数据模型中,我们需要实现至少下面几个方法:

1. rowCount:返回数据模型的行数。

2. columnCount:返回数据模型的列数。

3. data:返回指定索引位置的数据。

4. setData:设置指定索引位置的数据。

接下来,我们可以使用QtWidgets模块中的一些视图组件(例如QTableView、QListView、QTreeView)来展示数据,并与用户交互。

下面是一个使用PySide2实现数据模型与视图分离的例子:

from PySide2.QtCore import Qt, QAbstractTableModel
from PySide2.QtWidgets import QApplication, QTableView


class MyTableModel(QAbstractTableModel):
    def __init__(self, data):
        super().__init__()
        self._data = data

    def rowCount(self, parent=None):
        return len(self._data)

    def columnCount(self, parent=None):
        return len(self._data[0])

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole:
            row = index.row()
            column = index.column()
            return self._data[row][column]

    def setData(self, index, value, role=Qt.EditRole):
        if role == Qt.EditRole:
            row = index.row()
            column = index.column()
            self._data[row][column] = value
            self.dataChanged.emit(index, index)
            return True
        return False


if __name__ == '__main__':
    app = QApplication([])

    data = [
        ['John', 'Doe', 30],
        ['Jane', 'Smith', 25],
        ['Bob', 'Johnson', 40]
    ]

    model = MyTableModel(data)
    view = QTableView()
    view.setModel(model)
    view.show()

    app.exec_()

在这个例子中,我们定义了一个自定义的数据模型MyTableModel,它继承自QAbstractTableModel。在模型中,我们将一个二维列表作为数据存储,并实现了rowCount、columnCount、data和setData等方法。

然后,我们创建了一个QTableView,并将自定义的数据模型设置为其模型。最后,我们调用app.exec_()来启动应用程序。

运行这个例子,将会展示一个表格视图,其中显示了我们所定义的数据。我们可以在表格中直接编辑数据,并通过setData方法来更新数据模型的数据。

这个例子展示了如何使用PySide2.QtCore实现数据模型与视图的分离。通过定义自己的数据模型类,我们可以灵活地控制和组织数据。使用视图组件来展示数据,可以方便地与用户交互并提供丰富的数据展示和编辑功能。