我最近开始重写一个应用程序,我正在尝试将其移植到模型/视图中以减少我在那里的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()等实现读写模型,还是有更简单的解决方案?
答案 0 :(得分:1)
事实上,它比你想要的更多一些。在扩展或缩小表格时,您必须知道您的视图。由于视图在修改时仅在本地更新项目,因此必须在表格形状发生变化时通知它。
因此,当表的形状发生变化时,您必须使用 beginInsertRows()和 beginRemoveRows()(以及列的对应项)。
只要用户更改可编辑索引,就会调用setData方法。
模型/视图编程可能有点难以实现,但它在稳定性,交互性,可伸缩性和可重用性方面支付了大量红利(如果正确完成)。
祝你好运!答案 1 :(得分:1)
我的logview应用程序使用带有动态列表的QAbstractTableModel
日志记录,这些记录在网络上接收记录时会动态增加。您可以下载源代码并查看LogRecordModel
,QAbstractTableModel
子类,PropertySheetModel
。这两个都是只读模型。
这是一个使用Qt模型/视图API的非常简单的应用程序,因此您应该能够根据自己的应用调整其技术。