【问题标题】:what is the signal for qtreeview changedqtreeview 的信号是什么改变了
【发布时间】:2015-09-07 23:05:20
【问题描述】:

有一个从 JSON 文件中提取的字典,由 QTreeView QStandardItemModel 表示。

用户可以重新组织QTreeView(添加、删除、拖放)和重命名项目。

目标是:调用读取更改的QTreeView 的函数,制作字典并将其写入初始 JSON 文件。

我可以通过在更改发生后按QPushButton 或将该函数绑定到每个更改来做到这一点,例如删除项目时调用函数,添加项目时调用函数,重命名项目时调用函数等等。

如果发生任何变化,有什么方法可以调用函数吗?是否有这样一个信号对应所有提到的变化?

【问题讨论】:

  • QAbstractItemModel::dataChanged() 和/或 QAbstractItemModel::layoutChanged() 信号可能会有所帮助。
  • QTreeView 是一个视图,所以它是一个小部件。小部件通常不会发出更新信号,而是在应该更新时传递一个事件。您的意思是您想知道 model 何时更改?如果是这样,您应该阅读文档:请参阅introduction to model view programming

标签: qt pyqt qtreeview qstandarditemmodel


【解决方案1】:

rowsMoveditemChanged 信号做你认为他们做的事。见http://doc.qt.io/qt-4.8/qstandarditemmodel.html

【讨论】:

  • 我正在寻找避免绑定函数对每个更改的方法。是否有所有变化的信号。
  • @SergiiArtele 你怎么知道有“所有”变化——也就是说,为什么你认为有不止一个变化?或者,如果您认为应该避免将函数“绑定”到每一种 种类 的更改:好吧,这是不可能的,因为没有信号只是说“嘿,有些东西改变了” .有不同种类的变化:结构性非结构性,你处理它们的方式有很大不同。或许先告诉我们您需要如何处理此类更改。
  • 好的,我的意思是使用这样的信号来涵盖我所做的任何更改。如selectionChanged 可用于覆盖项目是否被键盘上的箭头单击或选择或keyboardSearch
【解决方案2】:

正如@vahancho 在 cmets 中建议的那样,您应该连接到layoutChanged 信号。在进行可能影响视图的任何更改后,所有模型都应立即发出此消息。所以这将包括排序和过滤,以及重新排序、编辑、删除等。

dataChanged 信号类似,但仅在您想监控特定项目时才真正有用。

【讨论】:

  • layoutChanged 在我的情况下仅适用于拖放。当我添加、删除或重命名项目时它不起作用。所以当重命名发生时我将使用itemChanged,我将调用读取树并将其内容保存到 JSON 文件的函数在删除或添加时
  • @SergiiArtele。抱歉 - 我似乎从未完全测试过这些信号的作用,所以我被 Qt 文档误导了。
  • 我已经尝试了 dataChanged 和 layoutChanged 并且感到沮丧的是,在执行拖放操作时,似乎在拖放操作生效而不是在拖放结束时发出信号。 IE。模型没有完全更新!我找不到结束拖放操作的好信号。
猜你喜欢
  • 1970-01-01
  • 2019-10-29
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2023-01-26
相关资源
最近更新 更多