2009-08-27 525 views
4

QStandardItemModel中有一个信号是在项目数据发生变化时发出的。 通常我们为这个信号连接一个处理程序,并执行处理程序中的所有工作。当发送QStandardItemModel itemChanged时发生了什么变化

这样的句柄程序只获取指向该项目的指针。 使用此指针可以访问该项目的数据。 但是,我们不知道究竟发生了什么变化...我们只有更新的价值。

如果项目数据有几个角色,我希望能够确切地知道哪个角色(数据)已被更改,以前的值是什么。

回答

5

一般而言,QStandardItemModel用于非常简单的数据建模。如果你想进入更先进的东西像你desribe,你应该看看子类QAbstractItemModel或它的一个抽象的衍生品:Model/View classes

它可能看起来像很多工作,但使用的例子和refernce指南:Model/View programmingModel subclassing和奖励将是伟大的。

+0

谢谢你的信息。 但是,令我吃惊的是,我们无法直接从QStandardItemModel继承,因为它的成员不是虚拟的。是否我们总是必须从QAbstractItemModel实现所有东西? – alexkr 2009-08-27 13:34:37

+0

是的,或者像我说的其中一个抽象衍生物,例如:QAbstractListModel,QAbstractTableModel,QDirModel,QFileSystemModel。项目,列表或表格通常是您使用的。如果可以用这种方式表示数据,则列表和表格可以让生活更轻松。 Qt文档中的某处还有一个可用作参考的树模型。 – 2009-08-27 16:54:26

0

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

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

itemChanged(item, attribute, oldValue, newValue) 

对于简单属性。列表和类似的情况也是如此;只有在这里,我有几个信号取决于行动,例如:

itemAdded(list, item, index) 

[编辑] QT信号处理是非常基本的。通常,它只会告诉“事情已经改变”。没有支持“究竟发生了什么变化?”因为你大部分时间都不需要它。所以如果你需要这些信息,你必须自己做。你不能单独使用一个角色,因为角色必须由项目中的某些东西支持。你可以做的是将变更信息添加到项目中,并在角色被请求时读取。但这不是“开箱即用”支持的。

+0

也许我不明白你的做法。这看起来太复杂了。对于我来说,将每个OldValue存储为项目中具有单独角色的单独数据会更容易。这样,我只需要比较和更新任何itemChanged信号的这个值,并获得我需要的所有信息。我只是认为它应该已经在QT中。 – alexkr 2009-08-27 13:39:17

相关问题