2013-07-03 25 views
0

我正在編寫一些我沒有寫的代碼,並且對實際操作感到困惑,實質上是使用信號和插槽來完成一切。何時適合使用Qt信號來通信DOWN依賴樹?

我明白使用它們來傳遞UP依賴樹(基本上,用作回調)。例如,如果我們有以下類:

MainWindow - >SomeDialog - >SomeView - >SomeModel

...和SomeModel能夠改變一些共享的應用程序狀態的,它可以發射信號changed()這是連接到一個插槽SomeView,後者又向SomeDialog等發送信號。

這是有價值的,因爲它確保對象與其子之間不存在循環依賴關係; SomeModel不需要知道任何關於SomeView或其父母的信息。

但是你爲什麼要做反向?也就是說,如果我有AnotherDialog,AnotherView,​​,​​需要知道什麼時候狀態在SomeModel改變了,爲什麼我會用信號在下向方向通信呢?信號傳播的路徑最終被:

SomeModel - >SomeView - >SomeDialog - >MainWindow - >AnotherDialog - >AnotherView - >​​

這是難以調試,混淆,和(據我可以說)完全沒有必要。一旦信號傳播到MainWindow,它可以直接調用其實例AnotherDialog上的方法,不需要信號......對吧?

我意識到這個問題可能過於模糊,但我想確保我不會在忽略所有舊代碼之前忽略一些Qt設計原則。

+0

是否有一個原因,你會在每個類中發出一個新的信號,而不是直接將信號從SomeModel連接到AnotherModel? – thuga

+0

@thuga因爲MainWindow不知道SomeModel或AnotherModel;它只是構建了對話框,這反過來又構建了視圖等等。這本身就是一個設計缺陷,但我試圖在這裏一次解決一個問題...... –

+0

那麼,有信號和插槽的原因之一,雖然它不完全涉及這種情況,但如果你有100個對象。因此,不要分別調用每個函數,只需發出一個連接到這些對象的某個插槽的信號即可。除了RA提到的那種線程關聯外,我找不到任何使用信號和槽的原因,而不是直接調用一個函數。也許如果你不想使用全局變量,而是使用局部變量。 – thuga

回答

1

用於使用信號可能是因爲AnotherDialogAnotherView和/或​​具有不同thread affinities(但即使如此,它可能已經優選使用QMetaObject::invokeMethod())的唯一原因。

如果所有這些類都存在於一個線程中,那麼就沒有任何理由使用信號。

這裏似乎還有其他設計缺陷,但看着你的評論,好像你知道它們。

+0

我認爲線程的親和角度,但這些對象都在同一個線程,這是不太可能改變。所以我想我得到了我的答案,謝謝!在我花點時間讓其他人稱重(如果他們想要的話)之後,我會接受它。 –