基于深度学习的视觉检测小项目(十一) 动态样式表的实践

动态样式表的基础知识:PySide6,定义动态的样式表-CSDN博客

pyside6的小部件种类、功能和从属关系基础知识:PySide6的常用小部件汇总-CSDN博客

        动态样式表的设计思路是使用了类似占位符的概念,设置项和颜色值都用代称,通过改变代称映射的实际值,就可以动态和灵活地改变样式表,这一点,与编程中的变量概念也很相似,暂且称之为伪变量。我看过非常多的pyside的demo,并没有见到过类似的先例,所以一切都是在黑暗中摸索和实践,也许有比我更好的方法,期待高人的指正。

首先通过一个例子说明一下动态样式表的设计思路:

在这里,有两个JSON文件,文件映射了设置名和颜色名的值。内容分别如下:

• 颜色值的映射:

{
  "colors": {
    "红色": "#dc1e1e",
    "浅红": "#ee8f8f",
    "深红": "#6e0f0f",
    "绿色": "#1edc1e",
    "浅绿": "#8fee8f",
    "深绿": "#0f6e0f",
    "蓝色": "#1e1edc",
    "浅蓝": "#8f8fee",
    "深蓝": "#0f0f6e"
}

• 设置值的映射:

{
    "color_setting": {
        "基底色": "深蓝",
        "窗口色": "浅绿",
        "顶部标签色": "黑色",
        "按钮底色": "浅蓝",
        "常规文字色": "深红"
    }
}

然后将样式表定义在文件中,样式表文件的内容demo:

/*########项目级的的样式表都在此设置#######*/
/*##########默认的父类颜色###############*/
QWidget{   /*类型选择器*/
    background-color: 基底色;
    color: 常规文字色
}
.QFrame{   /*类选择器*/
    background-color: 窗口色;
    color: 常规文字色;
}

/*#########按钮的通用默认设置################*/
/*按钮的默认背景色*/
QPushButton {
    background-color: 按钮底色;
}
/*#########顶部标签区颜色设置############*/
/*顶部标签区颜色*/
#form_top {    /*名称选择器*/
    background-color: 顶部标签色;
}
/*顶部标签区的标签文字颜色*/
#form_top QLabel{
    background-color: 基底色;
    color: 文字颜色;
}

        这样的样式表文件,有一个是项目级别的总设置,在总设置里,根据继承关系从父到子逐层设计大类和通用的特性,在总设置里基本就可以涵盖大部分的部件的显示特性。如果有需要,每个窗口可以有自己的附加样式表文件,通过局部的本地设置来实现差异化。通过灵活运用类选择器、类型选择器、以及合适的后代选择器,就可以实现样式表的全局统一设置和本地化的个性设置。

        这次把项目的目录结构做了一个修改,尝试在ui界面的目录中,以画面为单位作为分目录,这样更方便管理,当然了每个人可以根据自己的偏好和能力自己搞结构。

新的目录结构如下图:

项目
├── AI_proj/   # AI相关
│   ├── AI_proj说明.md
│   ├── media/  # AI有关的图像等媒体文件
│   │   ├── mark/
│   │   ├── predict/
│   │   └── source/
│   └── models/
├── DB_proj/    # 数据库相关
│   └── DB_proj说明.md
├── UI_proj/     # 显示界面相关
│   ├── UI_proj说明.md   
│   ├── functions/   # 功能函数
│   │   ├── form_center.py   # 显示居中
│   │   └── get_style_sheet.py   # 获取样式表
│   ├── settings/    #  设置项
│   │   ├── color_card.json   # 色卡文件
│   │   ├── color_setting.json    # 颜色设置文件
│   │   └── style_uiproj.qss      # 项目级的样式表文件
│   ├── ui_forms/       # 所有的显示界面文件相关
│   │   ├── __init__.py    # 这里设置项目所有界面文件列表,如果新增或删除了画面,需修改这里
│   │   ├── main_window/   # 主窗口相关的各种文件,如果增减画面,增减这样的目录即可
│   │   ├── settings/     # 设置
│   │   └── start_up/    #  起始界面相关的各种文件,如果增减画面,增减这样的目录即可
│   │       ├── start_up.py   # 由uic工具从ui文件转换而来的py文件
│   │       ├── start_up.ui   # 在designer中组态的ui格式的界面文件
│   │       ├── start_up_func.py   # 界面文件的后端脚本
│   │       └── style_start_up.qss   # 本界面的补充样式表文件
│   └── ui_project.py    # 生成项目文件的脚本
├── main.py    # 主程序
├── print_this.py    # 打印目录树的脚本
├── settings/         # 设置
└── tmp/     # 临时文件和垃圾文件

修改后的部分代码如下:

main.py:

import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication
from UI_proj.ui_forms import *  # 导入所有窗口的后端脚本
from UI_proj.ui_project import uiproj   # 导入项目,uiproj是在ui_project.py中实例化的全局的ui项目类


def main():
    app = QApplication(sys.argv)

    def run():
        uiproj.forms = []  # 项目的所有窗口列表
        uiproj.timer.start(1000)  # 启动全局定时器
        # 添加窗口
        def add_forms():            
            # #################添加起始画面####################
            form_start_up = start_up_func.FormStart_up()  # 实例化窗口类
            form_start_up.setWindowFlag(Qt.FramelessWindowHint)  # 设置窗口无边框
            form_start_up.show()  # 显示窗口
            uiproj.forms.append(form_start_up)  # 添加到窗口列表

        add_forms()

    run()

    sys.exit(app.exec())

if __name__ == "__main__":
    main()

色卡文件,color_card.json:

{
  "colors": {
    "红色": "#dc1e1e",
    "浅红": "#ee8f8f",
    "深红": "#6e0f0f",
    "绿色": "#1edc1e",
    "浅绿": "#8fee8f",
    "深色": "#0f6e0f",
    "蓝色": "#1e1edc",
    "浅蓝": "#8f8fee",
    "深蓝": "#0f0f6e",
    "黄色": "#dcdc00",
    "浅黄": "#eeee80",
    "深黄": "#6e6e00",
    "橙色": "#cc8400",
    "浅橙": "#e6c280",
    "深橙": "#664200",
    "灰色": "#a0a0a0",
    "浅灰": "#eeeeee",
    "深灰": "#434343",
    "白色": "#ffffff",
    "黑色": "#000000"
  }
}


        在色卡文件中定义了标称的颜色对应的颜色值,可以在任何时候从文件中修改这个值,而无需找到应用它的地方去一一修改。 

颜色设置文件,color_setting.json:

{
    "color_setting": {
        "基底色": "黑色",
        "窗口色": "深灰",
        "顶部标签色": "黑色",
        "按钮底色": "浅蓝",
        "常规文字色": "浅灰"
    }
}

这里定义了一些泛指的基本颜色,通过修改这个文件,就可以整体修改界面的显示风格。

项目级的样式表文件,style_uiproj.qss:

/*########项目级的的样式表都在此设置#######*/


/*##########默认的父类颜色###############*/
QWidget{
    background-color: 基底色;
    color: 常规文字色;
}
QFrame{
    background-color: 窗口色;
    color: 常规文字色;
}

/*#########按钮的默认设置################*/
/*按钮的默认背景色*/
QPushButton {
    background-color: 按钮底色;
}
/*#########顶部标签区颜色设置############*/
/*顶部标签区颜色*/
#form_top {
    background-color: 顶部标签色;
}
/*顶部标签区的标签文字颜色*/
#form_top QLabel{
    background-color: 基底色;
    color: 常规文字色;
}


这个文件定义了项目全局的通用特性。

画面start_up的本地级别的样式表文件,style_start_up.qss:

/*########start_up(起始画面)的本地样式表在此设置#######*/

/*#########按钮的默认设置################*/
/*按钮的文字颜色*/
QPushButton {
    color: 深红;
}
#btn_quit {
    background-color: 深红;
    color: 黑色;
}

        可以看到,在本地级的样式表文件中,对按钮的显示做了补充和覆盖的设置。

 画面start_up的后端脚本,start_up_func.py:

# start_up画面(起始画面的后端功能函数)
from PySide6.QtCore import Slot, Qt
from PySide6.QtWidgets import QWidget, QApplication

from . import start_up   # 导入使用uis工具从start_up.ui生成而来的start_up.py文件
from UI_proj.ui_project import uiproj     # 导入全局的ui项目对象
from UI_proj.functions.get_style_sheet import get_style_sheet
# from . import styles_rc


# 定义窗口类
class FormStart_up(QWidget, start_up.Ui_form_base):
    def __init__(self):
        super().__init__()
        self.color_base = ""
        self.setupUi(self)   # 加载窗口
        self.run()   # 初始化运行窗口

    def run(self):   # 窗口的运行函数
        self.show()  # 显示窗口
        style_sheet = get_style_sheet('settings/color_card.json', 'settings/color_setting.json', 'settings/style_uiproj.qss')  # 获取项目级别的样式表
        style_sheet += get_style_sheet('settings/color_card.json', 'settings/color_setting.json', 'ui_forms/start_up/style_start_up.qss')  # 获取本画面的本地样式表并与项目级别样式表合并
        print(style_sheet)

        self.setStyleSheet(style_sheet)  # 设置窗口样式

        # 设置窗口居中
        def center():
            screen = QApplication.primaryScreen().geometry()
            size = self.geometry()
            self.move(
                (screen.width() - size.width()) // 2,
                (screen.height() - size.height()) // 2
            )
        center()  # 设置窗口居中
       

还有一些小的脚本未列出代码。感兴趣的同学可以下载本文绑定的资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA Clara平台助力医学影像处理:编程案例与实践探索(上)

一、引言 1.1 研究背景与意义 在现代医学领域,医学影像技术已然成为疾病诊断、治疗方案制定以及疗效评估的关键支柱。从早期的 X 射线成像,到如今的计算机断层扫描(CT)、磁共振成像(MRI)、正电子发射断层扫描(PET)等先进技术,医学影像为医生提供了直观、精准的人体内…

