PyQt5 基本布局管理 及 信号槽机制

news2024/11/18 11:33:25

一:布局设计 & 信号槽机制

效果实现如下:

对于窗口整体设计左右布局

对于左边布局,包括有水平布局(用户信息 左上方一块)+垂直布局(多个按钮 左下方一块)

对于右边布局,主要是窗口切换,通过按下左边布局的左下方侧按钮,可以实现窗口切换(如下,以颜色来区分窗口,每左下方不同的按钮都可以切换到对应的窗口【信号槽】)

源码实现如下

import sys
# 所有窗口的基类
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from loginWin import LoginWin


class MainWin(QWidget):
    def __init__(self):
        super().__init__()  # 实现父类的构造函数
        # 窗口设置标题、图标、窗口大小
        self.setWindowTitle("智能垃圾分类回收系统主界面")
        self.setFixedSize(1000, 700)
        self.setWindowIcon(QIcon("../img/trashIcon.png"))
        self.init_control()  # 初始化控件
        self.init_connect()  # 初始化信号和槽

    def init_control(self):
        self.totalBoxLayout = QHBoxLayout()
        # 左
        self.leftView = QWidget(self)
        self.leftView.setStyleSheet("background:pink")
        # 左 设计 垂直 上下
        self.leftLayout = QVBoxLayout()
        # 左上 start  水平
        self.userView = QWidget(self)
        self.userLayout = QHBoxLayout()
        self.imgLabel = QLabel(self)
        self.imgLabel.setPixmap(QPixmap("../img/trashIcon.png").scaled(30, 30))
        self.imgLabel.setMinimumSize(30, 30)
        self.loginWin = LoginWin()
        self.loginBtn = QPushButton("请登录", self)
        self.loginBtn.setMinimumSize(20, 20)
        self.userLabel = QLabel("你好XXX", self)
        self.userLabel.setMinimumWidth(150)
        self.userLabel.hide()
        self.userLayout.addWidget(self.imgLabel)
        self.userLayout.addWidget(self.loginBtn)
        self.userLayout.addWidget(self.userLabel)
        self.userView.setLayout(self.userLayout)
        # 左上 end
        # 左下 start
        self.userManagerBtn = QPushButton("用户信息管理", self)
        self.recoverBtn = QPushButton("变废为宝模式", self)
        self.monitorBtn = QPushButton("回收点监控模式", self)
        self.articleBtn = QPushButton("回收物品记录", self)
        self.errorBtn = QPushButton("错误分类展示", self)
        self.setBtn = QPushButton("系统设置", self)
        self.leftLayout.addWidget(self.userView)
        self.leftLayout.addWidget(self.userManagerBtn)
        self.leftLayout.addWidget(self.recoverBtn)
        self.leftLayout.addWidget(self.monitorBtn)
        self.leftLayout.addWidget(self.articleBtn)
        self.leftLayout.addWidget(self.errorBtn)
        self.leftLayout.addWidget(self.setBtn)
        self.leftView.setLayout(self.leftLayout)
        # 左 end

        # 右 start
        self.rightView = QStackedWidget()
        self.rightView.setStyleSheet("background:gray")
        # 右 各窗口  点击左侧按钮 信号槽切换窗口
        self.userManageView = QWidget(self)
        self.userManageView.setStyleSheet("background:yellow")
        self.recoverView = QWidget(self)
        self.recoverView.setStyleSheet("background:purple")
        self.monitorView = QWidget(self)
        self.monitorView.setStyleSheet("background:blue")
        self.articleView = QWidget(self)
        self.articleView.setStyleSheet("background:green")
        self.errorView = QWidget(self)
        self.errorView.setStyleSheet("background:red")
        self.setView = QWidget(self)
        self.setView.setStyleSheet("background:black")
        self.rightView.addWidget(self.userManageView)
        self.rightView.addWidget(self.recoverView)
        self.rightView.addWidget(self.monitorView)
        self.rightView.addWidget(self.articleView)
        self.rightView.addWidget(self.errorView)
        self.rightView.addWidget(self.setView)
        # 左右都添加到布局中
        self.totalBoxLayout.addWidget(self.leftView, 3)
        self.totalBoxLayout.addWidget(self.rightView, 9)
        self.totalBoxLayout.setSpacing(0)
        self.totalBoxLayout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.totalBoxLayout)

    def init_connect(self):
        self.userManagerBtn.clicked.connect(self.userManagerBtnClick)
        self.recoverBtn.clicked.connect(self.recoverViewClick)
        self.monitorBtn.clicked.connect(self.monitorViewClick)
        self.articleBtn.clicked.connect(self.articleViewClick)
        self.errorBtn.clicked.connect(self.errorViewClick)
        self.setBtn.clicked.connect(self.setViewClick)
        self.loginBtn.clicked.connect(self.toLoginWin)
        self.loginWin.backMainSignal.connect(self.login_success)

    def userManagerBtnClick(self):
        self.rightView.setCurrentWidget(self.userManageView)

    def recoverViewClick(self):
        self.rightView.setCurrentWidget(self.recoverView)

    def monitorViewClick(self):
        self.rightView.setCurrentWidget(self.monitorView)

    def articleViewClick(self):
        self.rightView.setCurrentWidget(self.articleView)

    def errorViewClick(self):
        self.rightView.setCurrentWidget(self.errorView)

    def setViewClick(self):
        self.rightView.setCurrentWidget(self.setView)

    def toLoginWin(self):
        self.loginWin.show()
        self.hide()

    def login_success(self, username):
        QMessageBox.information(self, "主界面", "欢迎你" + username)
        print("用户名:", username)
        self.loginWin.close()
        self.show()


