Qt的QStackedWidget的Python使用

QStackedWidget 是 Qt 中用于管理多个界面切换的容器控件,它允许将多个子窗口(或页面)堆叠在一起,但每次只显示其中一个。常用于实现向导式界面、多步骤表单或动态切换的视图。以下是 QStackedWidget 的使用详解和示例:


基本用法

1. 创建并添加页面
from PyQt5.QtWidgets import QApplication, QWidget, QStackedWidget, QVBoxLayout, QLabel, QPushButton

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.stacked_widget = QStackedWidget()
        self.init_ui()

    def init_ui(self):
        # 创建 3 个页面
        page1 = QLabel("这是页面 1")
        page2 = QLabel("这是页面 2")
        page3 = QLabel("这是页面 3")

        # 将页面添加到 QStackedWidget
        self.stacked_widget.addWidget(page1)
        self.stacked_widget.addWidget(page2)
        self.stacked_widget.addWidget(page3)

        # 创建切换按钮
        btn_prev = QPushButton("上一页")
        btn_next = QPushButton("下一页")
        btn_prev.clicked.connect(self.show_previous_page)
        btn_next.clicked.connect(self.show_next_page)

        # 布局
        layout = QVBoxLayout()
        layout.addWidget(self.stacked_widget)
        layout.addWidget(btn_prev)
        layout.addWidget(btn_next)
        self.setLayout(layout)

    def show_previous_page(self):
        # 获取当前索引,并切换到上一页
        current = self.stacked_widget.currentIndex()
        if current > 0:
            self.stacked_widget.setCurrentIndex(current - 1)

    def show_next_page(self):
        # 获取当前索引,并切换到下一页
        current = self.stacked_widget.currentIndex()
        if current < self.stacked_widget.count() - 1:
            self.stacked_widget.setCurrentIndex(current + 1)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

关键方法

  1. 添加/移除页面

    • addWidget(widget):添加一个页面。
    • insertWidget(index, widget):在指定位置插入页面。
    • removeWidget(widget):移除页面。
  2. 切换页面

    • setCurrentIndex(index):通过索引切换页面(从 0 开始)。
    • setCurrentWidget(widget):直接切换到指定控件。
  3. 获取信息

    • currentIndex():返回当前页面索引。
    • currentWidget():返回当前显示的控件。
    • count():返回页面总数。

结合导航控件

通常与 QComboBoxQListWidget 或按钮结合使用,实现导航逻辑:

# 示例:通过 QComboBox 切换页面
combo = QComboBox()
combo.addItems(["Page 1", "Page 2", "Page 3"])
combo.currentIndexChanged.connect(self.stacked_widget.setCurrentIndex)
layout.addWidget(combo)

动态添加/删除页面

def add_dynamic_page(self):
    new_page = QLabel(f"动态页面 {self.stacked_widget.count() + 1}")
    self.stacked_widget.addWidget(new_page)

def remove_current_page(self):
    current_widget = self.stacked_widget.currentWidget()
    if current_widget:
        self.stacked_widget.removeWidget(current_widget)
        current_widget.deleteLater()  # 释放内存

动画效果

Qt 默认不提供切换动画,但可以通过自定义实现淡入淡出或滑动效果。例如使用 QPropertyAnimation

from PyQt5.QtCore import QPropertyAnimation, QEasingCurve

def switch_page_with_animation(self, index):
    # 创建动画
    animation = QPropertyAnimation(self.stacked_widget, b"pos")
    animation.setDuration(300)
    animation.setEasingCurve(QEasingCurve.OutQuad)
    
    # 当前页面向左滑出,新页面向右滑入
    current_pos = self.stacked_widget.pos()
    animation.setStartValue(current_pos)
    animation.setEndValue(current_pos - QPoint(100, 0))
    animation.start()
    
    # 切换页面后重置位置
    self.stacked_widget.setCurrentIndex(index)
    self.stacked_widget.move(current_pos + QPoint(100, 0))

典型场景

  1. 向导式界面:分步骤填写表单。
  2. 设置面板:通过侧边栏切换不同设置页。
  3. 动态视图切换:如列表视图/网格视图切换。

注意事项

  • 确保页面切换逻辑不会导致索引越界(例如 currentIndex >= count())。
  • 如果页面包含大量资源,移除时调用 deleteLater() 防止内存泄漏。
  • 使用 QStackedWidget 时,通常需要自行管理导航逻辑(如按钮或菜单)。

通过灵活使用 QStackedWidget,可以轻松实现复杂的多界面切换功能!

QStackedWidgetPyQt 中一个非常实用的控件,它可以实现分页效果,让用户在不同页面之间切换。下面是使用 QStackedWidget 实现分页效果的基本步骤: 1. 导入必要的模块: ```python from PyQt5.QtWidgets import QApplication, QWidget, QStackedWidget, QVBoxLayout, QPushButton ``` 2. 创建主窗口类: ```python class MainWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QStackedWidget 分页示例") # 创建 QStackedWidget 对象 self.stack = QStackedWidget(self) # 创建多个页面 self.page1 = QWidget() self.page2 = QWidget() # 将页面添加到 QStackedWidget 中 self.stack.addWidget(self.page1) self.stack.addWidget(self.page2) # 设置页面布局 self.setup_page1() self.setup_page2() # 创建导航按钮 self.btn_next = QPushButton("下一页", self) self.btn_next.clicked.connect(self.next_page) # 设置主布局 layout = QVBoxLayout() layout.addWidget(self.stack) layout.addWidget(self.btn_next) self.setLayout(layout) def setup_page1(self): layout = QVBoxLayout() layout.addWidget(QLabel("这是第一页")) self.page1.setLayout(layout) def setup_page2(self): layout = QVBoxLayout() layout.addWidget(QLabel("这是第二页")) self.page2.setLayout(layout) def next_page(self): current_index = self.stack.currentIndex() if current_index < self.stack.count() - 1: self.stack.setCurrentIndex(current_index + 1) else: self.stack.setCurrentIndex(0) ``` 3. 运行应用程序: ```python if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在这个示例中,我们创建了一个主窗口,其中包含一个 QStackedWidget 和一个"下一页"按钮。QStackedWidget 中添加了两个页面,每个页面都有一个标签。我们通过 next_page 方法来实现页面切换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水瓶丫头站住

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值