2014-01-27 45 views
2

PySide和PyQt採用Qt信號插槽機制,通過這種機制,我們可以將任何/多個信號連接到任何/多個插槽,只要散佈的數據類型匹配。從信號中斷開插槽

信令對象具有接收時隙的一些知識,例如,通過方法receivers知道他們的號碼,或者信號可以通過其disconnect方法與接收插槽斷開。

我的問題與反方向有關 - 例如,插槽是否知道它連接了哪些信號?插槽能否與信號斷開?

更新:那麼爲什麼我問這個 - 我有一個對象執行一些計算。計算由用戶可編輯的Python表達式定義。表達式被解析並且必要的數據源從這個中被識別...計算對象(充當槽)然後連接到這些數據源(它們充當信號),並且一旦數據源產生/更新值,這個事實是用信號通知該插槽並重新評估表達式。當用戶更改表達式時,需要再次解析並從現有信號(即數據源)斷開連接並連接到新的數據源。你可以想象它就像Excel中連接到其他單元格的公式一樣。

我知道有幾種方法可以解決這個問題,例如手動跟蹤連接(當然,這是額外的工作),或刪除表達式對象並在每次更改時創建一個新連接(似乎還不夠好,因爲用戶可能想要追溯計算數據源,這不會有幫助) 。但我很好奇,如果這可以純粹使用簡單的信號插槽機制解決。換句話說,我對任何解決方法都不感興趣......我知道他們,並會使用他們我信號插槽在這裏沒有幫助。 :)

+0

我不這麼認爲。但是,您可以手動跟蹤連接和斷開連接(例如,使用'QObject :: connect'的包裝器)。 –

+0

我認爲必須有一些東西,因爲當一個接收對象被刪除時,必須通知它的一個接收器已經死了以停止發送信號給它。但是我還沒有在文檔中找到任何內容....當然,手動保持軌道是我的另一種選擇。但是,如果Qt能夠自動爲我執行此操作,我希望避免雙重工作。 –

+0

我認爲你問的是錯誤的問題。請解釋你想要解決什麼問題,不要問如何解決你對某個神祕問題的解決方案。尋求幫助時這是很常見的錯誤。爲什麼你需要知道插槽連接的位置?也許在這種情況下,您需要暫時斷開連接信號來防止遞歸?爲了防止可能的遞歸,有'blockSignals'方法。 –

回答

2

您提出的方法強制具體數據小部件和計算引擎之間非常密切的關係。您將UI與計算混合在一起。這使得它比它需要更難。

您可以嘗試的是模型視圖方法。該模型將是一個簡單的實現QAbstractTableModel。該視圖將使用QDataWidgetMapper映射到模型單元格的單個數據輸入小部件。計算引擎只會訪問模型,完全不知道模型如何被小部件修改。這使得生活更輕鬆。

計算對象可以使用一個dataChanged信號連接到模型,並且會通知任何變量的變化。您可以通過在表格中包含兩列來輕鬆傳遞值和變量名稱。

該模型的實現可以非常簡單,您可以在第一列中包含變量名稱的字符串列表,以及第二列中的變量列表。當然,只要調用setData,模型就必須正確地發出dataChanged信號。

+0

我認爲這是一個總的矯枉過正。 :)我提到了更簡單的解決方法。順便說一句。我沒有說任何關於用戶界面,小部件等的信號/插槽機制綁定到QObject,而不僅僅是QWidget。我的小工具在另一個層面,我甚至沒有在我的問題中觸及。 –

+0

@ VL.K。您已經問過如何將數據源乾淨地映射到計算引擎。我已經向你展示了它是如何完成的。它工作的很好,我廣泛使用這種方法,並且很容易處理。它可能比任何其他解決方案的代碼少,維護也容易得多。軟件元素之間的鬆散耦合被認爲是一個良好的工程實踐 –

+0

@ VL.K。這些小部件是可選的,不管修改數據是什麼。交易是你不需要讓計算引擎處理大量的依賴於變量的連接。這是糟糕的設計。使用數據模型時,dataChanged只有一個信號插槽連接,並且您的引擎只需要持有指向模型的指針。計算引擎更容易。對模型內容進行故障診斷也很容易:只需將其附加到「QTableView」。 –