【发布时间】: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