本文依照上一篇文章进行简单的拓展,做一个竖状的堆栈菜单。效果如下:
首先我们先进行分析以,页面左侧是菜单栏,按照堆栈式列表展示,包含基本信息和编程语言(仔细的你是否发现路老师文字写错了?),右侧实现的是不同的栏目里的内容表单。下面我们开始进行设计:
1 界面分析
基本信息和编程语言部分是一个列表,用QListWidget类。基本信息对应的选项页面用到的是表单输入框和单选按钮以及按钮。编程信息页面就只有多选按钮。
2 列表创建
python
#常见列表窗口,加入两个列表项
self.list=QListWidget()
self.list.insertItem(0,"基本信息")
self.list.insertItem(1,"编成语言")
#单击选择列表行关联槽函数
self.list.currentRowChanged.connect(self.display_Win)
当点击列表的时候会触发后面的页面切换,并创建栈对象QStackedWidget(),此时创建页面。
python
#创建两个QWidget通用窗口w1,w2,在w1、w2窗口中加入控件
self.w1=QWidget()
self.w2=QWidget()
self.w1_UI()
self.w2_UI()
#创建堆栈窗口,将两个通用窗口添加到堆栈窗口页面中
self.stack=QStackedWidget()
self.stack.addWidget(self.w1)
self.stack.addWidget(self.w2)
创建个布局,把列表和栈都放到布局hbox里。
python
#将列表和堆栈窗口放到水平布局中
hbox=QHBoxLayout()
hbox.addWidget(self.list)
hbox.addWidget(self.stack)
self.setLayout(hbox)
第一个窗口页面UI是这样的:
对应代码如下:
python
#创建第一个通用窗口
def w1_UI(self):
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)
fLayout.addRow(' ',btn)
self.w1.setLayout(fLayout)
第二个窗口是这样的:
其对应代码如下:
python
def w2_UI(self):
vLay=QVBoxLayout()
self.cb1=QCheckBox("C++")
self.cb2=QCheckBox("Java")
self.cb3=QCheckBox("C#")
self.cb1.setChecked(True)
vLay.addWidget(self.cb1)
vLay.addWidget(self.cb2)
vLay.addWidget(self.cb3)
self.w2.setLayout(vLay)
然后我们使用槽函数,实现点击每个按钮都触发事件。
python
#由当前列表窗口项切换到对应的堆栈窗口页面
def display_Win(self,index):
self.stack.setCurrentIndex(index)
#命令按钮显示两个堆栈页面控件内容
def clickedFunc(self):
print(self.xm.text())
print(self.csny.text())
if self.xb1.isChecked():
print(self.xb1.text())
else:
print(self.xb2.text())
# 编程语言控件内容
if self.cb1.isChecked():
print(self.cb1.text())
if self.cb2.isChecked():
print(self.cb2.text())
if self.cb3.isChecked():
print(self.cb3.text())
3 完整代码
python
# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: 堆栈窗口.py
Description:
Author: lzq
date:2024-07-28 17:15
------------------------------------------------
"""
import sys
from PyQt6.QtWidgets import QDialog, QPushButton, QVBoxLayout, QApplication, QWidget, QListWidget, QStackedWidget, \
QHBoxLayout, QFormLayout, QLineEdit, QRadioButton, QCheckBox
class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
self.setWindowTitle("QStackedWidget测试")
self.setGeometry(300,50,10,10)
#常见列表窗口,加入两个列表项
self.list=QListWidget()
self.list.insertItem(0,"基本信息")
self.list.insertItem(1,"编成语言")
#单击选择列表行关联槽函数
self.list.currentRowChanged.connect(self.display_Win)
#创建两个QWidget通用窗口w1,w2,在w1、w2窗口中加入控件
self.w1=QWidget()
self.w2=QWidget()
self.w1_UI()
self.w2_UI()
#创建堆栈窗口,将两个通用窗口添加到堆栈窗口页面中
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):
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)
fLayout.addRow(' ',btn)
self.w1.setLayout(fLayout)
def w2_UI(self):
vLay=QVBoxLayout()
self.cb1=QCheckBox("C++")
self.cb2=QCheckBox("Java")
self.cb3=QCheckBox("C#")
self.cb1.setChecked(True)
vLay.addWidget(self.cb1)
vLay.addWidget(self.cb2)
vLay.addWidget(self.cb3)
self.w2.setLayout(vLay)
#由当前列表窗口项切换到对应的堆栈窗口页面
def display_Win(self,index):
self.stack.setCurrentIndex(index)
#命令按钮显示两个堆栈页面控件内容
def clickedFunc(self):
print(self.xm.text())
print(self.csny.text())
if self.xb1.isChecked():
print(self.xb1.text())
else:
print(self.xb2.text())
# 编程语言控件内容
if self.cb1.isChecked():
print(self.cb1.text())
if self.cb2.isChecked():
print(self.cb2.text())
if self.cb3.isChecked():
print(self.cb3.text())
if __name__=='__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec())