gpt4 book ai didi

c++ - 在 Qt 中建模自修改数据/包装器模型

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:25 27 4
gpt4 key购买 nike

在 Qt 中,我正在编写自己的树模型(通过子类化 QAbstractItemModel),它环绕现有的数据结构。应该可以在内部(而不是通过模型)以及通过模型(以便 View 可以更改它)更新数据结构。为了更好地想象它:它是一个场景图,应该可以使用场景 View (不通过 Qt 模型)进行编辑,但也可以使用大纲(QTreeView,它使用 Qt 模型作为场景图周围的代理)。

为了避免混淆,我们应该考虑两种不同的场景(在下文中,我以“删除”操作为例):

  1. 用户使用 Qt View 删除节点。 View 想要使用 QAbstractItemModel::removeRow 从模型中删除一行.这应该反过来从底层数据结构场景图中删除相应的节点。 Calls in scenario 1

  2. 用户使用场景 View 移除节点。场景 View 想要从场景图中移除一个节点。环绕场景图的模型收到通知,然后想要通知连接的 View 一行刚刚被删除。 Calls in scenario 2

虽然我认为我知道如何实现 1.,但我不知道如何实现 2. 中的通知部分。有信号 QAbstractItemModel::rowsAboutToBeRemoved()以及rowsRemoved()听起来他们是我的 friend 。但它们是私有(private)信号(他们在标题源代码中说:“只能由 QAbstractItemModel 发出”)。还有beginRemoveRows()endRemoveRows()但是根据他们的文档,应该在 View 发生更新时调用它们,即调用 removeRow 时。此外,当我尝试使用它们时, View 完全搞砸了。

根据文档,模型类似乎并不打算对自修改数据进行建模。让我们以文件系统为例。当使用可以检测目录更改的文件系统监视时,模型应该通知 View 以便目录中的更改可以实时显示,即使 View 未用于修改文件系统也是如此。在 Qt 中甚至可以使用这样的模型吗?

最佳答案

你读错了。该模型必须在即将开始改变其“几何形状”时向其用户发出信号。因此,无论 什么 从模型中删除行,它都必须告诉外界它发生了。 View 从模型中删除行时的事件顺序是这样的:

  1. View 调用 model->removeRows()

  2. 模型调用 beginRemoveRows()

  3. 模型实际上从内部数据中删除了行。

  4. 模型调用 endRemoveRows()

如果您实现了一些其他接口(interface),无需调用 model->removeRows() 即可删除行,则您必须执行完全相同的操作。从模型中删除行的是 View 还是其他代码并不重要,模型的行为必须相同,否则什么都不会起作用。

您可以设计一个适配器类,插入您的 SceneGraph 和模型之间。它应该持有指向场景图和模型的指针,并在两者之间转换操作。

关于c++ - 在 Qt 中建模自修改数据/包装器模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19199169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com