Files
general-system-framework/wndMain/pageUserMgt/sub_uiUser.py

182 lines
7.1 KiB
Python

# 用户管理内嵌页面子类
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