# 配方管理内嵌页面子类 from PySide6.QtWidgets import QWidget, QHeaderView, QSpacerItem, QSizePolicy, QVBoxLayout, QMessageBox, QTableWidgetItem from PySide6.QtCore import Qt, QObject, QEvent, Slot from PySide6.QtGui import QKeyEvent from msg_dict import g_uiGeometrySize from wndMain.pageRecipeMgt.uiSub_Recipe import Ui_pageRecipe from common.generalFunc import CCommon from dbCtrl.clsRecipeTb import g_recipeCtrl from msg_dict import g_uiCtrlScript class CSubPageRecipe(QWidget): # public: def __init__(self, userId: str, widgetSize: tuple[int, int], parent=None): super().__init__(parent) self.creator = userId self.ui = Ui_pageRecipe() self.ui.setupUi(self) # 按需声明对应的成员变量 self.szStack = widgetSize pass # 界面初始化 def uiInit(self) -> None: self._screenAdapter() # 界面自适应 self._changeWndStyle() # 设置成无框架边框 self._centerWidget() # 居中显示 self._changeLine_edit() # 设置用户输入限制 self._setupSignalSlotMapping() # 创建信号映射 先创建信号映射,再加载配方数据 self._loadRecipeData() # 加载配方数据 self._changeTableStyle() # 设置表格样式 pass # ---------------------------------------- # private: # 配方操作按钮布局 def _adjustRecipeOpButtons(self) -> None: nOriginWidth = self.ui.btnAddRecipe.width() nWidthGap = (self.ui.grpRecipeOp.width() - self.ui.btnAddRecipe.width() * 3 - g_uiGeometrySize['WND_MARGIN_HORI'] * 8) / 2 rctTemp = [self.ui.btnAddRecipe.geometry(), self.ui.btnDelRecipe.geometry(), self.ui.btnUpdateRecipe.geometry()] rctTemp[0].setLeft(g_uiGeometrySize['WND_MARGIN_HORI'] * 4) rctTemp[0].setWidth(nOriginWidth) self.ui.btnAddRecipe.setGeometry(rctTemp[0]) # ------------------------------ rctTemp[1].setLeft(rctTemp[0].right() + nWidthGap) rctTemp[1].setWidth(nOriginWidth) self.ui.btnDelRecipe.setGeometry(rctTemp[1]) # ------------------------------ rctTemp[2].setLeft(rctTemp[1].right() + nWidthGap) rctTemp[2].setWidth(nOriginWidth) self.ui.btnUpdateRecipe.setGeometry(rctTemp[2]) # 纵向调整子控件高度 def _adjustVerticalHeight(self) -> None: nBottomPos = self.geometry().bottom() - g_uiGeometrySize['WND_MARGIN_VERT'] # 获取该子页面底部位置 rctTemp = self.ui.tableRecipe.geometry() rctTemp.setBottom(nBottomPos) self.ui.tableRecipe.setGeometry(rctTemp) # 调整配方信息列表的高度 # ---------------------------- rctTemp = self.ui.grpRecipeDetails.geometry() rctTemp.setBottom(nBottomPos) self.ui.grpRecipeDetails.setGeometry(rctTemp) # 调整配方详细组合框高度 # ---------------------------- rctOtherTemp = self.ui.lstRecipeDetail.geometry() rctOtherTemp.setHeight(rctTemp.height() - rctOtherTemp.top() - g_uiGeometrySize['WND_MARGIN_VERT'] * 2) self.ui.lstRecipeDetail.setGeometry(rctOtherTemp) def _adjustTableWidth(self) -> None: # 获取表格水平表头 header = self.ui.tableRecipe.horizontalHeader() # 第一、二、三列设置最小宽度 self.ui.tableRecipe.setColumnWidth(0, 70) self.ui.tableRecipe.setColumnWidth(1, 150) self.ui.tableRecipe.setColumnWidth(2, 150) # 其他列自适应 header.setSectionResizeMode(0, QHeaderView.Interactive) header.setSectionResizeMode(1, QHeaderView.Interactive) header.setSectionResizeMode(2, QHeaderView.Interactive) header.setSectionResizeMode(3, QHeaderView.ResizeToContents) pass # 界面自适应 def _screenAdapter(self) -> None: self.resize(self.szStack[0], self.szStack[1]) self._adjustRecipeOpButtons() self._adjustVerticalHeight() self._adjustTableWidth() pass # 修改窗体属性 def _changeWndStyle(self) -> None: self.setWindowFlags(Qt.WindowType.FramelessWindowHint) pass # 修改表格样式 def _changeTableStyle(self) -> None: # 禁止所有列宽拖动 self.ui.tableRecipe.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed) # 单元格内容居中 for row in range(self.ui.tableRecipe.rowCount()): for col in range(self.ui.tableRecipe.columnCount()): item = self.ui.tableRecipe.item(row, col) if item: item.setTextAlignment(Qt.AlignCenter) # 窗口居中显示 def _centerWidget(self) -> None: pass # 设置用户输入限制 def _changeLine_edit(self) -> None: self.ui.edtRecipeName.installEventFilter(self) # 建立时间触发 # 添加配方到表格 def _addRecipeToTable(self, recipeID: str, createTime: str, updateTime: str, creator: str) -> None: rowPosition = self.ui.tableRecipe.rowCount() self.ui.tableRecipe.insertRow(rowPosition) self.ui.tableRecipe.setItem(rowPosition, 0, QTableWidgetItem(recipeID)) self.ui.tableRecipe.setItem(rowPosition, 1, QTableWidgetItem(createTime)) self.ui.tableRecipe.setItem(rowPosition, 2, QTableWidgetItem(updateTime)) self.ui.tableRecipe.setItem(rowPosition, 3, QTableWidgetItem(creator)) # 加载配方数据到表格 def _loadRecipeData(self) -> None: # 清空表格 self.ui.tableRecipe.setRowCount(0) # 加载配方数据 recipe_list = g_recipeCtrl.readRecipeID_time_creator() # 填充表格 for recipe_info in recipe_list: self._addRecipeToTable(recipe_info[0], recipe_info[1], recipe_info[2], recipe_info[3]) # 重新加载表格样式 self._changeTableStyle() # 建立信号槽连接 def _setupSignalSlotMapping(self) -> None: self.ui.btnAddRecipe.clicked.connect(self._onAddRecipeClicked) self.ui.btnDelRecipe.clicked.connect(self._onDelRecipeClicked) pass # ---------事件重载--------- def eventFilter(self, obj: QObject, event): # 处理对应输入框的键盘事件 if obj == self.ui.edtRecipeName 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 _onAddRecipeClicked(self) -> None: # 获取输入的配方名称 recipe_name = self.ui.edtRecipeName.text().strip() if not recipe_name: QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_INPUT_RECIPE']) return # 检查配方名称是否已存在 if recipe_name in g_recipeCtrl.readAllRecipeNames(): QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_RECIPE_EXIST']) return # 添加配方 success = g_recipeCtrl.addNewRecipe(recipe_name, self.creator) if success: self._loadRecipeData() # 清空输入框 self.ui.edtRecipeName.clear() QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_ADD_RECIPE_SUCCESS']) else: QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_ADD_RECIPE_FAIL']) pass pass @Slot() def _onDelRecipeClicked(self) -> None: # 获取选中的行 selected_items = self.ui.tableRecipe.selectedItems() if not selected_items: QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_RECIPE_SELECT']) return # 获取选中的配方名 selected_recipes = [] for i in range(0, len(selected_items), 4): row = selected_items[i].row() recipe_name = self.ui.tableRecipe.item(row, 0).text() selected_recipes.append(recipe_name) # 确认删除 reply = QMessageBox.question(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_RECIPE_CONFIRM'].format(len(selected_recipes)), QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: success = g_recipeCtrl.delRecipe(selected_recipes) if success: self._loadRecipeData() QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_RECIPE_SUCCESS']) else: QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_RECIPE_FAIL']) pass