import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTabWidget, QWidget,
QVBoxLayout, QLabel, QPushButton, QTextEdit,
QFormLayout, QLineEdit, QTableWidget, QTableWidgetItem,
QSplitter)
from PyQt5.QtCore import Qt
class TabControlDemo(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设置窗口标题和大小
self.setWindowTitle('PyQt标签页控件示例')
self.resize(800, 600)
# 创建中心部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 创建垂直布局
main_layout = QVBoxLayout(central_widget)
# 创建分割器,用于分割标签页和日志区域
splitter = QSplitter(Qt.Vertical)
# 创建标签页控件
self.tabs = QTabWidget()
# 添加不同的标签页
self.add_tab1() # 欢迎页
self.add_tab2() # 用户信息页
self.add_tab3() # 数据展示页
self.add_tab4() # 文本编辑页
# 添加标签页控件到分割器
splitter.addWidget(self.tabs)
# 创建日志区域
self.log_area = QTextEdit()
self.log_area.setReadOnly(True)
self.log_area.setPlaceholderText('操作日志将显示在这里...')
splitter.addWidget(self.log_area)
# 设置分割器的初始大小比例
splitter.setSizes([400, 200])
# 将分割器添加到主布局
main_layout.addWidget(splitter)
# 初始化日志
self.log("程序已启动")
def add_tab1(self):
"""添加欢迎页标签"""
tab = QWidget()
layout = QVBoxLayout(tab)
# 添加欢迎标签
welcome_label = QLabel('欢迎使用标签页示例程序')
welcome_label.setAlignment(Qt.AlignCenter)
welcome_label.setStyleSheet('font-size: 24px; font-weight: bold;')
layout.addWidget(welcome_label)
# 添加说明文本
info_text = QLabel('''
本程序演示了PyQt中标签页控件(QTabWidget)的使用方法。
您可以通过点击顶部的标签切换不同的页面:
- 用户信息:演示表单输入
- 数据展示:演示表格控件
- 文本编辑:演示多行文本编辑
您可以根据需要添加、删除或修改标签页。
''')
info_text.setAlignment(Qt.AlignLeft)
info_text.setWordWrap(True)
layout.addWidget(info_text)
# 添加按钮
button_layout = QVBoxLayout()
add_tab_btn = QPushButton('添加新标签页')
add_tab_btn.clicked.connect(self.add_new_tab)
button_layout.addWidget(add_tab_btn)
remove_tab_btn = QPushButton('删除当前标签页')
remove_tab_btn.clicked.connect(self.remove_current_tab)
button_layout.addWidget(remove_tab_btn)
layout.addLayout(button_layout)
# 将标签页添加到标签控件
self.tabs.addTab(tab, '欢迎页')
def add_tab2(self):
"""添加用户信息标签页"""
tab = QWidget()
layout = QVBoxLayout(tab)
# 创建表单区域
form_widget = QWidget()
form_layout = QFormLayout(form_widget)
# 添加表单控件
self.name_edit = QLineEdit()
self.age_edit = QLineEdit()
self.gender_edit = QLineEdit()
self.email_edit = QLineEdit()
# 添加到表单布局
form_layout.addRow('姓名:', self.name_edit)
form_layout.addRow('年龄:', self.age_edit)
form_layout.addRow('性别:', self.gender_edit)
form_layout.addRow('邮箱:', self.email_edit)
# 添加保存按钮
save_btn = QPushButton('保存信息')
save_btn.clicked.connect(self.save_user_info)
form_layout.addRow(save_btn)
# 添加到主布局
layout.addWidget(form_widget)
# 添加标签页
self.tabs.addTab(tab, '用户信息')
def add_tab3(self):
"""添加数据展示标签页"""
tab = QWidget()
layout = QVBoxLayout(tab)
# 创建表格
self.table = QTableWidget()
self.table.setColumnCount(4)
self.table.setHorizontalHeaderLabels(['ID', '姓名', '年龄', '职业'])
# 添加示例数据
data = [
[1, '张三', 25, '工程师'],
[2, '李四', 30, '设计师'],
[3, '王五', 22, '学生'],
[4, '赵六', 35, '经理']
]
for row, item in enumerate(data):
self.table.insertRow(row)
for col, value in enumerate(item):
self.table.setItem(row, col, QTableWidgetItem(str(value)))
# 添加到布局
layout.addWidget(self.table)
# 添加按钮
add_row_btn = QPushButton('添加行')
add_row_btn.clicked.connect(self.add_table_row)
layout.addWidget(add_row_btn)
# 添加标签页
self.tabs.addTab(tab, '数据展示')
def add_tab4(self):
"""添加文本编辑标签页"""
tab = QWidget()
layout = QVBoxLayout(tab)
# 添加文本编辑框
self.text_edit = QTextEdit()
self.text_edit.setPlaceholderText('请输入文本...')
layout.addWidget(self.text_edit)
# 添加按钮
btn_layout = QVBoxLayout()
clear_btn = QPushButton('清空文本')
clear_btn.clicked.connect(self.text_edit.clear)
btn_layout.addWidget(clear_btn)
copy_btn = QPushButton('复制文本')
copy_btn.clicked.connect(self.text_edit.copy)
btn_layout.addWidget(copy_btn)
paste_btn = QPushButton('粘贴文本')
paste_btn.clicked.connect(self.text_edit.paste)
btn_layout.addWidget(paste_btn)
layout.addLayout(btn_layout)
# 添加标签页
self.tabs.addTab(tab, '文本编辑')
def add_new_tab(self):
"""添加新的标签页"""
# 创建新标签页
new_tab = QWidget()
layout = QVBoxLayout(new_tab)
# 添加标签
label = QLabel(f'这是新创建的标签页 {self.tabs.count() + 1}')
label.setAlignment(Qt.AlignCenter)
layout.addWidget(label)
# 添加到标签控件
self.tabs.addTab(new_tab, f'新标签 {self.tabs.count() + 1}')
self.tabs.setCurrentIndex(self.tabs.count() - 1) # 切换到新标签页
# 记录日志
self.log(f"添加了新标签页: 新标签 {self.tabs.count()}")
def remove_current_tab(self):
"""删除当前标签页"""
if self.tabs.count() > 1: # 至少保留一个标签页
current_index = self.tabs.currentIndex()
tab_text = self.tabs.tabText(current_index)
self.tabs.removeTab(current_index)
# 记录日志
self.log(f"删除了标签页: {tab_text}")
else:
# 记录日志
self.log("警告: 至少保留一个标签页!")
# 显示消息框
from PyQt5.QtWidgets import QMessageBox
QMessageBox.warning(self, '警告', '至少保留一个标签页!')
def save_user_info(self):
"""保存用户信息"""
name = self.name_edit.text()
age = self.age_edit.text()
gender = self.gender_edit.text()
email = self.email_edit.text()
# 记录日志
self.log(f"保存用户信息: 姓名={name}, 年龄={age}, 性别={gender}, 邮箱={email}")
# 显示消息框
from PyQt5.QtWidgets import QMessageBox
QMessageBox.information(self, '成功', '用户信息已保存!')
def add_table_row(self):
"""向表格添加新行"""
row = self.table.rowCount()
self.table.insertRow(row)
# 设置默认值
self.table.setItem(row, 0, QTableWidgetItem(str(row + 1)))
self.table.setItem(row, 1, QTableWidgetItem('新姓名'))
self.table.setItem(row, 2, QTableWidgetItem('0'))
self.table.setItem(row, 3, QTableWidgetItem('新职业'))
# 记录日志
self.log(f"在表格中添加了新行: ID={row + 1}")
def log(self, message):
"""记录日志到日志区域"""
from datetime import datetime
timestamp = datetime.now().strftime("%H:%M:%S")
self.log_area.append(f"[{timestamp}] {message}")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = TabControlDemo()
window.show()
sys.exit(app.exec_())
这个程序实现了类似MFC Tab Control的功能,主要特点包括:
-
标签页控件基本功能:
- 支持多个标签页切换
- 可以自定义每个标签页的内容
- 标签页可以动态添加和删除
-
多种内容展示:
- 欢迎页:展示程序信息和操作按钮
- 用户信息页:包含表单输入控件
- 数据展示页:包含表格控件展示数据
- 文本编辑页:包含文本编辑功能
-
动态操作:
- 可以随时添加新的标签页
- 可以删除当前选中的标签页
- 表格可以动态添加行
-
交互功能:
- 表单数据可以保存
- 文本编辑支持复制粘贴
- 提供友好的操作提示
-
底部日志区域:
- 使用QSplitter实现了可调整大小的布局
- 底部保留了一个只读的QTextEdit控件作为日志区域
- 日志显示包含时间戳,便于追踪操作顺序
-
操作日志功能:
- 所有操作都会记录到日志区域
- 添加新标签页、删除标签页、保存用户信息、添加表格行等操作都会生成日志
- 日志格式为 [时间戳] 操作内容
你可以直接运行这个程序,观察底部日志区域的变化。所有操作都会被记录下来,方便你跟踪程序的运行状态。如果需要进一步扩展,可以考虑添加日志保存到文件、日志过滤等功能。
你可以直接运行这个程序,也可以根据需要进行扩展,比如添加更多类型的标签页、自定义标签页样式、实现标签页拖拽排序等功能。
你可以直接运行这个程序,观察底部日志区域的变化。所有操作都会被记录下来,方便你跟踪程序的运行状态。如果需要进一步扩展,可以考虑添加日志保存到文件、日志过滤等功能。