2013-06-05 48 views
0

在QWidget中,鼠標和繪畫以及其他事件都是虛擬函數而不是信號,因此它們將被重載。爲什麼會出現這種情況,而不是一致?爲什麼Qt有時會使用虛擬函數代替信號?

+0

所以,當你使用'QWidget'作爲基類時,你可以定義自己的'paintEvent'函數嗎? –

+0

當然,但不能通過與畫家提供連接插槽的信號來實現嗎?我唯一能想到的就是paintEvent需要在eventLoop的特定時間被調用,但我不明白這是如何應用於mouseEvent或其他類似事件的。 –

回答

2

雖然我無法找到Qt的文件,指出他們的動機,使用虛函數的事件中任何東西,我可以猜到:

  1. 信號和槽可以很好的工作,但有間接關聯他們(見this question的答案)。由於事件頻繁觸發,信號和時隙的使用可能會帶來相當的性能損失。
  2. 某些事件處理程序需要返回值。從插槽返回值返回到信號發射器不是正式支持(雖然見this question),這意味着它們將不合適。
  3. QWidget發出的信號從設計的角度來看可能沒有意義。如果我從QWidget創建自己的小部件,爲什麼從我的小部件發出的信號只是連接回小部件本身的插槽?這也有破壞封裝的危險,因爲信號總是「公開」的。

即使以上都不是這樣,但嘗試使用事件信號仍然會引發很多體系結構問題。例如,單個事件通常會傳遞給多個不同的對象(例如,在某些對象不希望處理事件的情況下)。在這種情況下,哪個對象發出指示事件發生的信號?它肯定不是事件的目標(即上面暗示的小部件)。它必須是其他一些全球性的對象。但是如果這是真的,我們可能會在每個小部件上實施虛擬插槽來處理信號。這實質上只是讓我們回到我們開始使用虛擬功能的地方!

相關問題