2012-02-25 117 views
4

我想檢測QTabWidget上的鼠標中點擊。我期待在QWidget上有一個與鼠標事件相關的信號,但我所看到的只是方法。用於QTabWidget的PyQt鼠標事件

我是否需要子類化QTabWidget,然後重寫所說的方法才能做我想做的事情,還是我錯過了什麼?

回答

7

您可以安裝在QTabBar事件過濾器(由QTabWidget.tabBar()返回)來接收和處理按下和釋放事件,或子類QTabBar重新定義mousePressEventmouseReleaseEventQTabWidget.setTabBar()更換QTabWidgetQTabBar。使用事件過濾器

  1. 示例:使用QTabBar子

    class MainWindow(QMainWindow): 
        def __init__(self): 
         super(QMainWindow,self).__init__() 
         self.tabWidget = QTabWidget(self) 
         self.setCentralWidget(self.tabWidget) 
         self.tabWidget.tabBar().installEventFilter(self) 
         self.tabWidget.tabBar().previousMiddleIndex = -1   
    
        def eventFilter(self, object, event): 
         if object == self.tabWidget.tabBar() and \ 
          event.type() in [QEvent.MouseButtonPress, 
              QEvent.MouseButtonRelease] and \ 
          event.button() == Qt.MidButton: 
          tabIndex = object.tabAt(event.pos()) 
          if event.type() == QEvent.MouseButtonPress: 
           object.previousMiddleIndex = tabIndex 
          else: 
           if tabIndex != -1 and tabIndex == object.previousMiddleIndex: 
            self.onTabMiddleClick(tabIndex)      
           object.previousMiddleIndex = -1       
          return True    
         return False 
    
        # function called with the index of the clicked Tab 
        def onTabMiddleClick(self, index): 
         pass 
    
  2. 例子:

    class TabBar(QTabBar): 
        middleClicked = pyqtSignal(int) 
    
        def __init__(self): 
         super(QTabBar, self).__init__() 
         self.previousMiddleIndex = -1 
    
        def mousePressEvent(self, mouseEvent): 
         if mouseEvent.button() == Qt.MidButton: 
          self.previousIndex = self.tabAt(mouseEvent.pos()) 
         QTabBar.mousePressEvent(self, mouseEvent) 
    
        def mouseReleaseEvent(self, mouseEvent): 
         if mouseEvent.button() == Qt.MidButton and \ 
          self.previousIndex == self.tabAt(mouseEvent.pos()): 
          self.middleClicked.emit(self.previousIndex) 
         self.previousIndex = -1 
         QTabBar.mouseReleaseEvent(self, mouseEvent) 
    
    
    class MainWindow(QMainWindow): 
        def __init__(self): 
         super(QMainWindow,self).__init__() 
         self.tabWidget = QTabWidget(self) 
         self.setCentralWidget(self.tabWidget) 
    
         self.tabBar = TabBar() 
         self.tabWidget.setTabBar(self.tabBar) 
         self.tabBar.middleClicked.connect(self.onTabMiddleClick) 
    
        # function called with the index of the clicked Tab 
        def onTabMiddleClick(self, index): 
         pass 
    

(如果你想知道爲什麼有這麼多的代碼,例如一個簡單的任務,點擊被定義爲新聞事件,然後在大致相同的地點發布事件,所以新聞的索引d選項卡必須與發佈的選項卡相同)。

+0

+1顯示如何實際複製按下和釋放點擊信號。如果您沒有使用新舊標籤索引來確定點擊是否有效,那麼一般方法也是使用舊點和新點的一半長度來確定它是否在一個可接受的範圍內,將其稱爲點擊: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qpoint.html#manhattanLength – jdi 2012-02-25 17:36:42

+0

正是我期待的那種答案。沒有意識到事件過濾器。感謝您提供這樣詳細而且解釋清楚的回覆。 – Mathieson 2012-02-25 22:00:21

+0

@Mathieson:如果你喜歡,你應該接受他的答案。 – jdi 2012-02-29 02:43:14