选项组合(QTabWidget)

选项组合 — QTabWidget
python import sys from PyQt6.QtWidgets import QMainWindow, QApplication, QWidget, QTabWidget from PyQt6.QtGui import QIcon, QAction from PyQt6.QtCore import Qt, QSize class QWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.tab1 = QWidget() self.tab2 = QWidget() self.tab3 = QWidget() # 创建一个选项卡组合 self.tabs = QTabWidget() # 设置选项卡标签位置 self.tabs.setTabPosition(QTabWidget.TabPosition.West) # QTabWidget.TabPosition.North 选项卡在页面顶部 # QTabWidget.TabPosition.South 选项卡在页面底部 # QTabWidget.TabPosition.West 选项卡在页面左侧 # QTabWidget.TabPosition.East 选项卡在页面右侧 # 可通过 self.tabs.tabPosition() 获取当前选项卡位置 # 设置选项卡标签形状 self.tabs.setTabShape(QTabWidget.TabShape.Triangular) # QTabWidget.TabShape.Triangular 选项卡为三角形 # QTabWidget.TabShape.Rounded 选项卡为圆角(缺省值) # 设置所有选项卡关闭按钮(缺省值为 False) self.tabs.setTabsClosable(False) # 设置选项卡是否使用滚动按钮(缺省值为 True) self.tabs.setUsesScrollButtons(False) # 可通过 self.tabs.usesScrollButtons() 返回是否使用滚动按钮 # 选项卡设置 # 选项卡组件中添加选项卡 self.tabs.addTab(self.tab1,'第一页') self.tabs.addTab(self.tab2,'第二页') # 最后一参数为选项卡标签,也可用 label # 选项卡组件中插入新选项卡(选项卡组件索引都是从 0 开始) self.tabs.insertTab(2,self.tab3,'WoooooooooooooooooooooooW') # 选项卡设置标签 self.tabs.setTabText(0,'就给改了') # 选项卡设置图标 self.tabs.setTabIcon(0,QIcon('image\exit.png')) # 选项卡设置气泡 self.tabs.setTabToolTip(0,'牛啊') # 返回选项卡数量 print(self.tabs.count()) # 设置当前展示的选项卡(索引从 0 开始,缺省值为 0) self.tabs.setCurrentIndex(2) # 可通过 self.tabs.currentIndex() 返回当前战士的选项卡索引 # 删除选项卡 self.tabs.removeTab(1) # 选项卡设置为不可选 self.tabs.setTabEnabled(1,False) # 客通过 self.tabs.isTabEnabled(1) 判断索引处选项卡是否可选 # 选项卡信号 # 切换选项卡信号(信号:int 索引) self.tabs.currentChanged.connect(self._print) # 单机选项卡信号(信号:int 索引) # self.tabs.tabBarClicked.connect(self._print) # 双击选项卡信号(信号:int 索引) # self.tabs.tanBarDoubleClicked.conncet(self._print) # 选项卡标签设置 # 标签栏内容省略方式 self.tabs.setElideMode(Qt.TextElideMode.ElideRight) # Qt.TextElideMode.ElideLeft 省略号在文本开头 # Qt.TextElideMode.ElideRight 省略号在文本末尾 # Qt.TextElideMode.ElideMiddle 省略号在文本中间 # Qt.TextElideMode.ElideNone 不使用省略号 # 设置标签栏图标最大尺寸 self.tabs.setIconSize(QSize(20,20)) # 组件中只有一个选项卡时标签栏自动隐藏(缺省值为 False) self.tabs.setTabBarAutoHide(True) # 可通过 self.tabBarAutoHide() 返回当前设置属性 self.setCentralWidget(self.tabs) self.show() def _print(self,int): print('切换至第' + str(self.tabs.currentIndex()+1) + '个选项卡') print('切换至第' + str(int+1) + '个选项卡') def main(): app = QApplication(sys.argv) qw = QWindow() sys.exit(app.exec()) if __name__ == '__main__': main()
DLC — 官方文档
[QTabWidget Class Qt Widgets 6.3.2](https://doc.qt.io/qt-6/qtabwidget.html#TabPosition-enum)
相关扩展 — QTabBar
[QToolBar Class Qt Widgets 6.3.2](https://doc.qt.io/qt-6/qtoolbar.html)

堆叠组件(QStackedWidget)

堆叠组件 — QStackedWidget
python import sys from PyQt6.QtWidgets import QMainWindow, QApplication, QWidget, QVBoxLayout, QHBoxLayout from PyQt6.QtWidgets import QStackedWidget, QLabel, QPushButton from PyQt6.QtGui import QIcon, QAction from PyQt6.QtCore import Qt, QSize class QWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.stack1 = QWidget() self.lb1 = QLabel('1.歪日',self.stack1) self.stack2 = QWidget() self.lb1 = QLabel('2.歪日',self.stack2) self.stack3 = QWidget() self.lb1 = QLabel('3.歪日',self.stack3) self.stack4 = QWidget() self.lb1 = QLabel('4.歪日',self.stack4) # 创建堆叠组件 self.stacks = QStackedWidget() # 小组件增删 # 堆叠组件中添加小组件 self.stacks.addWidget(self.stack1) self.stacks.addWidget(self.stack2) self.stacks.addWidget(self.stack3) # 堆叠组件中插入小组件(索引从 0 开始,无匹配返回 -1) self.stacks.insertWidget(3,self.stack4) # 删除组件 self.stacks.removeWidget(self.stack3) # 可通过 self.stacks.widgetRemoved.connect(self._print) 传递信号 # 返回堆叠组合中组件数量 print(self.stacks.count()) # 小组件及其索引 # 按索引设置当前显示的组件(索引从 0 开始,无匹配返回 -1) self.stacks.setCurrentIndex(2) # 可通过 self.stacks.currentIndex() 返回当前显示组件的索引 # 按小组件名设置当前显示的组件 self.stacks.setCurrentWidget(self.stack1) # 可通过 self.stacks.currentWidget() 返回当前显示的组件名 # 返回小组件名对应的索引 print(self.stacks.indexOf(self.stack2)) # 更改组件时发出信号 self.stacks.currentChanged.connect(self._print) self.btn1 = QPushButton('第一页') self.btn1.clicked.connect(self.btclicked) self.btn2 = QPushButton('第二页') self.btn2.clicked.connect(self.btclicked) self.btn3 = QPushButton('第三页') self.btn3.clicked.connect(self.btclicked) hbox = QHBoxLayout() hbox.addWidget(self.btn1) hbox.addWidget(self.btn2) hbox.addWidget(self.btn3) vbox = QVBoxLayout() vbox.addWidget(self.stacks) vbox.addLayout(hbox) widget = QWidget() widget.setLayout(vbox) self.setCentralWidget(widget) self.show() def _print(self,int): print('切换至第' + str(self.stacks.currentIndex()+1) + '个选项卡') print('切换至第' + str(int+1) + '页') def btclicked(self): if self.sender().text() == '第一页': self.stacks.setCurrentIndex(0) elif self.sender().text() == '第二页': self.stacks.setCurrentIndex(1) elif self.sender().text() == '第三页': self.stacks.setCurrentIndex(2) def main(): app = QApplication(sys.argv) qw = QWindow() sys.exit(app.exec()) if __name__ == '__main__': main()
DLC — 官方文档
[QTabWidget Class Qt Widgets 6.3.2](https://doc.qt.io/qt-6/qtabwidget.html#TabPosition-enum)

MDI窗口(QMdiArea)

MDI窗口 — QMdiArea
python import sys from PyQt6.QtWidgets import QMainWindow, QApplication, QWidget, QVBoxLayout, QHBoxLayout from PyQt6.QtWidgets import QMdiArea, QTabWidget, QLabel, QPushButton, QComboBox from PyQt6.QtGui import QIcon, QAction from PyQt6.QtCore import Qt, QSize class QWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.tab1 = QWidget() self.tab1.setWindowTitle('A') self.tab2 = QWidget() self.tab1.setWindowTitle('B') self.tab3 = QWidget() self.tab1.setWindowTitle('C') # 创建MDI窗口 self.mdi = QMdiArea() # 添加子窗口 self.mdi.addSubWindow(self.tab1) self.mdi.addSubWindow(self.tab2) self.mdi.addSubWindow(self.tab3) # 设置窗口排列顺序(缺省值为 CreationOrder) self.mdi.setActivationOrder(QMdiArea.WindowOrder.StackingOrder) # WindowOrder.CreationOrder 按创建顺序排列 # WindowOrder.StackingOrder 按堆叠顺序排列(顶部在列表最后边) # WindowOrder.ActivationHistoryOrder 按激活顺序排列 # 背景画布颜色(缺省值为) # self.mdi.setBackground() # 可通过 self.mdi.background() 返回当前画布颜色 # 设置窗口显示方式 self.mdi.setViewMode(QMdiArea.ViewMode.TabbedView) # QMdiArea.ViewMode.SubWindowView 子窗口模式(缺省值) # QMdiArea.ViewMode.TabbedView 标签模式 # 可通过 self.mdi.viewMode() 返回窗口显示方式 # 选项卡模式 # 在选项卡时模式时下是否设置为文档模式(缺省值为 False) self.mdi.setDocumentMode(True) # 可通过 self.mdi.documentMode 返回当前是否禁用 # 选项卡标签位置 self.mdi.setTabPosition(QTabWidget.TabPosition.West) # QTabWidget.TabPosition.North 标签在选项卡顶部 缺省值 # QTabWidget.TabPosition.South 标签在选项卡底部 # QTabWidget.TabPosition.West 标签在选项卡左侧 # QTabWidget.TabPosition.East 标签在选项卡右侧 # 可通过 self.mdi.tabPosition() 返回标签在选项卡位置 # 选项卡标签形状 self.mdi.setTabShape(QTabWidget.TabShape.Triangular ) # QTabWidget.TabShape.Triangular 选项卡为三角形 # QTabWidget.TabShape.Rounded 选项卡为圆角(缺省值) # 设置选项卡是否可以关闭(缺省值为 False) self.mdi.setTabsClosable(True) # 设置选项卡是否可以移动(缺省值为 True) self.mdi.setTabsMovable (True) # 可通过 self.mdi.tabsMovable () 返回是否可移动 # 子窗口模式 # 子窗口模式下,窗口以级联模式排列所有小窗口 self.mdi.cascadeSubWindows() # 子窗口模式下,窗口以平铺模式排列所有小窗口 self.mdi.tileSubWindows() # 设置最大化模式为最大化不影响激活窗口(不设置则激活最大化的窗口) self.mdi.setOption(QMdiArea.AreaOption.DontMaximizeSubWindowOnActivation) self.btn1 = QPushButton('显示模式切换') self.btn1.clicked.connect(self.btnclick) self.btn2 = QPushButton('激活顺序上一窗口') self.btn2.clicked.connect(self.btnclick) self.btn3 = QPushButton('激活顺序下一窗口') self.btn3.clicked.connect(self.btnclick) self.btn4 = QPushButton('关闭当前窗口') self.btn4.clicked.connect(self.btnclick) self.btn5 = QPushButton('关闭全部窗口') self.btn5.clicked.connect(self.btnclick) hbox = QHBoxLayout() hbox.addWidget(self.btn1) hbox.addWidget(self.btn2) hbox.addWidget(self.btn3) hbox.addWidget(self.btn4) hbox.addWidget(self.btn5) vbox = QVBoxLayout() vbox.addWidget(self.mdi) vbox.addLayout(hbox) widget = QWidget() widget.setLayout(vbox) self.setCentralWidget(widget) self.showMaximized() self.show() def btnclick(self): sender = self.sender() if sender == self.btn1: if self.mdi.viewMode() == QMdiArea.ViewMode.SubWindowView: self.mdi.setViewMode(QMdiArea.ViewMode.TabbedView) else: self.mdi.setViewMode(QMdiArea.ViewMode.SubWindowView) # 激活前一激活窗口 elif sender == self.btn2: self.mdi.activatePreviousSubWindow() # 激活下一激活窗口 elif sender == self.btn3: self.mdi.activateNextSubWindow() # 关闭当前激活窗口 elif sender == self.btn4: self.mdi.closeActiveSubWindow () # 关闭所有窗口 elif sender == self.btn5: self.mdi.closeAllSubWindows() def main(): app = QApplication(sys.argv) qw = QWindow() sys.exit(app.exec()) if __name__ == '__main__': main()
DLC
[QMdiArea Class Qt Widgets 6.3.2](https://doc.qt.io/qt-6/qmdiarea.html)