QTabWidget的PyQt鼠标事件

时间:2012-02-25 07:24:09

标签: python pyqt qtabwidget

我想在QTabWidget上检测鼠标中键。我期待在QWidget上有一个鼠标事件相关的信号,但我所看到的只是方法。

我是否需要继承QTabWidget,然后覆盖所述方法以实现我想要的,或者我错过了什么?

1 个答案:

答案 0 :(得分:8)

您可以在QTabBar上安装事件过滤器(由QTabWidget.tabBar()返回)以接收和处理新闻和发布事件,或者子类QTabBar重新定义mousePressEventmouseReleaseEvent并将QTabBar的{​​{1}}替换为QTabWidget

  1. 使用事件过滤器的示例:

    QTabWidget.setTabBar()
  2. 使用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
    
  3. (如果你想知道为什么这么简单的任务有这么多的代码,点击被定义为一个按下事件,后面跟着一个大致相同点的发布事件,所以按下的标签的索引必须是与发布的标签相同)。