Qt Designer,仿作一个ui界面的练习(四):编写代码

news2025/1/11 22:46:42

一、新建项目,目录结构如图:

 PYS下存放脚本,SRC下存放资源文件,UIS下存放组态画面文件。

在每个子目录下都有__init__.py文件,系统会自动将其识别为软件包。

其中一个UIS.__init__.py文件的内容:

# import os

# 定义需要导入主脚本的所有画面,这是自动的方法,优点是可以自动生成画面列表,缺点是在主脚本中不能自动识别画面
# all_py = []
# for file in os.listdir('../UIS'):
#     file_name, file_extension = os.path.splitext(file)
#     if file_extension == '.py' and file_name != '__init__':
#         all_py.append(file_name)
# __all__ = all_py
# 手动定义需要导入的画面列表,在主脚本中可以自动识别画面名称
__all__ = ['demo_ui']   # 导入画面

__all__列表定义了在别的脚本中调用本软件包,例如:

from UIS import *

需要导入的所有脚本列表。

二、使用uic工具将demo.ui转为脚本文件demo_ui.py。

三、使用RCC工具将资源文件media.qrc转为media_rc.py,并将其剪切粘贴至PYS文件夹(由于demo_ui.py是自动生成的,所以它对资源文件media_rc.py的调用时默认脚本文件夹)。

四、编写主脚本:

# encoding: utf-8

import sys
import time
from functools import partial

from PySide6.QtCore import Signal, QTimer, QObject, QPropertyAnimation, QEasingCurve
from PySide6.QtWidgets import QMainWindow, QApplication
# 导入画面
from UIS import *
# 导入脚本
from PYS import *


