繁体   English   中英

QTabWidget的PyQt鼠标事件

[英]PyQt mouse events for QTabWidget

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

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

您可以在QTabBar上安装事件过滤器(由QTabWidget.tabBar()返回)以接收和处理按下和释放事件,或者将mousePressEvent子类QTabBar重新定义mousePressEventmouseReleaseEvent并用QTabWidget.setTabBar()替换QTabBarQTabWidget

  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 

(如果你想知道为什么这么简单的任务有这么多的代码,点击被定义为一个按下事件,后面跟着一个大致相同点的发布事件,所以被按下的标签的索引必须与发布标签)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM