基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划
• 关于前后端分离
当前流行的一种常见的前后端分离模式是vue+flask,vue+flask模式的前端和后端之间进行数据的传递通常是借助 API(应用程序编程接口)来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如,前端可能通过发送 HTTP 请求到后端的 API 来获取数据,后端则通过 API 响应这些请求并返回数据给前端。
而本项目的主体框架是基于pyside的,所有的数据交互都是在pyside主程序内部流动。pyside的数据交互的载体主要就是信号与槽,前后端通过发射信号到槽函数来实现数据交互和显示刷新。这一点与vue+flask模式区别很大,vue+flask模式是天生自带前后端分离,pyside如果不用心去做,不太容易做到前后端分离。看过很多的博主提供的demo都是课后作业水平的,只能说实现了基本功能,前后端分离不彻底,移植困难,修改困难,信号、变量、槽函数分布层级不清,引用和定义盘根错节(好吧我承认,其实我开始做的项目也是这样的),当需要修改或者增减画面时牵一发而动全身。所以本项目尽力探索,怎样实现前后端的彻底分离。原则上所有显示特征的描述都在前端的designer中实现,而后端的功能和计算脚本只提供触发的信号和更新的逻辑,无须关心任何显示特征,这样就实现了前后端分离,分工种协作。
• 关于信号和槽
特别强调的一点:必须要坚持一个原则,除非是画面的初始化,所有的前端部件的所有刷新都必须通过槽函数来实现,信号的发射触发槽函数的执行。因为pyside的线程管理和刷新机制会根据信号和槽的连接定义以及信号触发自动安排部件的显示刷新,如果出现了计划外的部件刷新,就会破坏程序的刷新节奏和引发读写竞争,程序就有跑死的风险。在我初学的阶段就犯过这个错误,前端画面有一个显示系统时间的text_label,没有使用信号与槽,而是用python自带的定时器定时重写text_label的显示内容,结果程序每过几个小时就死机,需要重启程序才能恢复。花费了很大力气来排除这个BUG,最后做成了秒周期的信号,发射信号到槽函数来重写显示内容,解决了这个问题。
• 关于项目的层级
有一些变量和信号、槽需要做成全局层级的,比如系统时间、用户名、系统参数等等,这些变量和信号、槽的定义和操作不依赖前端界面,就是说无论怎样切换前端界面,它们都是单独存在的。为达到这个目的,一个方法是在前端界面的代码中将它们声明为global(全局级),但是如果将本项目移植到更高一级的项目时,就有可能会遇到global级别上的混淆。所以一些python的使用教程中建议谨慎使用global声明是有道理的。为了实现全局信号,在项目中设一个全局的信号对象(QObject),在分画面中导入全局信号并为之编写和连接槽函数。(在更大型和更复杂的应用程序中,会使用事件总线,事件总线作为中央枢纽的类,负责管理和分发事件。这样,发送者和接收者之间不需要直接引用彼此,从而降低了耦合度。在后面的范例中会有用到事件总线)
而另一些变量和信号、槽是局部的,比如某个画面的某个部件的显示刷新函数,这些就要做在画面的代码中,这样做的好处是可以简化程序和实现模块化结构,当删除画面的同时,变量和信号、槽随之删除;增加画面的同时,增加新的变量和信号、槽。
层级一个典型的应用就是系统时间的显示,在所有的窗口的时间显示部件上的显示内容,都是由同一个全局的变量提供,把这个变量用一个全局的信号每秒发射一次,在需要使用这个信号的窗口编写接收信号的槽函数,对窗口内的时间显示部件进行刷新。
至此,项目的整体规划基本完成,下面进入实际的编程阶段。
在pycharm中新建项目,并构建如下的文件目录:

