Python 如何在pyqt的QTabWidget中设置ContextMenu?

Python 如何在pyqt的QTabWidget中设置ContextMenu?,python,pyqt5,qtabwidget,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 im

我想在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_())

一些复杂的QWidget可以通过设置备用子Widget进行定制,有时需要使用将添加到其中的父部件初始化这些子部件;一些示例包括QAbstractScrollArea子体(QTextEdit、QGraphicsView等)的滚动条、项目视图的标题、QComboBox的视图,显然还有QTabWidget的选项卡栏

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

这将解决问题:

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)

关于这一点,有一个确切的解释;它仍然被标记为未解决,但我认为这只是因为(正如报告它的用户所说)设置父项解决了问题。

我有点困惑。你在问(至少在标题中)如何设置上下文菜单,但在问题中你问的是完全无关的东西。代码的实际问题是什么?单击鼠标按钮时,我可以看到上下文菜单调用和每个选项卡上的关闭按钮。我设置了TabBar(),但在TabBar上看不到关闭按钮。如果使用默认的QTabar,是否会显示关闭按钮?您使用的是什么操作系统和版本?是的,默认的qtabar是出现的,我使用的是python 3.7、IOS 10.14.5、PyQt5 5.13.1Ok,正如我担心的那样。在MacOs上设置自定义QTabar时,我遇到了类似的问题(但我希望在最新的PyQt5版本中解决了这个问题):似乎在设置自定义选项卡栏时,不会再次创建关闭按钮。不幸的是,我无法在MacOs上测试PyQt5,但我相信解决方案可能是相同的。我会在接下来的几个小时内发布一个可能的答案,关注你的通知。