PyQt模型/视图:程序性变化适合哪种模型?

1 投票
2 回答
1710 浏览
提问于 2025-04-16 17:09

我最近开始重写一个应用程序,想把它改成模型/视图的方式,这样可以减少一些乱七八糟的代码。

到目前为止,我成功地创建了一个只读模型,这个模型是从 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() 等方法,还是有更简单的解决方案呢?

2 个回答

1

其实,这个事情比你想象的要复杂一些。你需要让你的视图知道表格是被展开还是收缩了。因为视图只会在本地更新被修改的项目,所以当表格的形状发生变化时,它必须被告知。

所以,当表格的形状变化时,你需要使用 beginInsertRows()beginRemoveRows()(还有对应的列操作)来通知视图。

想了解更多信息,可以查看 这个链接这个链接

每当用户更改一个可编辑的索引时,setData 方法就会被调用。

模型/视图编程可能一开始有点难,但如果做得好,它在稳定性、互动性、可扩展性和可重用性方面会带来很大的好处。

祝你好运!

1

我的logview应用程序使用了QAbstractTableModel,它有一个动态的日志记录列表,这个列表会随着网络上接收到的记录不断增加。你可以下载源代码,看看LogRecordModel,它是QAbstractTableModel的一个子类,PropertySheetModel也是。它们都是只读模型。

这个应用程序使用了Qt的模型/视图API,结构相对简单,所以你应该能把它的方法应用到自己的项目中。

撰写回答