0505QStackedWidget

本文介绍如何使用PyQt5中的QStackedWidget组件来实现类似Tab切换的效果,通过左侧列表选择不同的页面进行显示。文章详细展示了创建多个页面、布局设置及信号槽连接的方法。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

#父级又是QWidget,不清楚什么时候是QWidget什么时候是其它
class demoStackedWidget(QWidget):
    def __init__(self):
        super(demoStackedWidget, self).__init__()

        self.setGeometry(600, 200, 300, 100)
        self.setWindowTitle("0505QStackedWidget")

        self.leftList = QListWidget()
        self.leftList.insertItem(0, "Contect")
        self.leftList.insertItem(1, "Personal Information")
        self.leftList.insertItem(2, "Education")

        self.stack1 = QWidget()
        self.stack2 = QWidget()
        self.stack3 = QWidget()

        self.UIstack1()
        self.UIstack2()
        self.UIstack3()

        self.stack = QStackedWidget(self)
        self.stack.addWidget(self.stack1)
        self.stack.addWidget(self.stack2)
        self.stack.addWidget(self.stack3)

        hbox = QHBoxLayout(self)
        hbox.addWidget(self.leftList)
        hbox.addWidget(self.stack)

        self.setLayout(hbox)
        self.leftList.currentRowChanged.connect(self.display)

    def UIstack1(self):
        layout = QFormLayout()
        layout.addRow("Name: ", QLineEdit())
        layout.addRow("Address: ", QLineEdit())
        self.stack1.setLayout(layout)

    def UIstack2(self):
        layout = QFormLayout()
        genderLayout = QHBoxLayout()
        #genderLayout.addWidget(QLabel("Gender: "))
        genderLayout.addWidget(QRadioButton("Male"))
        genderLayout.addWidget(QRadioButton("Female"))
        layout.addRow("Gender: ", genderLayout)
        layout.addRow("Birthday: ", QLineEdit())
        self.stack2.setLayout(layout)

    def UIstack3(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel("Subject: "))
        layout.addWidget(QCheckBox("Physics"))
        layout.addWidget(QCheckBox("Advanced Mathematics"))
        self.stack3.setLayout(layout)

    def display(self, i):
        self.stack.setCurrentIndex(i)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = demoStackedWidget()
    win.show()
    sys.exit(app.exec_())

 

### QStackedWidget 使用方法、功能与示例 QStackedWidget 是 Qt 提供的一个容器控件,用于在同一区域内切换多个子控件(通常是 QWidget),但一次仅显示一个。该控件常用于实现页面导航、向导界面、选项卡切换等交互设计。 #### 核心功能 - **多页切换**:QStackedWidget 可以管理多个子页面,并通过索引或指针切换当前显示的页面。 - **动态管理**:支持在运行时动态添加、删除页面。 - **无切换控件**:自身不提供导航控件,需配合按钮、列表、标签栏等控件实现页面切换。 - **索引访问**:可以通过索引或指针直接访问和操作页面。 QWidget *firstPageWidget = new QWidget; QWidget *secondPageWidget = new QWidget; QWidget *thirdPageWidget = new QWidget; QStackedWidget *stackedWidget = new QStackedWidget; stackedWidget->addWidget(firstPageWidget); stackedWidget->addWidget(secondPageWidget); stackedWidget->addWidget(thirdPageWidget); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(stackedWidget); setLayout(layout);[^2] #### 常用方法 - `addWidget(QWidget *widget)`:添加一个页面到堆栈控件中,返回其索引值。 - `insertWidget(int index, QWidget *widget)`:在指定位置插入一个页面。 - `removeWidget(QWidget *widget)`:从堆栈中移除指定页面。 - `setCurrentIndex(int index)`:设置当前显示的页面索引。 - `setCurrentWidget(QWidget *widget)`:设置当前显示的页面指针。 - `currentIndex()`:获取当前页面的索引。 - `currentWidget()`:获取当前显示的页面指针。 #### 示例代码 以下是一个完整的示例,展示如何使用 QStackedWidget 配合按钮实现页面切换: ```cpp #include <QApplication> #include <QMainWindow> #include <QStackedWidget> #include <QPushButton> #include <QHBoxLayout> #include <QVBoxLayout> #include <QWidget> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); // 创建页面 QWidget *page1 = new QWidget; QWidget *page2 = new QWidget; QWidget *page3 = new QWidget; page1->setStyleSheet("background-color: lightblue;"); page2->setStyleSheet("background-color: lightgreen;"); page3->setStyleSheet("background-color: lightyellow;"); // 创建堆栈控件并添加页面 stackedWidget = new QStackedWidget; stackedWidget->addWidget(page1); stackedWidget->addWidget(page2); stackedWidget->addWidget(page3); // 创建按钮 QPushButton *btn1 = new QPushButton("Page 1"); QPushButton *btn2 = new QPushButton("Page 2"); QPushButton *btn3 = new QPushButton("Page 3"); // 连接按钮信号与槽 connect(btn1, &QPushButton::clicked, this, [this](){ stackedWidget->setCurrentIndex(0); }); connect(btn2, &QPushButton::clicked, this, [this](){ stackedWidget->setCurrentIndex(1); }); connect(btn3, &QPushButton::clicked, this, [this](){ stackedWidget->setCurrentIndex(2); }); // 按钮布局 QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(btn1); buttonLayout->addWidget(btn2); buttonLayout->addWidget(btn3); // 主布局 QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(buttonLayout); mainLayout->addWidget(stackedWidget); centralWidget->setLayout(mainLayout); } private: QStackedWidget *stackedWidget; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } #include "main.moc" ``` #### 错误处理与注意事项 - **页面索引越界**:调用 `setCurrentIndex` 时应确保索引在合法范围内,否则可能导致程序崩溃或未定义行为。 - **页面生命周期管理**:如果页面是动态创建的,需确保在删除 QStackedWidget 前正确释放页面资源。 - **布局嵌套问题**:将 QStackedWidget 嵌套在其他布局中时,需注意布局管理器的设置顺序,避免控件显示异常。 - **页面内容初始化**:页面内容应在添加到 QStackedWidget 之前完成初始化,否则可能无法正确显示。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值