PySide6 Закрытие вкладки на среднюю кнопку мыши

Рейтинг: 2Ответов: 1Опубликовано: 15.01.2023

Необходимо, чтобы вкладки закрывались не только по кнопке, но и при клике на вкладку средней кнопкой мыши.


Screenshot


from PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QTabWidget
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("TabWidget")

        self.tabWidget = QTabWidget()
        self.tabWidget.setTabsClosable(True)
        self.tabWidget.tabCloseRequested.connect(self.close_tab)
        self.tabWidget.addTab(QLabel('widget 1'), 'tab 1')
        self.tabWidget.addTab(QLabel('widget 2'), 'tab 2')
        self.tabWidget.addTab(QLabel('widget 3'), 'tab 3')
        self.setCentralWidget(self.tabWidget)

    def close_tab(self, index):
        self.tabWidget.widget(index).deleteLater()
        self.tabWidget.removeTab(index)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(640, 480)
    window.show()
    app.exec()

Ответы

▲ 0Принят

Как вариант, пробуйте:

import sys
'''
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QTabWidget
'''
from PyQt5.Qt import *


class TabBar(QTabBar):                                               # !!!
    mousePressSignal = pyqtSignal(int)                               # !!! PyQt5
#    mousePressSignal = Signal(int)                                  # !!! PySide6

    def __init__(self, *args, **kwargs):
        super(TabBar, self).__init__(*args, **kwargs)    
    
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            super(TabBar, self).mousePressEvent(event)
        elif event.button() == Qt.MiddleButton:                      # !!!
            #int QTabBar::tabAt(const QPoint &position) const
            position = self.tabAt(event.pos())                       
            self.mousePressSignal.emit(position)                     # !!!
        

class TabWidget(QTabWidget):                                         # !!!
    def __init__(self, *args, **kwargs):
        super(TabWidget, self).__init__(*args, **kwargs)
        self.tabBar = TabBar(self)                                   # !!!
        self.setTabBar(self.tabBar) 


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("TabWidget")

        self.tabWidget = TabWidget()    
        self.tabWidget.setTabsClosable(True)
        self.tabWidget.tabCloseRequested.connect(self.close_tab)
        
        self.tabWidget.addTab(QLabel('Widget 1'), 'Tab 1')
        self.tabWidget.addTab(QLabel('Widget 2'), 'Tab 2')
        self.tabWidget.addTab(QLabel('Widget 3'), 'Tab 3')
        
        self.tabWidget.tabBar.mousePressSignal.connect(self.close_tab) # !!!
        
        self.setCentralWidget(self.tabWidget)

    def close_tab(self, index):
        self.tabWidget.widget(index).deleteLater()
        self.tabWidget.removeTab(index)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec())

введите сюда описание изображения