基于深度学习的视觉检测小项目(十六) 用户管理界面的组态
分组和权限:
用户分为三个组,管理员、普通用户、访客。
• 管理员的权限和作业范围:
添加和删除用户、更改所有用户的信息(用户名、登录密码、所在分组等)、查看和备份以及复制数据库;
• 普通用户的权限和作业范围:
更改自己的用户名和密码、开展工作业务、查看数据库;
• 访客的权限和作业范围:
查看数据库。
用于用户管理的界面:
既然用到了用户的管理,那么就必然涉及到用户列表的展示方式了。
QT对于列表内容的展示方式有:QComboBox(下拉组合框)、QListView(列表视图)以及表格显示,表格显示的方式又有QTableView和QTableWidget两种,QTableView提供了一种前端视图和后端数据分离的模型框架,并且QTableView与数据库模型QSqlTableModel无缝衔接,具有强大的功能和灵活性,;QTableWidget 是一个结合了模型和视图的控件,已经内置了一个简单的表格模型,可以通过便捷的方法来操作表格数据,特别适合简单数据的处理。这里选择了表格方式,并使用QTableView作为表格窗口。
在designer中新建QDialog界面文件:user_manage.ui,并在其上放置以下部件:

通过合理设置各个部件的尺寸策略,使其能满足不同分辨率的屏幕显示:

然后按照项目中别的画面的添加和设置方法,对其进行功能函数的编程:
from PySide6.QtCore import Slot
from PySide6.QtWidgets import QDialog, QMessageBoxfrom . import user_manage # 导入使用uis工具从start_up.ui生成而来的start_up.py文件
from UI_proj.ui_project import uiproj # 导入全局的ui项目对象
from DB_proj import db_set # 导入数据库设置db_set.py
from UI_proj.functions.get_style_sheet import get_style_sheet # 导入获取样式表的函数
from UI_proj.functions.form_center import center # 导入窗口居中函数# 定义窗口类
class UserManage(QDialog, user_manage.Ui_form_base):def __init__(self):super().__init__()self.setupUi(self) # 加载窗口self.run() # 初始化运行窗口def run(self): # 窗口的运行函数# 设置窗口样式def set_style_sheet(): # 设置窗口样式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/user_manage/style_user_manage.qss') # 获取本画面的本地样式表并与项目级别样式表合并self.setStyleSheet(style_sheet) # 设置窗口样式set_style_sheet() # 设置窗口样式# 设置窗口居中center(self) # 设置窗口居中# 设置表格的查询数据def set_table_data():self.tableView.model.query.emit("SELECT 用户, 密码, 用户组 FROM users") # 设置表格的查询数据set_table_data() # 设置表格的初始化查询数据@Slot()# 点击退出按钮退出程序def on_btn_exit_clicked():self.close() # 关闭窗口self.btn_exit.clicked.connect(on_btn_exit_clicked) # 点击退出按钮退出程序@Slot() # 点击“添加”按钮显示添加用户窗口def on_btn_add_clicked(): # 点击“添加”按钮显示添加用户窗口pass# uiproj.form_add_user.exec() # 显示添加用户窗口self.btn_add.clicked.connect(on_btn_add_clicked) # 点击“添加”按钮显示添加用户窗口@Slot() # 点击“删除”按钮显示删除用户窗口def on_btn_delete_clicked(): # 点击“删除”按钮显示删除用户窗口pass# uiproj.form_delete_user.exec() # 显示删除用户窗口self.btn_delete.clicked.connect(on_btn_delete_clicked) # 点击“删除”按钮显示删除用户窗口@Slot() # 点击“编辑”按钮显示编辑用户窗口def on_btn_edit_clicked(): # 点击“编辑”按钮显示编辑用户窗口pass# uiproj.form_edit_user.exec() # 显示编辑用户窗口self.btn_edit.clicked.connect(on_btn_edit_clicked) # 点击“编辑”按钮显示编辑用户窗口
这里自定义了一个QTableView类,对表格的显示特性进行了定制,使得单击单元格选择整行,代码如下:
# 表格显示的模型,点击单元格选定整行import sys
from PySide6.QtCore import Qt, Signal, Slot
from PySide6.QtGui import QColor
from PySide6.QtSql import QSqlDatabase, QSqlQueryModel
from PySide6.QtWidgets import QApplication, QTableView, QMainWindow, QWidget, QVBoxLayout, QPushButton, QFrame# 自定义的表格模型
class TableModel(QSqlQueryModel):query = Signal(str) # 信号,用于传递查询语句refresh = Signal() # 信号,用于传递刷新提示def __init__(self):super().__init__()self._query = "" # 重新定义查询语句self.run() # 运行函数def run(self):@Slot()# 槽函数,用于执行查询def run_query(query):self._query = query # 重新定义查询语句self.setQuery(self._query) # 执行查询self.refresh.emit() # 发射信号,传递刷新数据信号self.query.connect(run_query) # 将槽函数与信号连接# 自定义的表格视图
class TableView(QTableView): # 继承QTableViewdef __init__(self, parent=None):super().__init__(parent)self.model = TableModel() # 创建一个自定义的TableModel对象self.setSelectionBehavior(QTableView.SelectRows) # 设置表格视图的选择行为为选择整行,而不是单个单元格# self.setShowGrid(False) # 设置不显示网格线self.verticalHeader().setVisible(False) # 设置隐藏行号self.verticalHeader().setDefaultSectionSize(50) # 设置默认行高self.horizontalHeader().setDefaultSectionSize(103) # 设置默认列宽self.run() # 运行函数def run(self):@Slot()# 槽函数,用于刷新表格的显示def refresh():self.setModel(self.model) # 设置表格视图的模型self.model.refresh.connect(refresh) # 将槽函数与信号连接,当模型刷新时,发射信号,执行刷新函数# 用法:
if __name__ == "__main__":app = QApplication(sys.argv)# 设置数据库def db_setup():db = QSqlDatabase.addDatabase("QSQLITE") # 添加SQLite数据库驱动作为基础数据库db.setDatabaseName("example.db") # 设置数据库名称db.open() # 打开数据库db_setup() # 设置数据库tabview = TableView() # 创建一个自定义的TableView对象tabview.model.query.emit("SELECT * FROM users") # 设置初始化的查询语句# 创建一个主窗口,将自定义的TableView对象作为主窗口的中央部件class MainWindow(QMainWindow):def __init__(self, table, parent=None):super().__init__(parent)self.table = tableself.initUI()def initUI(self):layout = QVBoxLayout() # 创建一个垂直布局layout.addWidget(self.table) # 将自定义的TableView对象添加到布局中button = QPushButton("刷新") # 创建一个按钮layout.addWidget(button) # 将按钮添加到布局中central_widget = QWidget() # 创建一个中央部件central_widget.setLayout(layout) # 将布局添加到中央部件self.setCentralWidget(central_widget) # 将中央部件设置为窗口的主部件button.clicked.connect(lambda: tabview.model.query.emit("SELECT name FROM users")) # 设置刷新的查询语句window = MainWindow(tabview)window.show()sys.exit(app.exec())
这个自定义的QTableView类由一个QTableView(表格显示)和一个QTableModel(表格模型)组成,QTableModel负责数据查询,QTableView负责前端显示,他们之间通过信号(Signal)来传递数据。在designer软件中将用户管理的ui中的表格小部件“提升为”自定义的类。
运行效果:

