【问题标题】:PyQt - Automatically refresh a custom view when the model is updated?PyQt - 更新模型时自动刷新自定义视图?
【发布时间】:2012-12-09 14:44:15
【问题描述】:

默认情况下,PyQt 中的内置视图可以在其模型更新时自动刷新。我写了自己的图表视图,但是不知道怎么做,不得不手动更新很多次。

我应该使用哪个信号?

【问题讨论】:

    标签: python qt user-interface qt4 pyqt


    【解决方案1】:

    您需要将您的视图连接到模型的dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) 信号:

    只要现有项目中的数据发生变化,就会发出此信号。

    如果项目属于同一父项,则受影响的是那些 在 topLeft 和 bottomRight 之间。如果物品没有 同一个父级,行为未定义。

    当重新实现 setData() 函数时,这个信号必须是 明确发出。

    【讨论】:

    • QTableView(),如果我setModel(model)setQuery(sql),然后setQuery(another_sql),视图会自动刷新。我的视图怎么能做同样的事情?
    • 您的视图来自QAbstractItemView?
    • 不幸的是,没有。它是 matplotlib 小部件的包装器。
    • 也许我需要实现更多。执行setQuery()时发出了哪个信号?
    • 当模型发出dataChanged信号时,视图dataChanged插槽被调用,你应该在你的视图中实现它
    【解决方案2】:

    如果你没有来自模型的 index() 对象,你可以从模型或模型外部调用数据更改信号,如果你从模型调用,请执行下一步:

    self.dataChanged.emit(index, index)
    

    一些模型函数可以获取索引,例如:

    def setData(self, **index**, value)
    

    所以,你可以调用信号:

    def setData(self, index, value):
       #do something
    
       self.dataChanged.emit(index, index)
    

    信号上的索引指示哪个元素改变了它的数据 如果您想从模型外部更改、刷新或重新加载数据并且您没有索引,则无需指示将更改哪个元素,因此,您可以应用下一行

    self.yourmodel.dataChanged.emit(QtCore.QModelIndex(), QtCore.QModelIndex())
    

    这将刷新所有已更改的数据。

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多