# 主画面类
class MainWindow(QMainWindow, demo_ui.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.run()  # 初始化
        self.slot_signal()  # 信号与槽

    # 主画面的初始化
    def run(self):
        self.move(200, 200)
        self.show()  # 显示画面
        self.btnHome.setProperty('selected', True)
        self.btnHome.setStyleSheet(self.btnHome.styleSheet())  # 刷新显示)
        # 主画面的左边栏动画定义
        ui.animate_leftFrame = QPropertyAnimation(self.leftFrame, b"minimumWidth")  # 定义动画
        ui.animate_leftFrame.setDuration(300)  # 动画时间
        # 左边栏的按钮站
        self.left_button_station = [x for x in self.left_buttonsBox.children() if x.isWidgetType()]

    # 信号与槽
    def slot_signal(self):
        # 时钟显示槽函数
        def dateTimeShow_setText():
            now = time.localtime()
            time_str = time.strftime("%Y-%m-%d %H:%M:%S", now)
            self.dateTimeShow.setText(time_str)

        ui.secondSignal.connect(dateTimeShow_setText)  # 槽函数的连接

        # toggle按钮点击的槽函数
        def btnToggle_clicked():
            # 执行动画
            JOBS.btn_animation(self.leftFrame, ui.animate_leftFrame)
            # 刷新显示
            for b in self.left_button_station:
                b.setProperty('spread', not b.property('spread'))
                b.setStyleSheet(b.styleSheet())  # 刷新显示

        self.btnToggle.clicked.connect(btnToggle_clicked)

        # 左边栏按钮站点击的槽函数
        def left_buttons_clicked(button):
            def one_btn_clicked():
                # 设置各个按钮的显示外观
                def set_styleSheet():
                    for b in self.left_button_station:
                        if b is not button:
                            b.setProperty('selected', False)
                        else:
                            b.setProperty('selected', True)
                        b.setStyleSheet(b.styleSheet())  # 刷新显示
                set_styleSheet()
                # 每个按钮的功能函数
                if button is self.btnHome:
                    self.stackedWidget.setCurrentWidget(self.page_1)
                elif button is self.btnNew:
                    self.stackedWidget.setCurrentWidget(self.page_2)
                elif button is self.btnSave:
                    self.stackedWidget.setCurrentWidget(self.page_3)
                elif button is self.btnExit:
                    self.stackedWidget.setCurrentWidget(self.page_4)

            return one_btn_clicked

        # 左边栏按钮站的按钮们点击的连接
        for b in self.left_button_station:
            b.clicked.connect(partial(left_buttons_clicked(b)))


# 项目的定义
class UI(QObject):  # 将项目定义为QObject,用来管理项目级别的信号和变量
    secondSignal = Signal()  # 这是一个项目级别的信号,每秒发出一个信号

    def __init__(self):
        super().__init__()
        self.timer = QTimer()  # 一个项目级别的定时器
        self.run()  # 初始化
        self.slot_signal()  # 信号与槽

    # 项目的初始化
    def run(self):
        self.timer.start(1000)  # 定时器启动

    # 信号与槽
    def slot_signal(self):
        # 定时器超时槽函数
        def self_timer_timeout():
            self.secondSignal.emit()  # 秒信号发射

        self.timer.timeout.connect(self_timer_timeout)


# 工作函数
class JOBS:
    @staticmethod
    # 按钮的动画
    def btn_animation(obj, animation, start=50, end=150):
        start_size = obj.width()
        if obj.width() == start:
            end_size = end
        else:
            end_size = start
        animation.setStartValue(start_size)
        animation.setEndValue(end_size)
        # animation.setEasingCurve(QEasingCurve.Linear)
        animation.setEasingCurve(QEasingCurve.InOutQuart)
        animation.start()

    # 工作函数2
    @staticmethod
    def Job_todo_2(var):
        pass


# #############################主程序##################################
if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 项目的实例化
    ui = UI()
    ui.windows = []  # 所有用到的窗口

    # 初始化画面
    mainWindow = MainWindow()  # 主画面实例化
    ui.windows.append(mainWindow)

    sys.exit(app.exec())

至此,完成了一个小项目的demo。 这里没有像参考范例中那样搞专门的功能脚本文件夹,一方面是因为项目比较小没必要,另一方面,把功能函数放在主函数内更方便,因为可以直接在功能函数中操作一些项目范围内的全局变量,不用传递对象,更方便一些。

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

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

相关文章

手撕数据结构02--二分搜索(附源码)

一、理论基础 二分搜索,也称折半搜索、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。 二分搜索是一种高效的查找算法,适用于在已排序的数组中查找特定元素。它的基本思想是通过不断将搜索区间对半分割,从而快速缩小…

ROOM数据快速入门

ROOM数据库快速入门 文章目录 ROOM数据库快速入门第一章 准备工作第01节 引入库第02节 布局文件第03节 activity类第04节 效果图 第二章 数据类第01节 实体类(表)第02节 数据访问类(DAO)第03节 数据Service层第04节 RoomDataBase …

达梦数据库DPI 实现两个数据库数据互通

链接字符串是目标访问链接 目标访问用户名 口令实现 31 里访问33库的数据 如果在31上建立视图访问33的某个表 AS SELECT SZZJ.sys_user.id FROM SZZJ.sys_userszzj31_szzj33;

护眼灯哪些牌子好?五款专业护眼灯品牌排行推荐

普通台灯长时间使用下来,眼睛疲劳、酸涩。但当作业或者工作没有做完的时候,还得硬着头皮撑着。大家是不是经常为这种事情发愁?于是,护眼台灯被设计出来了,但市面上出现的护眼台灯种类多,质量也是难以保证&a…

开发进度网站带后台源码

【源码介绍】 后台地址是:admin.php 后台没有账号密码 这个没有数据库 有能力的可以自己改 【搭建教程】 1.源码上传至虚拟机或者服务器 2.绑定域名和目录 3.访问域名安装, 4.安装完成后就行了 注:资源均网络搬运 仅供测试学习使用&#xff…

【数据结构与算法】队列(顺序存储)

队列 一.队列的原理二.队列的结构三.队列初始化四.判断队列是否满或空1.是否为满2.是否为空 五.入队操作六.队列的遍历七.出队操作1.前移2.后指 八.其他小接口1.获取队列首元素2.获取队列长度3.清除队列 酒.总结 一.队列的原理 队列也是一种线性结构,只不过是一种受限制的线性…

微服务面试-分布式 注册中心 远程调用 保护

标红的原理还是不太熟悉 重新看 分布式事务 CAP理论 Consistency(一致性) Availability(可用性) Partition tolerance (分区容错性) BASE 理论 就是做取舍 cap三选二 AT模式脏写 TCC模式 注册中…

25考研数据结构复习·6.4图的应用

最小生成树 Prim算法 从某一顶点开始构建生成树;每次将代价最小的新顶点纳入生成树,知道所有顶点都纳入为止。 时间复杂度O(|V|^2) 适合用于边稠密图 实现思想 从V0开始,总共需要n-1轮处理 每一轮处理:循环遍历所有结点&…

京东商品详情API:多规格商品的返回值处理

处理京东商品详情API中关于多规格商品的返回值,首先需要了解京东API的返回数据结构。通常,对于多规格商品(如不同颜色、尺寸等选项的商品),API会返回一个包含多个规格选项和对应价格、库存等信息的复杂数据结构。 以下…

java中 VO DTO BO PO DAO

VO、DTO、BO、PO、DO、POJO 数据模型的理解和实际使用_vo dto bo-CSDN博客 深入理解Java Web开发中的PO、VO、DTO、DAO和BO概念_java dto dao-CSDN博客

汇凯金业:区块链的介绍和应用场景

区块链, 一个近年来炙手可热的技术名词, 它就像一颗耀眼的明星, 吸引着人们的目光, 引发着人们的思考。 究竟什么是区块链? 它为何能够引发如此巨大的关注? 它又将如何改变我们的未来? 一、 区块链: 去中心化的信任…

中仕公考:什么是事业编?

事业编制内的职员是指那些经过考试选拔,成功进入公共机构服务,同时在人事部门和组织部有正规记录的个体。 入职条件: 要求应聘者参与由事业单位举办的公开招聘考试。 管理方式: 事业编制内职员的人事管理由当地的人事部门或相…

02 RabbitMQ:下载安装

02 RabbitMQ:下载&安装 1. 下载&安装1.1. 官网1.2. Docker方式1.2.1. 下载镜像1.2.2. 启动1.2.3. 登录验证 1. 下载&安装 1.1. 官网 RabbitMQ: One broker to queue them all | RabbitMQ 1.2. Docker方式 1.2.1. 下载镜像 # docker pull 镜像名称[…

Windows API钩子

原文链接:https://www.cnblogs.com/zhaotianff/p/18073138 有前面的文章中,我介绍了一个Windows API的监控工具(API Monitor)的使用。它内部就是使用了Hook机制,能Hook Windows API,能在我们钩选的API函数…

C++必备知识--类和对象

类的定义 格式 class是类的关键字,Stack是类的名字(自己定义的),在{}中定义类的主体。C中类的出现是为了替代C语言中的结构体,所以类的结构与结构体类似,{}之后需要加分号。类体中的内容称为类的成员,类中(声明)的变量…

国内优秀的消防报警设备企业「三江电子」×企企通启动采购数字化项目,共筑消防电子产品数字化新篇章

近日,深圳市高新投三江电子股份有限公司(以下简称“三江电子”)与企企通成功召开SRM采购供应链管理项目启动会。三江电子副总经理黄总、副总经理沈总、企企通高级副总裁徐总,以及双方项目负责人和项目组成员一同出席本次启动会。 …

AlmaLinux9安装中文语言包_zabbix没有中文语言包

更新你的系统包,如果系统最新可以忽略: sudo dnf update安装中文简体语言包 sudo yum install langpacks-zh_CN安装繁体中文包 sudo dnf install kde-l10n-Chinese-traditional安装完成后重启系统,以确保语言设置生效 设置系统为简体中文&…

《昇思25天学习打卡营第25天|第28天》

今天是打卡的第二十八天,实践应用篇中的计算机视觉中Vision Transformer图像分类。 从Vision Transformer(ViT)简介开始了解,模型结构,模型特点,实验的环境准备和数据读取,模型解析&#xff08…

Vue学习---vue 项目结构

这只是一个基础的目录结构,根据项目的复杂性和规模,可能会有所不同。 node_modules 项目依赖文件,其中包括很多基础依赖和自己安装的依赖。 public 存放公共资源和项目的主入口文件inde…

详细分析Sql Server索引的创建、查询、删除等基本知识(附Demo)

目录 前言1. 基本知识2. 索引2.1 创建2.2 删除2.3 查询 3. 总结 前言 原先分析过Sql的基本知识,感兴趣也可阅读: Mysql的两种存储引擎详细分析及区别(全)Mysql优化高级篇(全) 1. 基本知识 索引是在数据…