2010-02-03 31 views
4

我正在創建一個小型PyQt應用程序,並陷入了MouseOver效應。QPushButton FocusIn生成哪個信號?

我有一個QMainWindow它有三個按鈕名爲createProfileButton,downloadPackagesButtoninstallPackagesButton。所有這些都是類型QPushButton

現在我創建了一個標籤,當有人將鼠標懸停在這些按鈕上時,該標籤將保存文本。我查了一下資料,來到知道它可以處理使用過騎

  • focusInEvent(個體經營,QFocusEvent)
  • focusOutEvent(個體經營,QFocusEvent)按鈕

方法。現在這意味着我必須爲這三個按鈕中的每一個擴展QPushButton,並且它們中的每一個都必須爲一個類的對象。我試圖尋找鼠標懸停或從按鈕上移開時發出的信號,但徒勞無功。我在網上獲得的所有幫助都是爲了實現這兩種方法。

Isnt是否擴展了一個類並創建了其中的一個過度殺傷?信號很整潔,不幸的是,我找不到任何信號。

所以我檢查了整個繼承層次,並沒有發現信號爲FocusInFocusOut

回答

4

如您所述,此功能不存在任何信號。你有兩個基本選項。

選項1 - 類別:

class FocusEmittingButton(QPushButton): 
    #... 
    def focusInEvent(self, event): 
     # emit your signal 

然後,您可以連接到您的客戶端代碼信號。另外,如有必要,您可以使用設計師的Promote To功能將每個按鈕升級到FocusEmittingButton類型。你只需要一次子類,然後確保不同的按鈕都是相同的類型。

選項2 - 使用QApplication.focusChanged

您還可以利用QApplication.focusChanged(oldQWidget, newQWidget)。通過這樣做,您不需要繼承並覆蓋焦點事件。而是連接到QApplication.focusChanged信號,然後在處理程序中響應。

+0

我的意思是說,這是我可以添加焦點事件的唯一方法。我再次說過我想使用信號而不是事件方法。我不想爲每個按鈕分類一個類。 – 2010-02-03 18:47:52

+0

當你自己聲明沒有焦點的信號時,你必須繼承QPushButton(一次不是每個實例一次)以在焦點發送信號時發送信號,或者如Kaleb所說的使用QApplication.focusChanged。 – 2010-02-03 19:07:15

+0

@Manish - 我明白你的意思了。我編輯了我的答案,以澄清你將如何子類化。如果選項2不夠清楚,請告訴我。 – 2010-02-03 19:42:42

1

還有一種方法可以在父窗口小部件中接收焦點信號。您可以添加一個事件過濾器:

class MyParent(QWidget): 
    def __init__(self): 
     #... 
     self.mybutton.installEventFilter() 

    def eventFilter(self, obj, event): 
     if obj is self.mybutton and event.type() == QEvent.FocusOut: 
      #... 
     return QWidget.eventFilter(self, obj, event)