2011-04-04 52 views
0

如果你有很多小類(通常是被創建和銷燬的),並且它們都依賴於設置,那麼你會怎麼做?如何使用QSettings?

沒有必要將每一個都連接到某種「設置已更改」信號,即使我這樣做了,所有設置都會更新,甚至那些設置沒有改變的對象也會很好。

回答

1

當面對我自己時,我發現最好從中心位置控制保存/加載設置。您是否真的需要定期保存/加載設置,或者您是否可以在需要完成儲蓄時控制主對象(可能包含子對象列表)?或者,最壞的情況是,當對象被創建和銷燬時,它們會更新父級集合中的內存中設置映射,並在它認爲應該保存時保存,而不是保存子對象。

0

實現它的一種方式如下。

如果您願意,設置的中心位置可以是從QAbstractItemModel派生的單身人士,您可以根據需要輕鬆將dataChanged(...)信號連接到各種對象,以接收有關更改設置的通知。這些對象可以決定是否更改適用的設置。通過明智地使用助手和墊片類,你可以很容易地將你的「小班」與通知聯繫起來。這將解決模型驅動設置方法中固有的兩個問題。

  1. 可能爲大量用戶,對設置的所有收到通知,他們通常不關心(在過濾問題)。

  2. 將用戶連接到項目模型所需的額外代碼以及關於模型的哪些索引相關的信息的重複(選擇問題)。

兩個過濾和選擇可與由接收所有dataChanged通知的墊片類進行處理,並且爲每個有用的索引保持訂戶的列表。只有「感興趣的」對象的槽纔會被調用。這個類將自己維護用戶時隙對的列表,而不提供任何其他用戶連接的信號。它會使用invokeMethod或類似的機制來調用插槽。

選擇問題可以通過觀察訂閱者類在初始化時查詢影響其操作的所有設置的初始值的模型來處理 - 他們「感興趣」。您需要的只是您在訂戶初始化期間創建的臨時代理模型。代理模型使用調用方的QObject*實例,並記錄查詢的所有模型索引(將它們傳遞到單例設置模型)。當代理模型在訂戶類的初始化返回時最終被銷燬時,它將關於這個QObject的模型索引的信息提供給單例。需要一個額外的電話讓單身人員知道要撥打的插槽,但這就像撥打connect()一樣。