基于深度学习的视觉检测小项目(十六) 用户管理界面的组态

分组和权限:

用户分为三个组,管理员、普通用户、访客。

管理员的权限和作业范围:

添加和删除用户、更改所有用户的信息(用户名、登录密码、所在分组等)、查看和备份以及复制数据库;

• 普通用户的权限和作业范围:

更改自己的用户名和密码、开展工作业务、查看数据库;

• 访客的权限和作业范围:

查看数据库。

用于用户管理的界面:

既然用到了用户的管理,那么就必然涉及到用户列表的展示方式了。

QT对于列表内容的展示方式有:QComboBox(下拉组合框)、QListView(列表视图)以及表格显示,表格显示的方式又有QTableView和QTableWidget两种,QTableView提供了一种前端视图和后端数据分离的模型框架,并且QTableView与数据库模型QSqlTableModel无缝衔接,具有强大的功能和灵活性,;QTableWidget 是一个结合了模型和视图的控件,已经内置了一个简单的表格模型,可以通过便捷的方法来操作表格数据,特别适合简单数据的处理。这里选择了表格方式,并使用QTableView作为表格窗口。

在designer中新建QDialog界面文件:user_manage.ui,并在其上放置以下部件:

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

然后按照项目中别的画面的添加和设置方法,对其进行功能函数的编程:

python 复制代码
from PySide6.QtCore import Slot
from PySide6.QtWidgets import QDialog, QMessageBox

from . 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类,对表格的显示特性进行了定制,使得单击单元格选择整行,代码如下:

python 复制代码
# 表格显示的模型,点击单元格选定整行

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):  # 继承QTableView
    def __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 = table
            self.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中的表格小部件"提升为"自定义的类。

运行效果:

下一步,对用户管理的编辑和添加、删除功能进行编程。

相关推荐
MYH5161 分钟前
文本预测和分类任务
人工智能·机器学习·分类
no_work2 分钟前
基于CNN深度学习的小程序识别-视频介绍下自取
深度学习·小程序·cnn
仟濹4 分钟前
「Matplotlib 入门指南」 Python 数据可视化分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
python·信息可视化·数据分析·matplotlib
Elastic 中国社区官方博客22 分钟前
使用 Azure LLM Functions 与 Elasticsearch 构建更智能的查询体验
大数据·人工智能·elasticsearch·microsoft·搜索引擎·全文检索·azure
先做个垃圾出来………26 分钟前
什么是装饰器?
开发语言·python
这是Jamon38 分钟前
MetaGPT Actions基础框架之Action类解析
人工智能
我真不会起名字啊38 分钟前
Qt如何生成和使用DLL动态链接库
开发语言·qt
麦兜*1 小时前
Spring Boot 集成国内AI,包含文心一言、通义千问和讯飞星火平台实战教程
java·人工智能·spring boot·后端·spring·ai·文心一言
这是Jamon1 小时前
MetaGPT Actions基础框架之ActionNode解析
人工智能
风靡晚1 小时前
用于汽车毫米波雷达的四维高分辨率点云图像
人工智能·算法·机器学习·计算机视觉·汽车·信息与通信·信号处理