【硬件介绍】Type-C接口详解

一、Type-C接口概述 Type-C接口特点:以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验,避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构:内部上下两排引脚的设计虽然可能不…

【数据结构】第1天之Java中的数据结构

前言 众所周知,程序数据结构算法,可见数据结构的重要性。 在Java中,数据结构通常指的是Java集合框架中的类和接口。 Java集合框架提供了一套标准的数据结构,例如列表、集合、映射表等,以及相应的实现类。 今天要分享的…

Open FPV VTX开源之默认MAVLink设置

Open FPV VTX开源之默认MAVLink设置 1. 源由2. 准备3. 连接4. 安装5. 配置6. 测试6.1 启动wfb-ng服务6.2 启动wfb-ng监测6.3 启动QGroundControl6.4 观察测试结果 7. 总结8. 参考资料9. 补充9.1 telemetry_tx异常9.2 DEBUG串口部分乱码9.3 PixelPilot软件问题9.4 偶尔启动卡住 …

Spring Boot 和微服务:快速入门指南

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

Redis 为什么要引入 Pipeline机制?

在 Redis 中有一种 Pipeline(管道)机制,其目的是提高数据传输效率和吞吐量。那么,Pipeline是如何工作的?它又是如何提高性能的?Pipeline有什么优缺点?我们该如何使用 Pipeline? 1、…

Cesium小知识:粒子系统的参数详解

Cesium 的粒子系统通过 ParticleSystem 类提供了一套丰富的参数来控制粒子的生成、行为和外观。以下是这些参数的详细说明,帮助你更好地理解和使用 Cesium 的粒子系统。 基本参数 image (String) - 粒子图像的URL路径。这个图像是每个粒子在渲染时使用的纹理。 startColor (Co…

【数据结构-堆】力扣1834. 单线程 CPU

给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。 现…

OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)

前篇博客有对常用LSA的总结 2类LSA(Network-LSA) DR产生泛洪范围为本区域 作用:  描述MA网络拓扑信息和网络信息,拓扑信息主要描述当前MA网络中伪节点连接着哪几台路由。网络信息描述当前网络的 掩码和DR接口IP地址。 影响邻居建立中说到…

【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…

【2024年华为OD机试】 (C卷,100分)- 密钥格式化(Java JS PythonC/C++)

一、问题描述 题目描述 给定一个非空字符串 S,其被 N 个‘-’分隔成 N1 的子串,给定正整数 K,要求除第一个子串外,其余的串每 K 个用‘-’分隔,并将小写字母转换为大写。 输入描述 正整数 K 和‘-’分割的字符串&a…

基于单片机的指纹密码锁

【摘要】 本设计是一款基于单片机的指纹识别电子密码锁系统。该系统以STC89C52单片机作为模块核心同时结合ZFM-60指纹模块实现录取指纹并存储指纹数据的功能,并且通过HS12864-15C液晶显示比对流程及比对结果,该指纹电子密码锁通过直流继电器与发光二极管…

企业总部和分支通过GRE VPN互通

PC1可以ping通PC2 1、首先按照地址表配置ip地址 2、分别在AR1和AR3上配置nat 3、配置GRE a 创建tunnel接口,并选择tunnel协议为GRE,为隧道创建一个地址,用作互联 b 为隧道配置源地址或者源接口,这里选择源接口;再为…

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测 目录 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测。 程序设计 完整代码:回…

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…

【PPTist】插入形状、插入图片、插入图表

一、插入形状 插入形状有两种情况,一种是插入固定的形状, 一种是插入自定义的形状。 插入固定的形状时,跟上一篇文章 绘制文本框 是一样一样的,都是调用的 mainStore.setCreatingElement() 方法,只不多传的类型不一…

Elasticsearch—索引库操作(增删查改)

Elasticsearch中Index就相当于MySQL中的数据库表 Mapping映射就类似表的结构。 因此我们想要向Elasticsearch中存储数据,必须先创建Index和Mapping 1. Mapping映射属性 Mapping是对索引库中文档的约束,常见的Mapping属性包括: type:字段数据类…

ROS Action接口

实现自主导航是使用Action接口的主要目的 在实际使用navigation导航系统的时候,机器人需要自主进行导航。不能每次都手动设置导航的目标点。所以需要编写程序代码来实现导航控制。这就需要使用到navigation的导航接口。Navigation的这个导航接口有好几个。Rose官方…

macOS 安装tomcat9

macOS 安装tomcat9 URL:https://tomcat.apache.org/download-90.cgi 解压之后放到指定目录 /Users/lanren/install/tomcat-9 自己取个名字就行 给权限: ① 先进行权限修改:终端输入sudo chmod 755 /Users/lanren/install/tomcat-9/bin/…

PatchTST:通道独立的、切片的 时序 Transformer

出处:ICLR 2023 代码链接:yuqinie98/PatchTST: An offical implementation of PatchTST: "A Time Series is Worth 64 Words: Long-term Forecasting with Transformers." (ICLR 2023) https://arxiv.org/abs/2211.14730 一 模型主要思想及…