python3+PyQt5+Qt Designer实现Tab标签页部件

该博客介绍了如何使用Python3、PyQt5和Qt Designer来实现Tab标签页窗口。分为两部分,第一部分完全通过代码实现,第二部分利用Qt Designer提升开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是对《Python Qt GUI快速编程》的第9章的Tab标签页窗口的例子payment form用Python3+PyQt5+Qt Designer进行改写。
第一部分无借用Qt Designer,完全用代码实现。
第二部分则借用Qt Designer,快速实现。

第一部分:

import sys
from PyQt5.QtCore import (QDate, Qt)
from PyQt5.QtWidgets import (QApplication, QCheckBox, QDateEdit, QDialog,
        QDialogButtonBox, QDoubleSpinBox, QGridLayout, QHBoxLayout,
        QLabel, QLineEdit, QSpinBox, QTabWidget, QVBoxLayout, QWidget)


class PaymentDlg(QDialog):

    def __init__(self, parent=None):
        super(PaymentDlg, self).__init__(parent)

        forenameLabel = QLabel("&Forename:")
        self.forenameLineEdit = QLineEdit()
        forenameLabel.setBuddy(self.forenameLineEdit)
        surnameLabel = QLabel("&Surname:")
        self.surnameLineEdit = QLineEdit()
        surnameLabel.setBuddy(self.surnameLineEdit)
        invoiceLabel = QLabel("&Invoice No.:")
        self.invoiceSpinBox = QSpinBox()
        invoiceLabel.setBuddy(self.invoiceSpinBox)
        self.invoiceSpinBox.setRange(1, 10000000)
        self.invoiceSpinBox.setValue(100000)
        self.invoiceSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        amountLabel = QLabel("&Amount:")
        self.amountSpinBox = QDoubleSpinBox()
        amountLabel.setBuddy(self.amountSpinBox)
        self.amountSpinBox.setRange(0, 5000.0)
        self.amountSpinBox.setPrefix("$ ")
        self.amountSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.paidCheckBox = QCheckBox("&Paid")
        checkNumLabel = QLabel("Check &No.:")
        self.checkNumLineEdit = QLineEdit()
        checkNumLabel.setBuddy(self.checkNumLineEdit)
        bankLabel = QLabel("&Bank:")
        self.bankLineEdit = QLineEdit()
        bankLabel.setBuddy(self.bankLineEdit)
        accountNumLabel = QLabel("Acco&unt No.:")
        self.accountNumLineEdit = QLineEdit()
        accountNumLabel.setBuddy(self.accountNumLineEdit)
        sortCodeLabel = QLabel("Sort &Code:")
        self.sortCodeLineEdit = QLineEdit()
        sortCodeLabel.setBuddy(self.sortCodeLineEdit)
        creditCardLabel = QLabel("&Number:")
        self.creditCardLineEdit = QLineEdit()
        creditCardLabel.setBuddy(self.creditCardLineEdit)
        validFromLabel = QLabel("&Valid From:")
        self.validFromDateEdit = QDateEdit()
        validFromLabel.setBuddy(self.validFromDateEdit)
        self.validFromDateEdit.setDisplayFormat("MMM yyyy")
        self.validFromDateEdit.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        expiryLabel = QLabel("E&xpiry Date:")
        self.expiryDateEdit = QDateEdit()
        expiryLabel.setBuddy(self.expiryDateEdit)
        self.expiryDateEdit.setDisplayFormat("MMM yyyy")
        self.expiryDateEdit.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok|
                                          QDialogButtonBox.Cancel)

        tabWidget = QTabWidget()
        cashWidget = QWidget()
        cashLayout = QHBoxLayout()
        cashLayout.addWidget(self.paidCheckBox)
        cashWidget.setLayout(cashLayout)
        tabWidget.addTab(cashWidget, "Cas&h")
        checkWidget = QWidget()
        checkLayout = QGridLayout()
        checkLayout.addWidget(checkNumLabel, 0, 0)
        checkLayout.addWidget(self.checkNumLineEdit, 0, 1)
        checkLayout.addWidget(bankLabel, 0, 2)
        checkLayout.addWidget(self.bankLineEdit, 0, 3)
        checkLayout.addWidget(accountNumLabel, 1, 0)
        checkLayout.addWidget(self.accountNumLineEdit, 1, 1)
        checkLayout.addWidget(sortCodeLabel, 1, 2)
        checkLayout.addWidget(self.sortCodeLineEdit, 1, 3)
        checkWidget.setLayout(checkLayout)
        tabWidget.addTab(checkWidget, "Chec&k")
        creditWidget = QWidget()
        creditLayout = QGridLayout()
        creditLayout.addWidget(creditCardLabel, 0, 0)
        creditLayout.addWidget(self.creditCardLineEdit, 0, 1, 1, 3)
        creditLayout.addWidget(validFromLabel, 1, 0)
        creditLayout.addWidget(self.validFromDateEdit, 1, 1)
        creditLayout.addWidget(expiryLabel, 1, 2)
        creditLayout.addWidget(self.expiryDateEdit, 1, 3)
        creditWidget.setLayout(creditLayout)
        tabWidget.addTab(creditWidget, "Credit Car&d")

        gridLayout = QGridLayout()
        gridLayout.addWidget(forenameLabel, 0, 0)
        gridLayout.addWidget(self.forenameLineEdit, 0, 1)
        gridLayout.addWidget(surnameLabel, 0, 2)
        gridLayout.addWidget(self.surnameLineEdit, 0, 3)
        gridLayout.addWidget(invoiceLabel, 1, 0)
        gridLayout.addWidget(self
<think>我们正在讨论Qt如何实现多页面显示。根据提供的引用,Qt提供了多种方式来实现多页面显示,包括QStackedWidget、QTabWidget以及通过显隐控制QWidget等。下面我将详细介绍这些方法。</think>在Qt实现多页面显示主要有三种常用方法,各有特点: ### 1. QStackedWidget(堆叠窗口) 最常用的多页面管理组件,支持动态切换页面: ```cpp // 头文件 #include <QStackedWidget> // 创建堆叠窗口 QStackedWidget *stackedWidget = new QStackedWidget(this); // 添加页面 QWidget *page1 = new QWidget(); QWidget *page2 = new QWidget(); stackedWidget->addWidget(page1); stackedWidget->addWidget(page2); // 切换页面(通过索引) stackedWidget->setCurrentIndex(1); // 切换到第二个页面 ``` **特点**: - 页面叠放,同一时间只显示一个页面 - 支持动态添加/删除页面 - 内存中保留所有页面实例 - 适合向导式界面或动态内容切换[^2] ### 2. QTabWidget标签页窗口) 提供类似浏览器的多页签体验: ```python # Python示例(PyQt) from PyQt5.QtWidgets import QTabWidget, QWidget tab_widget = QTabWidget() page1 = QWidget() page2 = QWidget() tab_widget.addTab(page1, "第一页") tab_widget.addTab(page2, "第二页") ``` **特点**: - 自带页面标签栏 - 用户可主动点击切换 - 直观显示所有可用页面 - 适合文档编辑器或多数据视图[^1] ### 3. QWidget显隐控制 手动管理页面显示状态: ```cpp // 创建多个页面 QWidget *mainPage = new QWidget(); QWidget *settingsPage = new QWidget(); // 显示主页面 mainPage->show(); settingsPage->hide(); // 切换页面 void switchToSettings() { mainPage->hide(); settingsPage->show(); } ``` **特点**: - 实现简单无需额外组件 - 需要手动管理布局和状态 - 容易导致代码混乱 - 仅适用于简单场景[^1] ### 设计建议 1. **简单切换**:使用QStackedWidget + 按钮/菜单控制 2. **多数据视图**:采用QTabWidget标签页 3. **复杂应用**:结合模型-视图架构,每个页面作为独立组件 4. **动态内容**:配合`QStackedLayout`实现自定义布局 > 关键提示:在Qt Designer中可直接拖入`Stacked Widget`组件,右键菜单可添加/删除页面[^2]。对于多窗口应用,建议每个窗口单独设计然后通过信号槽连接[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值