工控上位机控制系统通用UI框架

This commit is contained in:
2026-03-09 16:29:32 +08:00
parent 19af6e2b4e
commit a00e13b11a
54 changed files with 11356 additions and 0 deletions

View File

@ -0,0 +1,182 @@
# 用户管理内嵌页面子类
from PySide6.QtWidgets import QWidget, QTableWidgetItem, QMessageBox, QHeaderView
from PySide6.QtCore import Qt, QObject, QEvent, Slot
from PySide6.QtGui import QKeyEvent, QHideEvent
from msg_dict import g_uiGeometrySize
from wndMain.pageUserMgt.uiSub_User import Ui_pageUser
from common.generalFunc import CCommon
from dbCtrl.clsUserTb import g_userCtrl
from msg_dict import g_uiCtrlScript
class CSubPageUser(QWidget):
# public:
def __init__(self, widgetSize: tuple[int, int], parent=None):
super().__init__(parent)
self.ui = Ui_pageUser()
self.ui.setupUi(self)
# 按需声明对应的成员变量
self.szStack = widgetSize
pass
# 界面初始化
def uiInit(self) -> None:
self._screenAdapter() # 界面自适应
self._changeWndStyle() # 设置成无框架边框
self._centerWidget() # 居中显示
self._changeLine_edit() # 设置用户输入限制
self._setupSignalSlotMapping() # 创建信号映射
self._loadUserData() # 加载用户数据
self._changeTableStyle() # 设置表格样式
pass
# ----------------------------------------
# private:
# 纵向调整子控件高度
def _adjustVerticalHeight(self):
nBottomPos = self.geometry().bottom() - g_uiGeometrySize['WND_MARGIN_VERT']
rctTemp = self.ui.grpUserlist.geometry()
rctTemp.setBottom(nBottomPos)
self.ui.grpUserlist.setGeometry(rctTemp)
# --------------------------------------
rctOtherTemp = self.ui.tabUserInfo.geometry()
rctOtherTemp.setHeight(rctTemp.height() - rctOtherTemp.top() - g_uiGeometrySize['WND_MARGIN_VERT'] * 3)
self.ui.tabUserInfo.setGeometry(rctOtherTemp)
# 界面自适应
def _screenAdapter(self) -> None:
self.resize(self.szStack[0], self.szStack[1])
self._adjustVerticalHeight()
pass
# 修改窗体属性
def _changeWndStyle(self) -> None:
self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
pass
# 修改表格样式
def _changeTableStyle(self) -> None:
# 禁止所有列宽拖动
self.ui.tabUserInfo.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
# 单元格内容居中
for row in range(self.ui.tabUserInfo.rowCount()):
for col in range(self.ui.tabUserInfo.columnCount()):
item = self.ui.tabUserInfo.item(row, col)
if item:
item.setTextAlignment(Qt.AlignCenter)
# 窗口居中显示
def _centerWidget(self) -> None:
pass
# 设置用户输入限制
def _changeLine_edit(self) -> None:
self.ui.edtUserName.installEventFilter(self) # 建立时间触发
# 添加用户到表格
def _addUserToTable(self, user_id: str, user_type: int, create_date: str) -> None:
# 插入新行
rowPosition = self.ui.tabUserInfo.rowCount()
self.ui.tabUserInfo.insertRow(rowPosition)
# 设置用户id
self.ui.tabUserInfo.setItem(rowPosition, 0, QTableWidgetItem(user_id))
# 设置用户类别
self.ui.tabUserInfo.setItem(rowPosition, 1, QTableWidgetItem(user_type))
# 设置创建日期
self.ui.tabUserInfo.setItem(rowPosition, 2, QTableWidgetItem(create_date))
pass
# 加载用户数据到表格
def _loadUserData(self) -> None:
# 清空表格
self.ui.tabUserInfo.setRowCount(0)
# 获取所有用户信息
user_list = g_userCtrl.readUserId_type_date()
# 填充表格
for user_info in user_list:
self._addUserToTable(user_info[0], user_info[1], user_info[2])
# 重新加载表格样式
self._changeTableStyle()
pass
# 建立信号槽连接
def _setupSignalSlotMapping(self) -> None:
self.ui.btnAdd.clicked.connect(self._onAddUserClicked)
self.ui.btnDel.clicked.connect(self._onDeleteUserClicked)
pass
# ---------事件重载---------
def eventFilter(self, obj: QObject, event):
# 处理对应输入框的键盘事件
if obj == self.ui.edtUserName and QEvent.Type.KeyPress == event.type():
clsKeyEvent = QKeyEvent(event)
key = clsKeyEvent.key()
modifier = clsKeyEvent.modifiers()
key_char = clsKeyEvent.text()
return super().eventFilter(obj, event) if CCommon.fnCheckInputValid(key, modifier, key_char) else True
# 非输入框/非键盘按下事件,按默认逻辑处理
return super().eventFilter(obj, event)
# ----------------信号槽接口----------------
@Slot()
def _onAddUserClicked(self) -> None:
# 获取输入的用户名
user_name = self.ui.edtUserName.text().strip()
if not user_name:
QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_INPUT_USER'])
return
# 检查用户名是否已存在
if user_name in g_userCtrl.readAllUserIDs():
QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_USER_EXIST'])
return
# 获取用户类型
user_type = 1 if self.ui.rdoTech.isChecked() else 2
# 添加用户
success = g_userCtrl.addNewUser(user_name, user_type)
if success:
self._loadUserData()
# 清空输入框
self.ui.edtUserName.clear()
QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_ADD_USER_SUCCESS'])
else:
QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_FAIL'])
pass
@Slot()
def _onDeleteUserClicked(self) -> None:
# 获取选中的行
selected_items = self.ui.tabUserInfo.selectedItems()
if not selected_items:
QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_SELECT'])
return
# 获取选中的用户名
selected_users = []
for i in range(0, len(selected_items), 3):
row = selected_items[i].row()
user_name = self.ui.tabUserInfo.item(row, 0).text()
selected_users.append(user_name)
# 确认删除
reply = QMessageBox.question(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_CONFIRM'].format(len(selected_users)),
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
success = g_userCtrl.delUser(selected_users)
if success:
self._loadUserData()
QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_SUCCESS'])
else:
QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_FAIL'])
pass

View File

@ -0,0 +1,111 @@
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'uiSub_User.ui'
##
## Created by: Qt User Interface Compiler version 6.9.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QAbstractItemView, QApplication, QGroupBox, QHeaderView,
QLabel, QLineEdit, QPushButton, QRadioButton,
QSizePolicy, QTableWidget, QTableWidgetItem, QWidget)
class Ui_pageUser(object):
def setupUi(self, pageUser):
if not pageUser.objectName():
pageUser.setObjectName(u"pageUser")
pageUser.setEnabled(True)
pageUser.resize(856, 493)
self.grpUserInfo = QGroupBox(pageUser)
self.grpUserInfo.setObjectName(u"grpUserInfo")
self.grpUserInfo.setGeometry(QRect(10, 10, 341, 101))
self.lblUserName = QLabel(self.grpUserInfo)
self.lblUserName.setObjectName(u"lblUserName")
self.lblUserName.setGeometry(QRect(20, 19, 81, 16))
self.edtUserName = QLineEdit(self.grpUserInfo)
self.edtUserName.setObjectName(u"edtUserName")
self.edtUserName.setGeometry(QRect(118, 16, 201, 21))
self.edtUserName.setMaxLength(30)
self.lblUserType = QLabel(self.grpUserInfo)
self.lblUserType.setObjectName(u"lblUserType")
self.lblUserType.setGeometry(QRect(20, 60, 91, 16))
self.rdoTech = QRadioButton(self.grpUserInfo)
self.rdoTech.setObjectName(u"rdoTech")
self.rdoTech.setGeometry(QRect(134, 59, 61, 20))
self.rdoTech.setChecked(True)
self.rdoOperator = QRadioButton(self.grpUserInfo)
self.rdoOperator.setObjectName(u"rdoOperator")
self.rdoOperator.setGeometry(QRect(214, 59, 61, 20))
self.grpUserOp = QGroupBox(pageUser)
self.grpUserOp.setObjectName(u"grpUserOp")
self.grpUserOp.setGeometry(QRect(10, 120, 341, 71))
self.btnAdd = QPushButton(self.grpUserOp)
self.btnAdd.setObjectName(u"btnAdd")
self.btnAdd.setGeometry(QRect(40, 20, 100, 41))
self.btnAdd.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
self.btnDel = QPushButton(self.grpUserOp)
self.btnDel.setObjectName(u"btnDel")
self.btnDel.setGeometry(QRect(190, 20, 100, 41))
self.btnDel.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
self.grpUserlist = QGroupBox(pageUser)
self.grpUserlist.setObjectName(u"grpUserlist")
self.grpUserlist.setGeometry(QRect(360, 10, 411, 461))
self.lblUserlist = QLabel(self.grpUserlist)
self.lblUserlist.setObjectName(u"lblUserlist")
self.lblUserlist.setGeometry(QRect(20, 20, 61, 16))
self.tabUserInfo = QTableWidget(self.grpUserlist)
if (self.tabUserInfo.columnCount() < 3):
self.tabUserInfo.setColumnCount(3)
__qtablewidgetitem = QTableWidgetItem()
self.tabUserInfo.setHorizontalHeaderItem(0, __qtablewidgetitem)
__qtablewidgetitem1 = QTableWidgetItem()
self.tabUserInfo.setHorizontalHeaderItem(1, __qtablewidgetitem1)
__qtablewidgetitem2 = QTableWidgetItem()
self.tabUserInfo.setHorizontalHeaderItem(2, __qtablewidgetitem2)
self.tabUserInfo.setObjectName(u"tabUserInfo")
self.tabUserInfo.setEnabled(True)
self.tabUserInfo.setGeometry(QRect(20, 40, 371, 411))
self.tabUserInfo.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
self.tabUserInfo.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)
self.tabUserInfo.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
self.tabUserInfo.setColumnCount(3)
self.tabUserInfo.horizontalHeader().setVisible(True)
self.tabUserInfo.horizontalHeader().setProperty(u"showSortIndicator", False)
self.tabUserInfo.horizontalHeader().setStretchLastSection(True)
self.tabUserInfo.verticalHeader().setStretchLastSection(False)
self.retranslateUi(pageUser)
QMetaObject.connectSlotsByName(pageUser)
# setupUi
def retranslateUi(self, pageUser):
pageUser.setWindowTitle(QCoreApplication.translate("pageUser", u"Form", None))
self.grpUserInfo.setTitle("")
self.lblUserName.setText(QCoreApplication.translate("pageUser", u"\u65b0\u589e\u7528\u6237\u540d\uff1a", None))
self.edtUserName.setPlaceholderText(QCoreApplication.translate("pageUser", u"\u957f\u5ea630\uff0c\u4ec5\u9650\u82f1\u6587\u3001\u6570\u5b57\u548c\u4e0b\u5212\u7ebf", None))
self.lblUserType.setText(QCoreApplication.translate("pageUser", u"\u65b0\u589e\u7528\u6237\u7c7b\u522b\uff1a", None))
self.rdoTech.setText(QCoreApplication.translate("pageUser", u"\u6280\u672f\u5458", None))
self.rdoOperator.setText(QCoreApplication.translate("pageUser", u"\u64cd\u4f5c\u5458", None))
self.grpUserOp.setTitle("")
self.btnAdd.setText(QCoreApplication.translate("pageUser", u"\u65b0\u589e\u7528\u6237", None))
self.btnDel.setText(QCoreApplication.translate("pageUser", u"\u5220\u9664\u7528\u6237", None))
self.grpUserlist.setTitle("")
self.lblUserlist.setText(QCoreApplication.translate("pageUser", u"\u7528\u6237\u5217\u8868\uff1a", None))
___qtablewidgetitem = self.tabUserInfo.horizontalHeaderItem(0)
___qtablewidgetitem.setText(QCoreApplication.translate("pageUser", u"\u7528\u6237\u540d", None));
___qtablewidgetitem1 = self.tabUserInfo.horizontalHeaderItem(1)
___qtablewidgetitem1.setText(QCoreApplication.translate("pageUser", u"\u7528\u6237\u7c7b\u578b", None));
___qtablewidgetitem2 = self.tabUserInfo.horizontalHeaderItem(2)
___qtablewidgetitem2.setText(QCoreApplication.translate("pageUser", u"\u521b\u5efa\u65f6\u95f4", None));
# retranslateUi