我想检测鼠标中键在QTabWidget上的点击。我原以为QWidget上会有一个与鼠标事件相关的信号,但我看到的都是方法。
为了做我想做的事情,我需要子类化QTabWidget然后重写上述方法吗?还是我遗漏了什么?
发布于 2012-02-26 00:01:20
您可以在QTabBar (由QTabWidget.tabBar()返回)上安装事件筛选器以接收和处理按下和释放事件,也可以通过子类QTabBar来重新定义mousePressEvent和mouseReleaseEvent,并将QTabWidget的QTabBar替换为QTabWidget.setTabBar()。
使用事件过滤器的
self.tabWidget.tabBar().installEventFilter(self) MainWindow(QMainWindow):def __init__(self):QMainWindow(QMainWindow,self).__init__() self.tabWidget = QTabWidget(self) self.setCentralWidget(self.tabWidget) MainWindow self.tabWidget.tabBar().previousMiddleIndex = -1 def eventFilter(self,object,事件):如果QEvent.MouseButtonPress中的object == self.tabWidget.tabBar()和\ event.type(),QEvent.MouseButtonRelease和\ event.button() == Qt.MidButton: tabIndex = object.tabAt(event.pos()) if event.type() == QEvent.MouseButtonPress: object.previousMiddleIndex = tabIndex else: if tabIndex != -1和tabIndex == object.previousMiddleIndex:self.onTabMiddleClick(tabIndex) object.previousMiddleIndex = -1 return True return False #使用单击的选项卡定义onTabMiddleClick的索引调用的函数(自身,索引):使用QTabBar子类传递
类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)类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) #使用单击的选项卡的索引调用的函数def onTabMiddleClick(self,self.tabWidget.setTabBar):传递
(如果您想知道为什么这么简单的任务有这么多代码,单击被定义为在大致相同的位置按下事件和释放事件,因此按下的制表符的索引必须与释放的制表符相同)。
https://stackoverflow.com/questions/9442165
复制相似问题