我想在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_())
答案 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与此有关;它仍然被标记为未解决,但是我认为这仅仅是因为(如用户报告的那样)设置父级可以解决该问题。