События мыши PyQt для QTabWidget - PullRequest
5 голосов
/ 25 февраля 2012

Я хочу обнаружить средние щелчки мышью на QTabWidget. Я ожидал, что в QWidget будет сигнал, связанный с событием мыши, но я вижу только методы.

Нужно ли создавать подкласс QTabWidget и затем переопределять указанные методы, чтобы делать то, что я хочу, или я что-то упустил?

1 Ответ

8 голосов
/ 25 февраля 2012

Вы можете установить фильтр событий на QTabBar (возвращаемый QTabWidget.tabBar()), чтобы получать и обрабатывать события нажатия и отпускания, или подкласс QTabBar, чтобы переопределить mousePressEvent и mouseReleaseEvent и заменить QTabBar из QTabWidget с QTabWidget.setTabBar().

  1. Пример использования фильтра событий:

    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. Пример использования подкласса QTabBar:

    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
    

(Если вам интересно, почему для такой простой задачи так много кода, щелчок определяется как событие нажатия, за которым следует событие выпуска примерно в том же месте, поэтому индекс нажатой вкладки должен быть так же, как выпущенная вкладка).

...