2010-07-20 35 views
3

我想要一個Qt4(PyQt4)程序中的一個範例,其中一個組件能夠響應信號而不知道它來自哪裏。如何在Qt4中廣播信號

我的初始閱讀表明我必須明確地將信號連接到插槽。但是我想要的是任何一個組件都能夠發送一個信號,並讓它由另一個組件處理。

與其他工具包比較,例如,在wxWidgets中我會使用事件。這些自動從子窗口/對象傳播給父母。在每個級別都可以處理。這意味着如果我有很多可能發出相同事件的孩子,我不必將他們全部連接到處理程序。我可以將處理程序放在父窗口或窗口層次結構中的某個更高級別。這意味着只有事件發生器和消費者需要了解事件。消費者不需要知道事件的來源,有多少這樣的來源,或者其他任何事情。

這是可能的Qt - 有沒有另一種方法?也許有信號和插槽的替代事件機制?

+0

我不確定我是否瞭解你,但你可以將信號連接到信號(所謂的觸發)。或者,也許你想要將很多具有相同信號的對象連接到一個插槽,並獲得關於誰是發件人的信息? – 2010-07-20 10:07:34

+0

我已經添加了一些更多的問題來澄清 – 2010-07-20 19:10:28

+0

如果你想要信號作爲事件行事,爲什麼不使用[events](http://doc.trolltech.com/4.6/eventsandfilters.html)呢? – 2010-07-23 20:02:07

回答

1

這不是一件容易的事 - 你必須知道信號對象和接收對象來連接兩者。然而,取決於你需要什麼,你可能能夠建立一個介於兩者之間的類(所以帶有信號的對象告訴它們存在的類,並且有這樣的信號,而帶有插槽的對象告訴類它們存在並且具有連接到給定信號的這樣一個插槽,並且中介類跟蹤這兩者,必要時進行連接)。

+0

是的..我想我可以創建一個單獨的服務器類作爲連接信號發生器和插槽使用者的「郵箱」。也許這是Qt中此場景的正確設計模式? – 2010-07-20 19:10:57

+0

單身人員的問題在於它在應用程序範圍內。我可能只想響應由對話框的子項或其他容器生成的信號,但不響應應用程序中其他位置的類似對象。如果我嘗試在對話框中應用這種方法,那麼無論是信號發生器都需要知道誰對他們的信號感興趣,或者消費者需要知道何時創建新的信號發生器,以便他們可以連接到它們。其中之一打破了組件模塊化:-( – 2010-07-20 19:38:36

0

難道你只是想要一個很好的老式方法調用?響應只是該方法的返回值。

+0

不,我正在尋找更像是一個廣播事件。我得到的印象是Qt支持面向對象的範式,但不是真正的事件驅動範例 信號和時隙允許比方法調用更寬鬆的耦合 - 信令對象和時隙接收器不需要彼此瞭解,但某個對象需要了解它們兩者,才能連接它們。 – 2010-07-22 02:54:55

+0

我正在尋找的東西更寬鬆 - 沒有任何東西連接事件發生器和消費者,生成器創建一個事件,消費者監聽事件,消費者可以發出信號表明它處理了事件。根據它們在應用程序窗口樹中的位置(即父/子窗口)定義的順序。我認爲Qt不會做這樣的事情嗎? – 2010-07-22 02:55:25

+0

我會說python使函數調用相當寬鬆,但我認爲你的意思是發電機和消費者的自動關聯。在這種情況下,關聯基於父母/子女關係。 另一個想法:在構建時,讓生成器對象(孩子)通過小部件層次結構向上查找消費者。在生成器中存儲ref的消費者,並隨意調用其方法。 – goertzenator 2010-07-27 19:48:33

0

信號處理程序不知道發射器(只有信號類型),發射器不知道處理器連接了什麼。許多處理程序可以連接到相同的信號,並按連接順序執行。信號可以從很多地方發出。