if __name__ == "__main__":
    # 1创建应用
    app = QApplication(sys.argv)
    # 2创建窗口对象
    mainWin = MainWin()
    # 3窗口显示
    mainWin.show()
    # 4程序持续运行
    sys.exit(app.exec())

二:自定义信号

新建一个py创建窗口

设置自定义信号 ,带参,可以传输str、int等不同数据类型

    # 自定义信号 带参
    backMainSignal = pyqtSignal(str)

设计编写一个函数,触发自定义信号

        # 触发自定义信号
        self.backMainSignal.emit("lily")

需要接收信号的窗口要导入发送信号窗口对应的模块

from loginWin import LoginWin

接收信号的窗口,对发送的信号做出处理响应

self.loginWin.backMainSignal.connect(self.login_success)
    def login_success(self, username):
        QMessageBox.information(self, "主界面", "欢迎你" + username)
        print("用户名:", username)
        self.loginWin.close()
        self.show()

新建窗口(登录窗) 源码实现如下

import sys
# 所有窗口的基类
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class LoginWin(QWidget):
    # 自定义信号 带参
    backMainSignal = pyqtSignal(str)

    def __init__(self):
        super().__init__()  # 实现父类的构造函数
        # 窗口设置标题、图标、窗口大小
        self.setWindowTitle("智能垃圾分类回收登录界面")
        self.setFixedSize(700, 500)
        self.setWindowIcon(QIcon("../img/trashIcon.png"))
        self.init_control()  # 初始化控件
        self.init_connect()  # 初始化信号和槽

    def init_control(self):
        self.loginBtn = QPushButton("登录", self)
        self.loginBtn.move(50, 30)

    def init_connect(self):
        self.loginBtn.clicked.connect(self.doLogin)

    def doLogin(self):
        QMessageBox.information(self, "提示", "登录成功")
        # 触发自定义信号
        self.backMainSignal.emit("lily")


# if __name__ == "__main__":
#     # 1创建应用
#     app = QApplication(sys.argv)
#     # 2创建窗口对象
#     loginWin = LoginWin()
#     # 3窗口显示
#     loginWin.show()
#     # 4程序持续运行
#     sys.exit(app.exec())

最终实现效果:

点击 请登录 按钮,可跳转至登录界面

在登录成功后,可以返回主界面 同时记录下用户信息(账号绑定使用)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLAlchemy连接MySQL及记录的查询、更新、删除、多表关联查询

SQLAlchemy是Python的ORM库,支持多种数据库。 建立连接 连接MySQL要用到Engine,Engine集成了连接池pool和方言Dialect(支持不通数据库的SQL语法),最后都统一成标准DBAPI。 from sqlalchemy import create_engine en…

TypeScript

现在说起TypeScript想必大家都不会陌生的,当初从碎片信息中了解TypeScript,我认为他的变量声明和Rust语言有几分相似,是一门比较严格的语言,今天正式的来学习他 JavaScript易学习,易用,以至于大多数人对于…

软件体系结构 思维导图

软件体系结构 思维导图 软件体系结构思维导图 源文件放在 GitHub 仓库 使用 Xmind 即可打开查看 课程评价 比较抽象和理论化,如果光看 PPT 肯定看不懂,得听课或者看视频 后面实验试图基于 SpringBoot 去实战教学,可惜没系统学过只能照搬…

Kafka Consumer开发

Kafka Consumer - 消费者 跟生产者一样,消费者也属于kafka的客户端,不过kafka消费者是从kafka读取数据的应用,侧重于读数据。一个或多个消费者订阅kafka集群中的topic,并从broker接收topic消息,从而进行业务处理。今天…

一种嵌入式项目的参数保存方案

设计背景 嵌入式项目中,为了保证系统的正常运转,通常需要保存一部分数据至非易失存储设备如flash中。此处提供了一种通用的方案用于快速在项目中集成参数保存功能,该方案有以下几点特征: 接口简便,方便快速集成以及使用…

东北大学2023分布式操作系统实验

