入门 PyQt6 看过来(案例)16~ 竖状菜单

本文依照上一篇文章进行简单的拓展,做一个竖状的堆栈菜单。效果如下:

首先我们先进行分析以,页面左侧是菜单栏,按照堆栈式列表展示,包含基本信息和编程语言(仔细的你是否发现路老师文字写错了?),右侧实现的是不同的栏目里的内容表单。下面我们开始进行设计:

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())

本文到此结束,有本事你就别点赞,别关注我。路老师一生清贫,上有老下有小,让我一个人默默的付出吧!

相关推荐
Lsir10110_14 分钟前
从按钮“点不动“讲起——深入理解 Qt 信号槽机制
开发语言·qt·信号处理
君科程序定做16 分钟前
用 IDL 处理高分一号(GF-1 / GF-1B/C/D)数据
c语言·开发语言
敲代码的嘎仔19 分钟前
用 Redis 合并写 + DelayQueue 延迟检测,把视频播放进度写库频率降到 1/60
java·开发语言·数据库·redis·缓存·音视频·高并发
承渊政道31 分钟前
Python IDLE鸿蒙PC适配全记录:用 ArkUI 重建编辑、运行、Shell 与基础调试闭环
python·microsoft·harmonyos·鸿蒙系统·pc端
StarDream-Online33 分钟前
Windows 下 uv 安装与配置完全指南(含环境变量设置)
windows·uv
zjh90053033 分钟前
Kotlin黑科技:空安全与Java兼容性深度解析
python
代码中介商1 小时前
C++ 预约系统实战(一):项目总览与 C/S 架构设计
c语言·开发语言·c++
谢亮_vipxieliang1 小时前
ValidX时间段验证详解:ISO 8601标准与简化格式
java·spring boot·后端·spring·spring cloud·hibernate
黄昏恋慕黎明1 小时前
博客论坛技术迭代
python·pytest
我叫汪枫1 小时前
RAG 进阶:切分、检索、重排序,以及它和 Agent、微调、MCP 都是什么关系
开发语言·python