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)
- QHBoxLayout (水平布局): 用于水平排列控件。在这个例子中,它被用来将
QListWidget
(列表控件)和QStackedWidget
(堆栈窗口)放在一起。 - QFormLayout: 用于创建表单布局,其中标签和字段成对出现。在
w1_UI
函数中,它被用来排列姓名、性别和出生年月的输入字段。 - QVBoxLayout (垂直布局): 用于垂直排列控件。在
w2_UI
函数中,它被用来垂直排列三个复选框。
控件(Controls)
- QWidget: 基础窗口部件,其他所有部件都是它的子类或与之关联。
- QListWidget: 显示一个项目列表的控件。在这个例子中,它被用来显示“基本信息”和“编程语言”两个选项。
- QStackedWidget: 可以包含多个子窗口部件,但一次只显示一个。在这个例子中,它被用来根据列表的选择来显示不同的表单。
- QLineEdit: 单行文本输入框。
- QRadioButton: 单选按钮,允许用户从多个选项中选择一个。
- QCheckBox: 复选框,允许用户选择多个选项。
- QPushButton: 按钮控件,用户可以点击它来触发一个事件。
关键语句
-
信号与槽的连接:
self.list.currentRowChanged.connect(self.display_Win)
: 当列表中的当前行改变时,触发display_Win
方法。btn.clicked.connect(self.clickedFunc)
: 当按钮被点击时,触发clickedFunc
方法。
-
设置布局:
self.setLayout(hbox)
: 设置窗口的主布局为hbox
。self.w1.setLayout(fLayout)
: 设置w1
窗口的布局为fLayout
。self.w2.setLayout(vLay)
: 设置w2
窗口的布局为vLay
。
-
添加控件到布局:
hbox.addWidget(self.list)
: 将列表控件添加到水平布局中。hLay.addWidget(self.xb1)
: 将单选按钮添加到水平布局中。- 等等...
-
设置控件属性:
self.setGeometry(300, 50, 10, 10)
: 设置窗口的初始位置和大小。self.setWindowTitle("QStackedWidget测试")
: 设置窗口的标题。self.list.insertItem(0, "基本信息")
: 在列表中插入一个项目。self.xb1.setChecked(True)
: 设置单选按钮为选中状态。