2011-04-04 53 views
0

如果你有很多小类(通常是被创建和销毁的),并且它们都依赖于设置,那么你会怎么做?如何使用QSettings?

没有必要将每一个都连接到某种“设置已更改”信号,即使我这样做了,所有设置都会更新,甚至那些设置没有改变的对象也会很好。

回答

1

当面对我自己时,我发现最好从中心位置控制保存/加载设置。您是否真的需要定期保存/加载设置,或者您是否可以在需要完成储蓄时控制主对象(可能包含子对象列表)?或者,最坏的情况是,当对象被创建和销毁时,它们会更新父级集合中的内存中设置映射,并在它认为应该保存时保存,而不是保存子对象。

0

实现它的一种方式如下。

如果您愿意,设置的中心位置可以是从QAbstractItemModel派生的单身人士,您可以根据需要轻松将dataChanged(...)信号连接到各种对象,以接收有关更改设置的通知。这些对象可以决定是否更改适用的设置。通过明智地使用助手和垫片类,你可以很容易地将你的“小班”与通知联系起来。这将解决模型驱动设置方法中固有的两个问题。

  1. 可能为大量用户,对设置的所有收到通知,他们通常不关心(在过滤问题)。

  2. 将用户连接到项目模型所需的额外代码以及关于模型的哪些索引相关的信息的重复(选择问题)。

两个过滤和选择可与由接收所有dataChanged通知的垫片类进行处理,并且为每个有用的索引保持订户的列表。只有“感兴趣的”对象的槽才会被调用。这个类将自己维护用户时隙对的列表,而不提供任何其他用户连接的信号。它会使用invokeMethod或类似的机制来调用插槽。

选择问题可以通过观察订阅者类在初始化时查询影响其操作的所有设置的初始值的模型来处理 - 他们“感兴趣”。您需要的只是您在订户初始化期间创建的临时代理模型。代理模型使用调用方的QObject*实例,并记录查询的所有模型索引(将它们传递到单例设置模型)。当代理模型在订户类的初始化返回时最终被销毁时,它将关于这个QObject的模型索引的信息提供给单例。需要一个额外的电话让单身人员知道要拨打的插槽,但这就像拨打connect()一样。