2011-12-24 84 views
7

我最近遇到了一個問題,這是由於某些行爲取決於特定對象中的信號插槽連接順序而導致的。這是我的一個設計缺陷(連接總是意味着動態,所以這個缺陷是不可避免的),但它讓我思考。更改信號插槽連接順序

是否可以重新排序對象中的信號插槽連接? 和/或在創建連接時指定連接的「索引」?

我明白,你可以摧毀所有的連接和新秩序重建他們模擬這種效果,但是這不是我問。我無法在API或一般文檔中找到任何內容,所以我懷疑答案是否定的,但我認爲我應該問不管怎樣...

回答

10

seemed to be the past understanding相反,我很驚訝地看到更新(在至少在最近的版本)的Qt沒有離開槽的調用順序爲未定義:

如果幾個時隙被連接到一個信號,該時隙將被執行的一個前一後,他們的順序已經被連接,當信號被髮射時。

http://doc.qt.io/qt-4.8/signalsandslots.html#signals

(雖然可能有人會說那一個文檔中的一個句子是不夠的,代表所有Qt 4.x的版本的過去和未來「強」的保證。)

似乎沒有重新排序信號和插槽的API。即使有,我覺得依靠訂單不是一個好主意。我建議重新考慮設計。

你可能會研究的一件事是讓你的老虎機排隊而不是直接採取行動。然後,當所有插槽都被調用時,您會處理該隊列......考慮一些優先級屬性。

+0

同意。就像我在我的問題中提到的那樣,我認識到這是設計缺陷,但API開發人員應該給我們提供我們需要的一切以擺脫困境,無論它是否優雅。我原以爲這將是一個明顯的例子,但根據在互聯網上甚至沒有查詢它的情況來判斷,顯示我在那裏顯然是錯誤的! – cmannett85 2011-12-24 15:33:45

+0

正如有兩種政治自由(「自由」和「自由」),API設計有兩種強大的功能。在這種情況下,我認爲沒有提供重新排列信號的能力是很好的,它似乎與聲稱有合同訂單不一致。 *聳肩* http://hostilefork.com/2005/07/04/freedom-to-and-freedom-from/ – HostileFork 2011-12-24 15:54:23

0

QObject內部將連接存儲爲列表。使用<private/qobject_p.h>標頭獲取發件人連接列表上的鎖定並對其條目重新排序很簡單。一個公共API會在每個主要Qt修訂期間修正這個細節,這被認爲是太有限了。