1.实验目的 建立伪分布式(有条件的可以建立分布式环境)的Hadoop环境,并成功运行示例程序。 2.Hadoop简介 2.1 Hadoop项目基础结构 在其核心,Hadoop主要有两个层次,即: 加工/计算层(MapReduce)存储层(Ha…

Python pandas有几千个库函数,你用过几个?(1)

对Python的 pandas 库所有的内置元类、函数、子模块等全部浏览一遍,然后挑选一些重点学习一下。我安装的库版本号为1.3.5,如下: >>> import pandas as pd >>> pd.__version__ 1.3.5 >>> print(pd.__doc__)pandas…

C++ STL vector list set map容器循环通过迭代器删除元素注意事项

先说说写这篇博客的原因吧,同事转部门了,把他手头的工作交接给了我。他以前维护的一个模块,会将外部输入的数据缓存起来分段处理,处理完了就会清除缓存数据,最近出现了一个bug,缓存数据一直不清除&#xff…

【SpringMVC】非注解的处理器映射器和适配器

项目目录 1.导入的依赖 pom.xml <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><…

【K3s】第2篇 一篇文章学习实践K3s部署安装

目录 1、docker安装 2、docker-compose安装 3、K3s安装 3.1 k3s与install.sh文件准备 3.2 k3s 安装步骤 4、查看k3s部署状态 1、docker安装 方式一 https://fanjufei.blog.csdn.net/article/details/123500511https://fanjufei.blog.csdn.net/article/details/123500511 …

12.24

接口测试 ​ <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width…

Unity3D异步加载场景SceneManager.LoadSceneAsync()卡住,并不异步,获取process直接到0.9的问题

问题阐述&#xff1a; 一般来说&#xff0c;在加载场景的时候&#xff0c;会因为所加载资源的大小、复杂度、电脑配置等因素导致加载过程耗费一定的时间。虽然这个加载时间是不可避免的&#xff0c;但是在这一小段卡着的时间里如果就这样卡着的话会大大降低玩家体验。 所以很多…

(matlab编程基础)数组的基本操作

目录 1、数组寻址 2、数组元素删除 3、数组查找和排序 &#xff08;1&#xff09;数组查找 &#xff08;2&#xff09;数组排序 4、数组运算 5、数组操作函数 数组操作主要从以下5部分进行介绍:数组寻址、数组元素的删除、数组查找和排序、数组运算和数组操作函数。 1、…

PS CS6视频剪辑基本技巧(五)添加logo、动画和画中画

系列讲座导读 PS CS6视频剪辑基本技巧&#xff08;一&#xff09;CS6可以实现的视频剪辑功能 PS CS6视频剪辑基本技巧&#xff08;二&#xff09;视频剪接和添加图片 PS CS6视频剪辑基本技巧&#xff08;三&#xff09;添加声音和字幕 PS CS6视频剪辑基本技巧&#xff08;四&am…

RMQ - ST表

RMQ - ST表 1、RMQ 简介 RMQ (Range Minimum / Maximum Query) 问题是指&#xff1a;对于长度为 nnn 的数列 AAA&#xff0c;回答若干询问 (A,i,j)(A, i, j)(A,i,j) (1≤i,j≤n)(1≤i,j≤n)(1≤i,j≤n)&#xff0c;返回数列 A 中区间在 [i,j][i,j][i,j] 中的最小 (大) 值所在…

Vue2.0全面教程

Vue2.0 学习视频地址 文章目录Vue2.01.vue 简介1.1.什么是vue1.2.vue的两个特性1.2.1.数据驱动视图1.2.2.双向数据绑定1.3.MVVM概述1.4.MVVM工作原理2.vue的基本使用2.1.基本使用步骤2.2.基本代码与MVVM的对应关系3.vue的调试工具3.1.安装vue-devtool调试工具3.2.配置Chrome浏…

Axios(三)

目录 1.Axios的默认配置 2.Axios创建Ajax实例对象发送请求 3.Axios拦截器 4.Axios取消请求 5.Axios文件结构说明 6.Axios创建过程 7.Axios对象创建过程模拟实现 8.Axios发送请求过程详解 9.模拟实现Axios发送请求 1.Axios的默认配置 <!doctype html> <html …

QT系列第7节 标准对话框使用

QT编程中对话框作为最常用的窗口经常被使用&#xff0c;本节介绍一些QT常用的标准对话框使用。 目录 1.选择单文件 2.选择多文件 3.选择目录 4.文件存储 5.选择颜色 6.选择字体 7.输入字符换/整数/浮点数/条目 8.消息对话框 9.进度对话框 10.向导对话框 1.选择单文件…

【圣诞节限定】今天教你如何用Html+JS+CSS绘制3D动画圣诞树

一、前言 应CSDN的邀请&#xff0c;这次给大家展示一波&#xff0c;如何用H5技术绘制3D圣诞树。 二、创意名 只采用简单的HtmlJSCSS 技术绘制。 三、效果展示 圣诞树修过如下&#xff1a; 四、编码实现 将源码复制保存到html中打开即可。 <!DOCTYPE html> <html lang…

ChatGPT与BimAnt的1小时对话实录【数字孪生】

本文为BimAnt和ChatGPT对数字孪生相关问题的解答&#xff0c;感觉这个AI真的已经“懂”了很多东西&#xff0c;让人恍惚间忘了是在和bot对话。 BimAnt&#xff1a;hello ChatGPT&#xff1a;Hello! How can I help you today? BimAnt&#xff1a;can you speak chinese&am…