PyQt6第五章容器布局之5.2窗口布局(5.2.1堆栈窗口:QStackedWidget)

本文介绍了如何在PyQt6中使用QStackedWidget创建一个堆叠窗口,通过QListWidget控制不同窗口的显示,并展示了如何设置窗口布局、控件和信号槽连接。
摘要由CSDN通过智能技术生成

 5.2.1堆栈窗口:QStackedWidget

堆叠窗口部件为一系列窗口部件的堆叠,属于QStackedWidget类,可以填充多个页面,但同一时间只有一个页可以显示。常用方法如下:

int addWidget(w):增加页面窗口w,返回新增加堆叠窗的索引值

int insertWidget(index,w):在指定索引增加页面窗口w。从0计数,如果超出范围,则在最后添加

widget(index):从堆叠窗口部件中取指定索引的堆叠窗实例对象,如果index超出范围则返回None

currentWidget():获取当前页面窗口对象,如果没有当前窗口则返回None。

indexOf(w):取页面窗口对象在堆叠窗部件中的索引

removeWidget(w):移除指定的对应页面窗口。可以通过widget()方法获取部件widget对象。它只是移除了索引对应窗口,并没有删除窗口实例对象。

【例5.4】QStackedWidget 堆栈窗口测试。根据选择的列表项显示对应的堆栈窗口页,如下:
import sys  # 导入sys模块,用于与Python解释器交互

from PyQt6.QtCore import *  # 从PyQt6库中导入QtCore模块的所有内容
from PyQt6.QtGui import *  # 从PyQt6库中导入QtGui模块的所有内容
from PyQt6.QtWidgets import *  # 从PyQt6库中导入QtWidgets模块的所有内容


class myWidget(QWidget):  # 定义一个名为myWidget的类,继承自QWidget

    def __init__(self):  # 类的构造函数,用于初始化对象
        super(myWidget, self).__init__()  # 调用父类QWidget的构造函数

        self.setGeometry(300, 50, 10, 10)  # 设置窗口的位置和大小(这里的大小设置可能过小,实际使用时应调整)
        self.setWindowTitle("QStackedWidget测试")  # 设置窗口的标题

        self.list = QListWidget()  # 创建一个QListWidget对象,用于显示列表

        self.list.insertItem(0, "基本信息")  # 在列表的第0个位置插入"基本信息"
        self.list.insertItem(1, "编程语言")  # 在列表的第1个位置插入"编程语言"

        # 列表的当前行改变时触发display_Win函数
        self.list.currentRowChanged.connect(self.display_Win)

        self.w1 = QWidget()  # 创建第一个QWidget对象,用于显示基本信息
        self.w2 = QWidget()  # 创建第二个QWidget对象,用于显示编程语言信息

        self.w1_UI()  # 调用函数设置第一个窗口的UI
        self.w2_UI()  # 调用函数设置第二个窗口的UI

        # 创建一个QStackedWidget对象,用于管理多个子窗口
        self.stack = QStackedWidget()

        # 将之前创建的两个窗口添加到堆栈窗口中
        self.stack.addWidget(self.w1)
        self.stack.addWidget(self.w2)

        hbox = QHBoxLayout()  # 创建一个水平布局管理器

        hbox.addWidget(self.list)  # 将列表添加到水平布局中
        hbox.addWidget(self.stack)  # 将堆栈窗口添加到水平布局中

        self.setLayout(hbox)  # 将水平布局设置为窗口的布局

    def w1_UI(self):  # 定义函数,用于设置第一个窗口的UI
        fLayout = QFormLayout()  # 创建一个表单布局管理器

        self.xm = QLineEdit()  # 创建一个文本输入框,用于输入姓名
        fLayout.addRow('姓名: ', self.xm)  # 将姓名标签和输入框添加到表单布局中

        self.xb1 = QRadioButton('男')  # 创建一个单选按钮,表示性别为男
        self.xb2 = QRadioButton('女')  # 创建一个单选按钮,表示性别为女
        self.xb1.setChecked(True)  # 默认选中男单选按钮

        hLay = QHBoxLayout()  # 创建一个水平布局管理器
        hLay.addWidget(self.xb1)  # 将男单选按钮添加到水平布局中
        hLay.addWidget(self.xb2)  # 将女单选按钮添加到水平布局中

        fLayout.addRow('性别: ', hLay)  # 将性别标签和水平布局添加到表单布局中

        self.csny = QLineEdit()  # 创建一个文本输入框,用于输入出生年月
        fLayout.addRow('出生年月: ', self.csny)  # 将出生年月标签和输入框添加到表单布局中

        btn = QPushButton("确定")  # 创建一个按钮,用于触发确定操作
        btn.clicked.connect(self.clickedFunc)  # 按钮点击时触发clickedFunc函数

        fLayout.addRow(' ', btn)  # 将按钮添加到表单布局中

        self.w1.setLayout(fLayout)  # 将表单布局设置为第一个窗口的布局

    def w2_UI(self):  # 定义函数,用于设置第二个窗口的UI
        vLay = QVBoxLayout()  # 创建一个垂直布局管理器

        self.cb1 = QCheckBox('C++')  # 创建一个复选框,表示编程语言为C++
        self.cb2 = QCheckBox('Java')  # 创建一个复选框,表示编程语言为Java
        self.cb3 = QCheckBox('C#')  # 创建一个复选框,表示编程语言为C#
        self.cb1.setChecked(True)  # 默认选中
        # 添加第一个组合框控件到垂直布局中
        vLay.addWidget(self.cb1)
        # 添加第二个组合框控件到垂直布局中
        vLay.addWidget(self.cb2)
        # 添加第三个组合框控件到垂直布局中
        vLay.addWidget(self.cb3)
        # 将垂直布局vLay设置到窗口w2上
        self.w2.setLayout(vLay)

    # 定义一个方法,用于显示当前索引对应的堆栈页面
    def display_Win(self, index):
        # 设置堆栈窗口的当前索引为传入的index
        self.stack.setCurrentIndex(index)

        # 定义一个方法,用于处理点击事件

    def clickedFunc(self):
        # 打印xm控件的文本内容
        print(self.xm.text())

        # 打印csny控件的文本内容
        print(self.csny.text())

        # 判断xb1是否被选中
        if self.xb1.isChecked():
            # 如果xb1被选中,打印xb1的文本内容
            print(self.xb1.text())
        else:
            # 如果xb1没有被选中,打印xb2的文本内容
            print(self.xb2.text())

            # 判断cb1是否被选中
        if self.cb1.isChecked():
            # 如果cb1被选中,打印cb1的文本内容
            print(self.cb1.text())

            # 判断cb2是否被选中
        if self.cb2.isChecked():
            # 如果cb2被选中,打印cb2的文本内容
            print(self.cb2.text())

            # 判断cb3是否被选中
        if self.cb3.isChecked():
            # 如果cb3被选中,打印cb3的文本内容
            print(self.cb3.text())

            # 如果当前脚本是主程序运行,而不是被其他脚本导入

