【问题标题】:How to set ContextMenu in QTabWidget for pyqt?如何在 QTabWidget 中为 pyqt 设置 ContextMenu?
【发布时间】:2019-11-25 19:51:22
【问题描述】:

我想在QTabWidget上面设置Context Menu,所以继承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_())

【问题讨论】:

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

标签: python pyqt5 qtabwidget


【解决方案1】:

一些复杂的 QWidgets 可以通过设置备用子控件来定制,有时需要将这些子控件初始化为它们将被添加到的父控件;一些示例包括 QAbstractScrollArea 后代的滚动条(QTextEdit、QGraphicsView 等)、项目视图的标题、QComboBox 的视图,显然还有 QTabWidget 的标签栏。

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

这将解决问题:

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 正是关于这个的;它仍被标记为未解决,但我认为这只是因为(正如用户报告它所说)设置父母解决了问题。

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多