【问题标题】:What exactly changed when QStandardItemModel itemChanged is signaled发出 QStandardItemModel itemChanged 信号时究竟发生了什么变化
【发布时间】:2009-08-27 11:16:23
【问题描述】:

QStandardItemModel 中有一个信号,当项目的数据发生变化时会发出该信号。 通常我们为这个信号连接一个处理程序并在处理程序例程中完成所有工作。

这样的句柄例程只获得指向该项目的指针。 使用该指针可以访问项目的数据。 但是,我们不知道到底发生了什么变化……我们只有更新的值。

如果项目数据具有多个角色,我希望能够准确了解哪个角色(数据)已更改以及之前的值是什么。

【问题讨论】:

    标签: user-interface qt


    【解决方案1】:

    一般来说,QStandardItemModel 用于非常简单的数据建模。如果你想了解更高级的东西,比如你所描述的,你应该研究子类化 QAbstractItemModel 或其抽象派生词之一:Model/View classes

    这似乎是一项艰巨的工作,但使用示例和参考指南:Model/View programmingModel subclassing,回报会很大。

    【讨论】:

    • 感谢您提供的信息。然而,令我惊讶的是,我们不能直接从 QStandardItemModel 继承,因为它的成员不是虚拟的。是不是我们总是要实现 QAbstractItemModel 中的所有东西?
    • 是的,或者像我说的它的抽象派生之一,例如:QAbstractListModel、QAbstractTableModel、QDirModel、QFileSystemModel。项目、列表或表格通常是您使用的。如果您的数据可以以这种方式表示,列表和表格只会让生活更轻松。在 Qt 文档的某个地方,还有一个树模型可以用作参考。
    【解决方案2】:

    这对于 Qt 的标准信号是不可能的。我建议为此添加另一个信号。

    对于我自己的模型,我通常使用这种方法:我有一个根实例,其中包含指向我的数据模型所有部分的指针。我的模型中的项目使用这个根实例来发送信号,如

    itemChanged(item, attribute, oldValue, newValue)
    

    对于简单的属性。列表等也是如此;只有在这里,我有几个信号取决于动作,例如:

    itemAdded(list, item, index)
    

    [编辑] QT 信号处理非常基础。通常,它只会告诉“发生了变化”。不支持“到底发生了什么变化?”因为你大部分时间都不需要它。所以如果你需要这些信息,你必须自己做。您不能单独使用角色,因为角色必须由项目中的某些内容支持。您可以做的是向您的项目添加更改信息,并在请求角色时阅读该信息。但这不是“开箱即用”支持的东西。

    【讨论】:

    • 可能我不明白你的方法。这看起来太复杂了。对我来说,将每个 OldValue 存储为在项目中具有不同角色的单独数据会更容易。这样,我只需要比较和更新任何 itemChanged 信号的这个值,我就得到了我需要的一切。我只是认为它应该已经存在于 QT 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多