if __name__ == "__main__":
    # 创建一个QApplication对象,这是使用Qt GUI应用程序所必需的
    app = QApplication(sys.argv)

    # 创建一个myWidget类的实例
    w = myWidget()

    # 显示窗口w
    w.show()

    # 运行应用程序的事件循环,直到应用程序退出
    sys.exit(app.exec())

这段代码使用了PyQt6库来创建一个简单的图形用户界面应用程序。以下是对代码中使用的布局、控件和关键语句的详细解释:

布局(Layouts)

  1. QHBoxLayout (水平布局): 用于水平排列控件。在这个例子中,它被用来将QListWidget(列表控件)和QStackedWidget(堆栈窗口)放在一起。
  2. QFormLayout: 用于创建表单布局,其中标签和字段成对出现。在w1_UI函数中,它被用来排列姓名、性别和出生年月的输入字段。
  3. QVBoxLayout (垂直布局): 用于垂直排列控件。在w2_UI函数中,它被用来垂直排列三个复选框。

控件(Controls)

  1. QWidget: 基础窗口部件,其他所有部件都是它的子类或与之关联。
  2. QListWidget: 显示一个项目列表的控件。在这个例子中,它被用来显示“基本信息”和“编程语言”两个选项。
  3. QStackedWidget: 可以包含多个子窗口部件,但一次只显示一个。在这个例子中,它被用来根据列表的选择来显示不同的表单。
  4. QLineEdit: 单行文本输入框。
  5. QRadioButton: 单选按钮,允许用户从多个选项中选择一个。
  6. QCheckBox: 复选框,允许用户选择多个选项。
  7. QPushButton: 按钮控件,用户可以点击它来触发一个事件。

关键语句

  1. 信号与槽的连接:

    • self.list.currentRowChanged.connect(self.display_Win): 当列表中的当前行改变时,触发display_Win方法。
    • btn.clicked.connect(self.clickedFunc): 当按钮被点击时,触发clickedFunc方法。
  2. 设置布局:

    • self.setLayout(hbox): 设置窗口的主布局为hbox
    • self.w1.setLayout(fLayout): 设置w1窗口的布局为fLayout
    • self.w2.setLayout(vLay): 设置w2窗口的布局为vLay
  3. 添加控件到布局:

    • hbox.addWidget(self.list): 将列表控件添加到水平布局中。
    • hLay.addWidget(self.xb1): 将单选按钮添加到水平布局中。
    • 等等...
  4. 设置控件属性:

    • self.setGeometry(300, 50, 10, 10): 设置窗口的初始位置和大小。
    • self.setWindowTitle("QStackedWidget测试"): 设置窗口的标题。
    • self.list.insertItem(0, "基本信息"): 在列表中插入一个项目。
    • self.xb1.setChecked(True): 设置单选按钮为选中状态。

这段代码通过布局和控件的组合,创建了一个简单的界面,用户可以通过选择列表中的项目来查看和编辑不同的表单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值