├── AI/ # AI相关的内容
│ ├── media/ # 图像文件和其他媒体文件
│ │ ├── mark/ # 标注得到的图像,用来训练
│ │ ├── predict/ # 预测后的图像
│ │ └── source/ # 原始图像
│ └── models/ # 模型
├── database/ # 数据库相关
├── gui/ # 界面文件
│ ├── ui_src/ # 界面需要的源文件,比如图标、背景资源、颜色定义等
│ └── uis/ # 界面文件
│ └── __init__.py # 有了这个文件就可以把文件夹变为包,在这个文件中还可以定义import *的范围
├── main.py # 主脚本
└── settings/ # 设置项
└── __init__.py
相关文章:
基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划
• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask,vueflask模式的前端和后端之间进行数据的传递通常是借助 API(应用程序编程接口)来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如,前端可能通过发送…...
【Android项目学习】3. MVVMHabit
项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础,整合OkhttpRxJavaRetrofitGlide等流行…...
在Linux中,如何配置负载均衡器以分配网络流量?
NGINX NGINX是一款高性能的HTTP和反向代理服务器,也常用作负载均衡器。它支持多种负载均衡算法,如轮询、加权轮询、IP哈希等。 配置步骤: 安装NGINX:根据您的Linux发行版,使用相应的包管理器安装NGINX。配置负载均衡…...
手机投屏到电视的3种选择:无线本地投屏,无线远程投屏,AirPlay投屏
现在大部分手机投屏都要求连接相同的WiFi,这就意味着手机投屏到电视必须是近距离投屏,稍微远一点就会脱离WiFi连接范围,投屏失败。 如果想将手机远程投屏到安卓电视,要怎样做? 第一步,在手机和安卓电视都安…...
MySQL关联关系理论与实践
MySQL 是一种关系型数据库管理系统,以其高性能、灵活性和易用性在开发者中广受欢迎。在 MySQL 中,数据存储以表格形式存在,表与表之间的关联关系构成了关系型数据库的核心。本篇文章将介绍 MySQL 关联关系的理论基础和常见实践,包括表的类型、主外键的使用,以及连接查询的…...
多模态论文笔记——U-ViT(国内版DiT)
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍U-ViT的模型架构和实验细节,虽然没有后续的DiT在AIGC领域火爆,但为后来的研究奠定了基础,但其开创性的探索值得学习…...
在 IntelliJ IDEA 中开发 GPT 自动补全插件
背景与目标 随着 AI 的发展,GitHub Copilot 等智能代码补全工具在开发者中获得了广泛的应用,极大地提高了编程效率。本篇文章将教你如何开发一个 IntelliJ IDEA 插件,使用 OpenAI 的 GPT API 来实现类似 Copilot 的代码自动补全功能。通过这…...
7. C语言 运算符详解
本章目录: 前言C语言运算符的分类1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 杂项运算符 运算符优先级 前言 在C语言中,运算符是程序中执行各种操作的核心工具,涉及算术运算、逻辑判断、位操作等多个方面。掌握C语言中的各种运…...
Java四大常用JSON解析性能对比:Hutool、Fastjson2、Gson与Jackson测试
1. 引言 JSON 是现代软件开发中常用的数据交换格式,尤其在微服务和前后端分离的架构中更是必不可少。 本文将对 Java 中四大主流 JSON 解析库——Hutool、Fastjson2、Gson 和 Jackson 进行性能测试和对比分析,通过实测 20 万条数据解析,揭示…...
Qt 5.14.2 学习记录 —— 일 新项目
文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件,新建文件或项目。如果要写一个GUI程序,应当选择Application&#x…...
uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器
效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…...
Unity3D仿星露谷物语开发17之空库存栏UI
1、目标 将库存栏放在游戏界面中,一般情况下角色居中展示时库存栏在底部,当角色位于界面下方时库存栏展示在顶部避免遮挡。 2、CanvasGroup组件 用于集中控制UI元素的透明度、交互性和射线投射行为。CanvasGroup的Alpha属性允许渐变效果,I…...
QT------模型/视图
一、模型/视图结构概述 基本原理: Qt 的模型/视图(Model/View)架构将数据的存储和显示分离,提高了代码的可维护性和复用性。模型(Model):负责存储和管理数据,提供数据的访问接口&am…...
Git - 记录一次由于少输入了一个命令导致的更改丢失
Git - 记录一次由于少输入了一个参数导致的更改丢失 前言 某晚我激情开发了几个小时,中途没有进行commit存档。准备睡觉时,我想创建一个新的分支并将今晚所有更改提交到新分支上(似乎应该开发时候就创建?)。 然后因…...
nodeJS下npm和yarn的关系和区别详解
一、命令对应关系 1. 初始化项目 操作npm 命令Yarn 命令初始化项目npm inityarn init跳过提问快速初始化npm init -yyarn init -y 2. 安装依赖 操作npm 命令Yarn 命令安装项目所有依赖npm installyarn install添加依赖npm install <package-name>yarn add <package…...
党员学习交流平台
本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…...
HTML5 文件上传(File Upload)详解
HTML5 文件上传(File Upload)详解 HTML5 提供了强大的文件上传功能,允许用户通过网页选择文件并上传到服务器。以下是关于文件上传控件的详细说明。 1. 基本的文件上传控件 使用 <input> 标签的 type"file" 属性可以创建一…...
1.2.1-2部分数据结构的说明02_链表
(1)链表数据结构: 概念: 将列表中相互连接的节点不连续的存储在内存中。与数据不同,我们无法再恒定时间内访问任何元组,如果遍历所有则花费时间与元素总数n成正比。插入和删除1个元素的时间复杂度都是O(n…...
vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。
vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。 1.设计思路:2.设计细节3.详细代码实现 1.设计思路: 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…...
linux上使用cmake编译的方法
一、hello 例程仅基于一个cpp文件 C文件或工程进行编译时可以使用g指令(需要对每一个程序和源文件分别使用g指令编译),当程序变大时,一个工程文件往往会包含很文件夹和源文件,这时我们需要的编译指令将越来越长&#…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
