堆栈控件QStackedWidget 01

90 阅读1分钟

堆栈控件和标签页控件相似,可以让多个界面共享同一块区域,不同的是,堆栈控件不提供选项卡,而是将各个界面按照层级顺序上下摆放的。QStackedWidget通常需要搭配其他控件来实现切换效果。

Kapture 2025-05-11 at 00.18.29.gif

from PyQt6.QtGui import QPixmap
from PyQt6.QtWidgets import (QApplication, QWidget, QStackedWidget,
                             QHBoxLayout, QPushButton, QVBoxLayout, QLabel)
import sys
from PyQt6.QtCore import Qt


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.ui()

    def ui(self):
        self.setWindowTitle("QStackedWidget学习")
        self.resize(600, 500)  # 设置窗口大小

        # 创建堆叠窗口
        self.stack_widget = QStackedWidget()

        # 创建按钮布局
        btn_layout = QHBoxLayout()
        self.btn1 = QPushButton("显示图片1")
        self.btn2 = QPushButton("显示图片2")
        self.btn3 = QPushButton("显示图片3")
        btn_layout.addWidget(self.btn1)
        btn_layout.addWidget(self.btn2)
        btn_layout.addWidget(self.btn3)

        # 创建并设置图片标签
        self.label1 = QLabel()
        pixmap1 = QPixmap(
            "/Users/wangjien/PycharmProjects/pythonGit/PyQt6学习/2_书籍学习/2_2_控件/Qsplitter_test/mei1.jpeg")
        self.label1.setPixmap(pixmap1.scaled(400, 400,
                                             Qt.AspectRatioMode.KeepAspectRatio,
                                             Qt.TransformationMode.SmoothTransformation))
        self.label1.setAlignment(Qt.AlignmentFlag.AlignCenter)

        self.label2 = QLabel()
        pixmap2 = QPixmap(
            "/Users/wangjien/PycharmProjects/pythonGit/PyQt6学习/2_书籍学习/2_2_控件/Qsplitter_test/mei2.jpeg")
        self.label2.setPixmap(pixmap2.scaled(400, 400,
                                             Qt.AspectRatioMode.KeepAspectRatio,
                                             Qt.TransformationMode.SmoothTransformation))
        self.label2.setAlignment(Qt.AlignmentFlag.AlignCenter)

        self.label3 = QLabel()
        pixmap3 = QPixmap(
            "/Users/wangjien/PycharmProjects/pythonGit/PyQt6学习/2_书籍学习/2_2_控件/Qsplitter_test/mei3.jpg")
        self.label3.setPixmap(pixmap3.scaled(400, 400,
                                             Qt.AspectRatioMode.KeepAspectRatio,
                                             Qt.TransformationMode.SmoothTransformation))
        self.label3.setAlignment(Qt.AlignmentFlag.AlignCenter)

        # 添加widget到堆叠窗口
        self.stack_widget.addWidget(self.label1)  # 索引0
        self.stack_widget.addWidget(self.label2)  # 索引1
        self.stack_widget.addWidget(self.label3)  # 索引2

        # 主布局
        main_layout = QVBoxLayout()
        main_layout.addLayout(btn_layout)
        main_layout.addWidget(self.stack_widget)
        self.setLayout(main_layout)

        # 连接信号槽
        self.btn1.clicked.connect(lambda: self.stack_widget.setCurrentIndex(0))
        self.btn2.clicked.connect(lambda: self.stack_widget.setCurrentIndex(1))
        self.btn3.clicked.connect(lambda: self.stack_widget.setCurrentIndex(2))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())