0

我最近开始重写一个应用程序,我正在尝试将它移植到模型/视图以减少我在那里的 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编程方式更改(当接收到某些信号时它会扩展)。我怎样才能让模型意识到这一点,以便我的视图也可以对这些变化做出反应?

我一直在阅读有关读写模型的文章,但它们也允许用户编辑和更改内容,而在我看来,我希望事情是不可编辑的:简而言之,需要“在幕后”更改模型只是,视图会适应这一点。

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

4

2 回答 2

1

事实上,它比您可能希望的要复杂一些。您必须让您的视图知道表格何时被扩展或收缩。由于视图仅在修改项目时在本地更新项目,因此必须在表的形状发生更改时通知它。

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

有关更多信息,请参阅

每当用户更改可编辑索引时,都会调用 setData 方法。

模型/视图编程可能有点难以开始,但它在稳定性、交互性、可伸缩性和可重用性方面带来了巨大的好处(如果做得正确)。

祝你好运!

于 2011-05-06T22:01:49.353 回答
1

我的logview应用程序使用QAbstractTableModel动态列表 - 日志记录,随着通过网络接收记录而动态增加。你可以下载源代码看一下LogRecordModel,它是一个QAbstractTableModel子类,原样PropertySheetModel。这两个都是只读模型。

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

于 2011-05-06T22:10:16.317 回答