在使用PyQt编写桌面应用程序的过程中,要实现多页面布局方案,可以使用QTabWidget控件来实现。
功能概览
本案例提供了完整的标签页管理功能,同时保持了响应式设计的核心原则,能够很好地适应不同屏幕尺寸和内容变化。
标签管理:支持动态添加/关闭标签页
响应式布局:每个页面使用布局管理器自动适应窗口大小
样式定制:通过QSS自定义标签外观
扩展性:可轻松添加更多页面类型
交互功能:包含基本的表单元素和文本编辑功能
基础结构搭建
python
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class 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)
创建页面内容
python
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 page
def create_settings_page(self):
"""创建设置页面"""
page = QWidget()
layout = QFormLayout(page)
# 添加表单元素
layout.addRow(QLabel("主题颜色:"), QComboBox())
layout.addRow(QLabel("字体大小:"), QSpinBox())
layout.addRow(QLabel("自动保存:"), QCheckBox())
return page
def 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
高级功能
动态添加标签页
python
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)
标签样式定制
python
# 设置标签形状(可选:圆形/三角形)
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
伸缩控制
python
layout.setStretch(0, 1) # 第一个部件扩展
layout.setStretch(1, 2) # 第二个部件双倍扩展
部件策略
python
widget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
动态调整
python
def resizeEvent(self, event):
self.tab_widget.adjustSize()
super().resizeEvent(event)
完整示例代码
python
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 page
def 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 page
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())