1

如果你有很多小类(经常被创建和销毁),并且它们都依赖于设置,你会怎么做?

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

4

2 回答 2

1

当我自己面对这个问题时,我发现最好从一个中心位置控制保存/加载设置。您是否真的需要定期保存/加载设置,或者当实际需要进行保存时,您是否可以拥有一个主对象(可能带有子对象列表)控制?或者,最坏的情况是,当对象被创建和销毁时,让它们更新父集合中的内存设置映射,并在它认为应该保存时保存,而不是子对象销毁。

于 2011-04-04T22:01:45.350 回答
1

下面给出了一种实现方式。

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

  1. 可能有大量订阅者,他们都会收到关于他们通常不关心的设置的通知(过滤问题)。

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

过滤和选择都可以由接收所有dataChanged通知的 shim 类处理,并且对于每个有用的索引都维护一个订阅者列表。然后只会调用“感兴趣”对象的插槽。此类将自行维护订户-插槽对的列表,而不提供任何信号供其他人连接。它会使用invokeMethod或类似的机制来调用插槽。

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

于 2013-08-21T23:30:50.333 回答