我应该使用多个角色还是一个角色,将实际属性推迟到将数据包装/公开为其属性的QObject



是一个具有特定角色的QAbstractListModel实现

name, image, enabled, color, editable

比只有一个角色的实现更好(请原谅我没能想出一个更好的名字)

thing

导致返回具有上述CCD_ 3s的CCD_?

QML方面的差异将是访问委托中的值时额外的"间接":

model.thing.name

model.name

我倾向于QObject方法,因为它将数据视图从列表模型中分离出来,并且具有重用的潜力。它也不需要您也实现setData函数。据我所知,"多角色"选项没有特定的pro,当然,除非不可能正确定义一个适当的QObject子类来包装数据(因为例如,它在概念上对特定情况没有什么意义)。

当您想将模型与依赖角色的功能一起使用时,在模型中拥有角色是很有帮助的。

例如,您想将模型提供给ComboBox,如果它有角色,您只需将textRole指定给ComboBox,它就会完成自己的任务。如果使用单个对象角色,则必须修改委托以显示正确的对象属性。如果您想利用ListView的分区功能,还需要角色。

就像@derm所说的,QSortFilterProxyModel也很有用(无耻的插件:如果你的模型有角色,用我的SortFilterProxyModel库过滤或排序非常容易)。

你提到了可重用性和必须重新实现的东西。这是一个很好的观点,但拥有一个具有基于QObject属性的角色的通用模型是完全可行的。事实上,它已经完成了,并且在这里有一个非常允许的许可证:Thomas Boutroue的QQmlObjectListModel。从c++来看,它具有与QList相同的API,但它公开了QML可用的QAbstractListModel。角色基于对象的属性,当发出通知信号时,它会发出相应的dataChanged信号。CCD_ 17和好友也被自动处理。

话虽如此,但我认为做一个具有单个对象角色的模型没有多大意义。如果你想要一个带有rowsInserted/rowRemoved信号的正确模型(而且你应该,除非你只有一个静态模型,在这种情况下,一个QObject*0或QObjectList就足够了),你无论如何都必须自己实现它,而你只需要使用QQmlObjectListModel就可以了

使用角色意味着您必须坚持预定义的模型模式。

如果对象级别较低,则角色是好的,因此可以将各种对象成员公开为角色。

但在QObject *模型的情况下,这是完全没有必要的。您已经在使用Qt的元对象系统,它可以与QML引擎一起促进相同的功能。。

只要这些属性得到了正确的实现并具有通知信号,它们都将在QML中无缝工作。

它也节省了大量时间,因为模型是通用的,您可以用QML中定义的对象填充它,而不必重新编译C++代码,也不必为每个模型都有一个专用的模型。

请记住,QObject相当大,如果您有模型项目的分数,则会带来显著的开销。如果你的模型很大,或者你正在处理一个已经存在的数据集,而该数据集不能作为现成的QObject*来使用,那么用角色之类的东西来实现"经典"模型会更有效。

只要你不遇到它的局限性,我认为单角色QObject*模型是更简单、更容易、更快、更灵活、更优雅的解决方案。

至于上面提到的排序和过滤问题,股票解决方案显然不会解决这个问题。正如这里提到的,可以实现排序和过滤,它采用JS函数,你可以在其中运行你的自定义逻辑,我敢说,这实际上比基于股票角色的功能更好。同样,您可以在不重新编译的情况下获得新代码,甚至可以通过运行时生成的函数来驱动它。

是的,你应该这样做

使用角色的最根本原因是:这是编写模型的Qt方式

好吧,这个原因并没有什么真正重要的——除非有一些事情希望你按照Qt的方式去做。。。

因此,您应该实现角色是有原因的,但这并不意味着,您必须在QML和中使用它们,这取决于您计划对模型做什么,这是不必要的。

在我看来,最重要的原因是,您必须实现dataChanged-信号。如果你不这样做,你的模型价值相当于QVariantList

对象属性的更改只会反映在生成的委托中,但依赖dataChanged信号的对象不会收到更新,除非在对象的属性发生更改时为对象角色触发它
另一方面,这将对委托产生很大影响,因为必须重新评估所有绑定。

Q_PROPERTY0-为例,如果您没有dataChanged-信号,则它不会更新过滤器或排序,如果值发生了更改,因为它正在侦听dataChanged-信号。

特别是,我不知道还有什么其他情况会使用Qt库中的那个,但可能还有其他情况。

然而,只要你不打算使用任何这些——你就不需要发射dataChanged-信号。

我不知道你是否真的需要为此实现角色。我没有尝试过在没有角色的情况下实现dataChanged信号。

使用dataChanged信号的QSortFilterProxyModel代码


当您不使用任何依赖于正确实现的角色的东西,或者重新实现了依赖于您自己的角色的功能时,您不需要

相关内容

  • 没有找到相关文章

最新更新