下一步,对用户管理的编辑和添加、删除功能进行编程。
相关文章:
基于深度学习的视觉检测小项目(十六) 用户管理界面的组态
分组和权限: 用户分为三个组,管理员、普通用户、访客。 • 管理员的权限和作业范围: 添加和删除用户、更改所有用户的信息(用户名、登录密码、所在分组等)、查看和备份以及复制数据库; • 普通用户的权限和…...
Docker使用指南(一)——镜像相关操作详解(实战案例教学,适合小白跟学)
目录 1.镜像名的组成 2.镜像操作相关命令 镜像常用命令总结: 1. docker images 2. docker rmi 3. docker pull 4. docker push 5. docker save 6. docker load 7. docker tag 8. docker build 9. docker history 10. docker inspect 11. docker prune…...
《2025,AI重塑世界进行时》
开年爆点,AI 浪潮再掀高潮 2025 年开年,AI 领域便热闹非凡,热点事件不断,让人深刻感受到这股科技浪潮正以汹涌之势奔腾而来。先是深度求索公司(DeepSeek)的 DeepSeek - R1 模型横空出世,迅速在国…...
visual studio安装
一、下载Visual Studio 访问Visual Studio官方网站。下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 在主页上找到并点击“下载 Visual Studio”按钮。 选择适合需求的版本,例如“Visual Studio Community”(免费版本)&#x…...
VSCode中使用EmmyLua插件对Unity的tolua断点调试
一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示: 三.启动调试模式,并选择附加的进程...
Eureka 高频考点
在 Java 微服务面试中,Eureka 是高频考点之一。以下是面试官可能针对 **Eureka** 提出的技术问题及其回答方向,涵盖基础、进阶和实战场景: --- ### **一、基础问题** #### 1. **Eureka 的核心作用是什么?** - **答**:Eureka 是服务发现组件,用于微服务架构中的 **服务注…...
一、tsp学习笔记——开发环境搭建
开发环境:window11 wsl ubuntu24.04 lypwslDESKTOP-39T8VTC:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.1 LTS Release: 24.04 Codename: noble工具安装 网络相关工具 sudo apt instal…...
Shell 中的 Globbing:原理、使用方法与实现解析(中英双语)
Shell 中的 Globbing:原理、使用方法与实现解析 在 Unix Shell(如 Bash、Zsh)中,globbing 是指 文件名模式匹配(filename pattern matching),它允许用户使用特殊的通配符(wildcards…...
互联网行业常用12个数据分析指标和八大模型
本文目录 前言 一、互联网线上业务数据分析的12个指标 1. 用户数据(4个) (1) 存量(DAU/MAU) (2) 新增用户 (3) 健康程度(留存率) (4) 渠道来源 2. 用户行为数据(4个) (1) 次数/频率…...
Leetcode 3443. Maximum Manhattan Distance After K Changes
Leetcode 3443. Maximum Manhattan Distance After K Changes 1. 解题思路2. 代码实现 题目链接:3443. Maximum Manhattan Distance After K Changes 1. 解题思路 这一题思路上算是一个类似滑动窗口的思路,核心思想就是在每一步走到的位置上考虑如何通…...
使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南
文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来,大语言模型(LLM)的应用逐渐成为技术热点,而 DeepSeek 作为国产开…...
新春贺岁,共赴AGI之旅
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 往期精彩文章推荐 季姮教授独家文字版干货 | 面向知识渊博的大语言模型 关于AI TIME AI TIME源起于2019年,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法和场景应用的本质问题…...
C_位运算符及其在单片机寄存器的操作
C语言的位运算符用于直接操作二进制位,本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符(&) 功能:按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…...
Java面试题集合篇5:10道基础面试题
文章目录 前言41、多线程使用 ArrayList42、List 和 Set 区别43、HashSet 实现原理44、HashSet检查重复和保证数据不可重复45、BlockingQueue46、Map接口46.1、HashMap实现原理46.2、HashMap在JDK1.7和JDK1.8中不同点46.3、JDK1.7 VS JDK1.8 比较 47、HashMap的put方法流程48、…...
汽车加气站操作工试题及答案
1.天然气的主要成分是( ) A. 乙烷 B. 乙烯 C. 甲烷 D. 乙炔 答案:C 2.加气站中,用来储存天然气的设备是( ) A. 加气机 B. 压缩机 C. 储气井 D. 脱水装置 答案:C 3.以下哪…...
Rust错误处理:从灭火器到核按钮的生存指南
开篇:错误处理的生存哲学 在Rust的平行宇宙里,错误分为两种人格: panic! → 核按钮💣(不可恢复,全系统警报)Result → 灭火器🧯(可控制,局部处理࿰…...
企业四要素如何用PHP进行调用
一、什么是企业四要素? 企业四要素接口是在企业三要素(企业名称、统一社会信用代码、法定代表人姓名)的基础上,增加了一个关键要素,通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证&#x…...
【大数据技术】搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn)
搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) jdk-8u361-linux-x64.tarhadoop-3.3.6.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群Hadoop+MapReduce+Yarn的详细步骤。 注意: 统一约定将软件安装包存放…...
【MySQL】MySQL经典面试题深度解析
文章目录 一、MySQL与C的深度结合1.1 为什么C项目需要MySQL?1.2 典型应用场景 二、基础概念面试题精讲2.1 存储引擎对比2.2 索引原理 三、C专项面试题解析3.1 连接池实现3.2 预处理语句3.3 批量操作优化 四、高级应用面试题剖析4.1 事务隔离级别4.2 锁机制详解4.3 查…...
GitHub Copilot 越狱漏洞
研究人员发现了两种操控 GitHub 的人工智能(AI)编码助手 Copilot 的新方法,这使得人们能够绕过安全限制和订阅费用、训练恶意模型等。 第一种技巧是将聊天交互嵌入 Copilot 代码中,利用 AI 的问答能力,使其产生恶意输…...
React组件开发技巧:如何优雅地传递Props?
React组件开发技巧:如何优雅地传递Props? 一、重复Props传递的痛点二、JSX展开语法的优雅解决方案语法解析适用场景 三、使用展开语法的注意事项1. **可读性风险**2. **Props冲突问题**3. **过度使用展开语法** 四、实际项目中的最佳实践五、总结六、扩展…...
Flask+gevent 实现异步请求处理
Flaskgevent 实现异步请求处理 使用flaskgevent实现异步请求处理,首先gevent库要使用猴子布丁,使底层I/O支持异步处理。 1 使用猴子补丁 from gevent import monkey monkey.patch_all()使用猴子补丁后, 内建函数time.sleep()已经魔改成gev…...
Python利用VideoCapture和FFmpeg读取多个rtsp流性能的比较
最近一个项目,要用python读取30个海康摄像头的rtsp流,一开始直接用cv2.VideoCapture(video_path),结果运行一段时间后发现读出来的frame经常出现花屏的现象。所以通过两种方式对程序进行了修改。 1、我先是通过cap.set(cv2.CAP_PROP_BUFFERS…...
Selenium 浏览器操作与使用技巧——详细解析(Java版)
目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具,能够…...
git 项目的更新
更新项目 当自己的本地项目与 远程的github 的仓库已经建立远程连接时, 则直接按照下面的步骤, 将本地的项目代码更新到远程仓库。 # Stage the resolved file git add README.md <file1> <file2># To stage all changes: git add .# Comm…...
UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理
UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理? 问题描述: UE成功打包APK并安装过后,启动应用时提示: No Google Play Store KeyNo OBB found and no store key to try to download. Please setone …...
吴恩达深度学习——卷积神经网络实例分析
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 LeNet-5AlexNetVGG-16ResNets残差块 1*1卷积 LeNet-5 输入层:输入为一张尺寸是 32 32 1 32321 32321的图像,其中 32 32 3232 3232是图像的长和宽&…...
LabVIEW的智能电源远程监控系统开发
在工业自动化与测试领域,电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作,存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网(IIoT)技术,实现电源设备…...
【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案
项目背景介绍 铁路货运企业需要对物流单进行长期存档,以便后续查询和审计。不同的物流单可能包含不同的关键信息,通过自定义指定多个区域进行识别重命名,可以使存档的图片文件名具有统一的规范和明确的含义。比如,将包含货物运单…...
neo4j-在Linux中安装neo4j
目录 切换jdk 安装neo4j 配置neo4j以便其他电脑可以访问 切换jdk 因为我安装的jdk是1.8版本的,而我安装的neo4j版本为5.15,Neo4j Community 5.15.0 不支持 Java 1.8,它要求 Java 17 或更高版本。 所以我需要升级Java到17 安装 OpenJDK 17 sudo yu…...
