pyqt tab contral

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的功能,主要特点包括:

  1. 标签页控件基本功能:

    • 支持多个标签页切换
    • 可以自定义每个标签页的内容
    • 标签页可以动态添加和删除
  2. 多种内容展示:

    • 欢迎页:展示程序信息和操作按钮
    • 用户信息页:包含表单输入控件
    • 数据展示页:包含表格控件展示数据
    • 文本编辑页:包含文本编辑功能
  3. 动态操作:

    • 可以随时添加新的标签页
    • 可以删除当前选中的标签页
    • 表格可以动态添加行
  4. 交互功能:

    • 表单数据可以保存
    • 文本编辑支持复制粘贴
    • 提供友好的操作提示
  5. 底部日志区域

    • 使用QSplitter实现了可调整大小的布局
    • 底部保留了一个只读的QTextEdit控件作为日志区域
    • 日志显示包含时间戳,便于追踪操作顺序
  6. 操作日志功能

    • 所有操作都会记录到日志区域
    • 添加新标签页、删除标签页、保存用户信息、添加表格行等操作都会生成日志
    • 日志格式为 [时间戳] 操作内容

你可以直接运行这个程序,观察底部日志区域的变化。所有操作都会被记录下来,方便你跟踪程序的运行状态。如果需要进一步扩展,可以考虑添加日志保存到文件、日志过滤等功能。
你可以直接运行这个程序,也可以根据需要进行扩展,比如添加更多类型的标签页、自定义标签页样式、实现标签页拖拽排序等功能。
你可以直接运行这个程序,观察底部日志区域的变化。所有操作都会被记录下来,方便你跟踪程序的运行状态。如果需要进一步扩展,可以考虑添加日志保存到文件、日志过滤等功能。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值