我想在QTabWidget上检测鼠标中键。我期待在QWidget上有一个鼠标事件相关的信号,但我所看到的只是方法。
我是否需要继承QTabWidget,然后覆盖所述方法以实现我想要的,或者我错过了什么?
答案 0 :(得分:8)
您可以在QTabBar
上安装事件过滤器(由QTabWidget.tabBar()
返回)以接收和处理新闻和发布事件,或者子类QTabBar
重新定义mousePressEvent
和mouseReleaseEvent
并将QTabBar
的{{1}}替换为QTabWidget
。
使用事件过滤器的示例:
QTabWidget.setTabBar()
使用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
(如果你想知道为什么这么简单的任务有这么多的代码,点击被定义为一个按下事件,后面跟着一个大致相同点的发布事件,所以按下的标签的索引必须是与发布的标签相同)。