def eventFilter(self, obj, event): if obj == self.tabBar(): if event.type() == QEvent.MouseButtonPress and event.buttons( ) == Qt.LeftButton: # can start tab drag only if mouse is at some tab, not at empty tabbar space if self.tabBar().tabAt(event.pos()) >= 0: self.tabDragCanStart = True else: self.dragCanStart = True elif event.type() == QEvent.MouseButtonRelease: self.tabDragCanStart = False self.dragCanStart = False self.manager.updateDragPosition() elif event.type() == QEvent.MouseMove: self.manager.updateDragPosition() if self.tabDragCanStart: if self.tabBar().rect().contains(event.pos()): return False if event.buttons() != Qt.LeftButton: return False toolWindow = self.currentWidget() if not (toolWindow and self.manager.hasToolWindow(toolWindow)): return False self.tabDragCanStart = False #stop internal tab drag in QTabBar releaseEvent = QtGui.QMouseEvent(QEvent.MouseButtonRelease, event.pos(), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) QApplication.sendEvent(self.tabBar(), releaseEvent) self.manager.startDrag([toolWindow]) elif self.dragCanStart: self.check_mouse_move(event) return QTabWidget.eventFilter(self, obj, event)