【问题标题】:PyQt model/view: which type of model for programmatic changes?PyQt 模型/视图:编程更改的模型类型是什么?
【发布时间】:2011-05-06 21:50:21
【问题描述】:

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

到目前为止,我能够成功地创建一个继承自 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()等实现读写模型,还是有更简单的方案?

【问题讨论】:

    标签: python pyqt model-view


    【解决方案1】:

    我的logview 应用程序使用带有动态列表的QAbstractTableModel 日志记录,随着通过网络接收到的记录动态增加。您可以下载源代码并查看LogRecordModel,它是QAbstractTableModel 的子类,PropertySheetModel 也是如此。这两个都是只读模型。

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

    【讨论】:

    • 谢谢,我去看看。
    【解决方案2】:

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

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

    请参阅thisthis 了解更多信息。

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

    模型/视图编程可能有点难上手,但在稳定性、交互性、可扩展性和可重用性方面(如果做得正确)会带来巨大的好处。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 2018-06-30
      • 2016-11-10
      • 2015-09-29
      • 1970-01-01
      • 2011-06-19
      • 2011-09-03
      • 2012-09-15
      • 2012-08-31
      相关资源
      最近更新 更多