PyQt模型/视图:用于程序化更改的模型类型?

时间:2011-05-06 21:50:21

标签: python pyqt model-view

我最近开始重写一个应用程序,我正在尝试将其移植到模型/视图中以减少我在那里的kludges数量。

到目前为止,我能够成功地创建一个继承自QAbstractTableModel的只读模型。这个模型是这样的:

class MyModel(QtCore.QAbstractTableModel):
    def __init__(self, data, parent=None):
        super(MyModel, self).__init__(parent)
        self.data = data

data是一个包含许多对象的列表。然后在data()方法中访问它们:

   def data(self, index, role):

       # much stuff omitted for clarity
       return QtCore.QVariant(self.data[index.column()].id)

现在,如果我使用预定义的data元素,这很好。但实际上data以编程方式进行更改(当收到某些信号时它会扩展)。如何让模型意识到这一点,那么我的视图也可以对这些变化做出反应?

我一直在阅读有关读写模型的内容,但它们也允许用户编辑和更改内容,而在我看来,我希望事情不可编辑:简而言之,模型需要在后面进行更改场景“只有,而观点适应那种。

在这种情况下,最好的appproach是什么?使用setData()等实现读写模型,还是有更简单的解决方案?

2 个答案:

答案 0 :(得分:1)

事实上,它比你想要的更多一些。在扩展或缩小表格时,您必须知道您的视图。由于视图在修改时仅在本地更新项目,因此必须在表格形状发生变化时通知它。

因此,当表的形状发生变化时,您必须使用 beginInsertRows() beginRemoveRows()(以及列的对应项)。

有关详细信息,请参阅thisthis

只要用户更改可编辑索引,就会调用setData方法。

模型/视图编程可能有点难以实现,但它在稳定性,交互性,可伸缩性和可重用性方面支付了大量红利(如果正确完成)。

祝你好运!

答案 1 :(得分:1)

我的logview应用程序使用带有动态列表的QAbstractTableModel日志记录,这些记录在网络上接收记录时会动态增加。您可以下载源代码并查看LogRecordModelQAbstractTableModel子类,PropertySheetModel。这两个都是只读模型。

这是一个使用Qt模型/视图API的非常简单的应用程序,因此您应该能够根据自己的应用调整其技术。