在使用PyQt编写桌面应用程序的过程中,要实现多页面布局方案,可以使用QTabWidget控件来实现。
功能概览
本案例提供了完整的标签页管理功能,同时保持了响应式设计的核心原则,能够很好地适应不同屏幕尺寸和内容变化。
标签管理:支持动态添加/关闭标签页
响应式布局:每个页面使用布局管理器自动适应窗口大小
样式定制:通过QSS自定义标签外观
扩展性:可轻松添加更多页面类型
交互功能:包含基本的表单元素和文本编辑功能
基础结构搭建
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sysclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('多页面应用示例')# 创建中央部件和主布局central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)# 创建标签控件self.tab_widget = QTabWidget()main_layout.addWidget(self.tab_widget)# 添加示例标签页self.add_tab("首页", self.create_home_page())self.add_tab("设置", self.create_settings_page())self.add_tab("关于", self.create_about_page())# 设置标签位置(可选:北/南/东/西)self.tab_widget.setTabPosition(QTabWidget.North)# 启用标签关闭按钮(可选)self.tab_widget.setTabsClosable(True)self.tab_widget.tabCloseRequested.connect(self.close_tab)def add_tab(self, name, widget):"""添加新标签页"""self.tab_widget.addTab(widget, name)def close_tab(self, index):"""关闭标签页"""widget = self.tab_widget.widget(index)if widget:widget.deleteLater()self.tab_widget.removeTab(index)
创建页面内容
def create_home_page(self):"""创建首页内容"""page = QWidget()layout = QVBoxLayout(page)# 添加响应式内容title = QLabel("欢迎使用")title.setAlignment(Qt.AlignCenter)title.setStyleSheet("font-size: 24px; font-weight: bold;")content = QTextEdit()content.setPlaceholderText("输入您的内容...")content.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)btn_container = QHBoxLayout()btn_add = QPushButton("添加")btn_add.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)btn_container.addWidget(btn_add)layout.addWidget(title)layout.addWidget(content)layout.addLayout(btn_container)return pagedef create_settings_page(self):"""创建设置页面"""page = QWidget()layout = QFormLayout(page)# 添加表单元素layout.addRow(QLabel("主题颜色:"), QComboBox())layout.addRow(QLabel("字体大小:"), QSpinBox())layout.addRow(QLabel("自动保存:"), QCheckBox())return pagedef create_about_page(self):"""创建关于页面"""page = QWidget()layout = QVBoxLayout(page)logo = QLabel("应用图标")logo.setAlignment(Qt.AlignCenter)logo.setFixedSize(100, 100)logo.setStyleSheet("border: 1px solid #ccc;")info = QLabel("版本 1.0.0\n版权所有 © 2023")info.setAlignment(Qt.AlignCenter)layout.addWidget(logo)layout.addWidget(info)layout.addStretch()return page
高级功能
动态添加标签页
def add_new_tab(self):"""动态创建新标签"""count = self.tab_widget.count()new_page = QWidget()new_layout = QVBoxLayout(new_page)new_layout.addWidget(QLabel(f"这是第 {count+1} 个标签页"))self.add_tab(f"页面 {count+1}", new_page)self.tab_widget.setCurrentIndex(count)
标签样式定制
# 设置标签形状(可选:圆形/三角形)
self.tab_widget.setTabShape(QTabWidget.Rounded)# 自定义标签样式(通过QSS)
self.tab_widget.setStyleSheet("""QTabBar::tab {background: #f0f0f0;border: 1px solid #ccc;padding: 8px 16px;}QTabBar::tab:selected {background: #fff;border-bottom: 2px solid #2196F3;}
""")
响应式布局技巧
嵌套布局
在复杂页面中组合使用QVBoxLayout
/QHBoxLayout
/QGridLayout
伸缩控制
layout.setStretch(0, 1) # 第一个部件扩展
layout.setStretch(1, 2) # 第二个部件双倍扩展
部件策略
widget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
动态调整
def resizeEvent(self, event):self.tab_widget.adjustSize()super().resizeEvent(event)
完整示例代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *class MainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('多页面应用')self.setGeometry(300, 300, 800, 600)central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)# 创建标签控件self.tab_widget = QTabWidget()main_layout.addWidget(self.tab_widget)# 添加示例标签self.add_tab("首页", self.create_home_page())self.add_tab("设置", self.create_settings_page())# 添加控制按钮btn_add = QPushButton("新建标签")btn_add.clicked.connect(self.add_new_tab)main_layout.addWidget(btn_add)def add_tab(self, name, widget):self.tab_widget.addTab(widget, name)self.tab_widget.setTabToolTip(self.tab_widget.count()-1, name)def add_new_tab(self):new_page = QWidget()layout = QVBoxLayout(new_page)text_edit = QTextEdit()layout.addWidget(text_edit)self.add_tab(f"新标签 {self.tab_widget.count()+1}", new_page)self.tab_widget.setCurrentIndex(self.tab_widget.count()-1)def create_home_page(self):page = QWidget()layout = QVBoxLayout(page)title = QLabel("首页内容")title.setAlignment(Qt.AlignCenter)title.setStyleSheet("font-size: 24px;")content = QTextEdit()content.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)layout.addWidget(title)layout.addWidget(content)return pagedef create_settings_page(self):page = QWidget()layout = QFormLayout(page)layout.addRow(QLabel("选项1:"), QLineEdit())layout.addRow(QLabel("选项2:"), QComboBox())layout.addRow(QLabel("选项3:"), QCheckBox("启用"))return pageif __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())