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