模型 - 视图 - 控制器:在Qt中编程时,模型会自动更新数据吗?

时间:2017-02-10 12:17:51

标签: model-view-controller pyqt

这只是一个理论问题,我是PyQT的新手。我无法识别将显示模型如何更新数据的类或代码示例(如果通过Qt完成)

现在我的理解是程序员负责编写在模型数据中进行更改时更新数据的方法/代码。

我说错了吗?

更新:似乎我的问题需要绘图:-) 所以数据就像存储在数据库中的数据一样。根据我的理解,这张图中的数据是存储在数据库中的数据,而不是模型所基于的数据,这是数据库中数据的一个子集

enter image description here

1 个答案:

答案 0 :(得分:0)

尝试关注一些tutorials并查看PyQt或PySide提供的示例程序。

模型是存储数据的对象。这可以像字符串列表一样简单。视图是显示数据的对象。 Qt提供了一些用于存储常见数据类型的标准模型和一些用于显示常见数据类型的标准视图。对于简单的情况,您可以使用这些预构建的组件。这些组件具有标准方法,用于在模型中添加或删除数据,或在模型更改时更新视图。这些更改使用信号从模型传播到视图,或从视图或控件窗口小部件传播到模型。由于方法和信号的标准化命名,这一切都非常有效。

但是,您的特定数据存储或数据显示需求可能会有所不同。在这种情况下,您可以实现自定义模型或自定义视图,或者在必要时实现两者。您可以通过继承框架提供的类之一来实现自定义模型(或视图)。您必须在这些子类上实现特定的命名方法,因为它是使其他组件的自动行为起作用的标准命名,但也可以添加您自己的自定义方法,例如您认为合适的。

继续MiniMe的评论:

让我们看一个例子。 Qt模型有一个xx.setData()方法来更新数据项,该方法接受指定数据在模型中的位置(索引)和新数据的参数。实现该方法时,执行将数据更新为您使用的任何底层存储机制(例如列表或字典)并发出xx.dataChanged()信号的工作。如果任何视图链接到此模型,他们将订阅此信号,因此将自动更新。

def setData(self, index, value):
    # Update the data in the underlying python list self.my_list
    # The index object is of a data type provided by Qt. To perform
    # this operation we have to extract the row number where the change
    # is to be made, then use that to update the appropriate entry in
    # the list.
    self.my_list[index.row()] = value

    # Create a PyQt modelIndex object based on the row number that was
    # updated. The self.index() method is provided by Qt.
    modelIndex = self.index(index.row())

    # Send the modelIndex of the change to any connected views so they
    # know to update themselves
    self.dataChanged.emit(modelIndex)

    # In reality we'd do some validation checks and return False if there
    # was a problem and the data change didn't happen.
    return True

需要实现类似的方法,以便在列表中添加新数据项或从列表中删除数据项。这些方法将进行更改,发送一个信号,指示模型的哪个部分已更改为任何附加视图,然后返回。我希望这更有帮助。