如何在pyqt的QTabWidget中设置ContextMenu?

时间:2019-11-15 04:57:12

标签: python pyqt5 qtabwidget

我想在QTabWidget上方设置上下文菜单,因此我继承了QTabBar以覆盖mousePressEvent函数,然后在QTabWidget中设置setTabBar(),虽然可以实现,但是self.setTabsClosable(True)方法似乎可以无效,在TabBar上看不到“ Tab Closed”按钮。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtCore import Qt


class TabBar(QTabBar):
    middleClicked = pyqtSignal(int)

    def __init__(self):
        super(QTabBar, self).__init__()
        self.previousMiddleIndex = -1
        # self.setTabsClosable(True)

    def mousePressEvent(self, mouseEvent):
        if mouseEvent.button() == Qt.RightButton:
            print("Context_menu is OK.")
        QTabBar.mousePressEvent(self, mouseEvent)


class TabDemo(QTabWidget):
    def __init__(self, parent=None):
        super(TabDemo, self).__init__(parent)
        self.tbar = TabBar()
        self.setTabBar(self.tbar)
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.addTab(self.tab1, "Tab 1")
        self.addTab(self.tab2, "Tab 2")
        self.tab1UI()
        self.tab2UI()
        self.setWindowTitle("Tab case")
        self.setDocumentMode(True)
        self.setTabsClosable(True)

    def tab1UI(self):
        layout = QFormLayout()
        layout.addRow("name", QLineEdit())
        self.setTabText(0, "contact")
        self.tab1.setLayout(layout)

    def tab2UI(self):
        layout = QFormLayout()
        sex = QHBoxLayout()
        sex.addWidget(QRadioButton("man"))
        sex.addWidget(QRadioButton("woman"))
        self.tab2.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = TabDemo()
    demo.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

某些复杂的QWidget可以通过设置备用子Widget来定制,有时需要将这些子代与将添加到其上的父代进行初始化。一些示例包括QAbstractScrollArea后代的滚动条(QTextEdit,QGraphicsView等),项目视图的标题,QComboBox的视图以及QTabWidget的选项卡栏。

尽管在大多数情况下不是强制性的,但最好记住这一点,因为某些特定(在某些情况下取决于平台)的配置会根据将成为其父项的状态自动添加到子窗口小部件中。
为QTabWidget设置备用QTabBar就是这种情况,特别是在MacO上(我想这是由于一些平台问题,有关如何在该平台上处理选项卡小部件)。

这将解决问题:

class TabBar(QTabBar):
    def __init__(self, parent=None):
        super(QTabBar, self).__init__(parent)

class TabDemo(QTabWidget):
    def __init__(self, parent=None):
        super(TabDemo, self).__init__(parent)
        self.tbar = TabBar(self)
        self.setTabBar(self.tbar)
        self.setDocumentMode(True)
        self.setTabsClosable(True)

有一个reported bug与此有关;它仍然被标记为未解决,但是我认为这仅仅是因为(如用户报告的那样)设置父级可以解决该问题。