From 80272b92b40560af65cdb8713905d4ec1106d110 Mon Sep 17 00:00:00 2001 From: yanganjie Date: Thu, 11 Sep 2025 18:42:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=86=E6=A8=A1=E5=85=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=A8=A1?= =?UTF-8?q?=E5=85=B7=E7=82=B9=E4=BD=8D=E8=AE=BE=E7=BD=AE=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_moju.py | 42 ++---- tests/test_moju_point_set.py | 259 +++++++++++++++++++++++++++++++++++ 2 files changed, 272 insertions(+), 29 deletions(-) create mode 100644 tests/test_moju_point_set.py diff --git a/tests/test_moju.py b/tests/test_moju.py index 5d5ac4c..fd561cd 100644 --- a/tests/test_moju.py +++ b/tests/test_moju.py @@ -15,7 +15,7 @@ from PySide6.QtWidgets import ( ) from PySide6.QtCore import Qt from PySide6.QtGui import QFont -from qfluentwidgets import PushButton, ComboBox, LineEdit +from qfluentwidgets import PushButton, ComboBox, LineEdit, PrimaryPushButton # 模具管理界面 @@ -52,33 +52,25 @@ class MoldManagementUI(QWidget): self.serial_edit.setFont(self.left_font) # 输入框字体 self.type_combo = ComboBox() - self.type_combo.addItems(["一板一个", "一板多个", "其他类型"]) + self.type_combo.addItems(["一板一个", "一板两个", "一板三个", "一板四个"]) self.type_combo.setFont(self.left_font) # 下拉框字体 # 左侧按钮(上传点位等) - self.btn_upload_model = PushButton("从文件上传") - self.btn_suction_point = PushButton("上传点位") - self.btn_place_point = PushButton("上传点位") - self.btn_pick_point = PushButton("上传点位") - self.btn_high_freq = PushButton("上传点位") + self.btn_upload_model = PrimaryPushButton("从文件上传") + self.btn_suction_point = PrimaryPushButton("上传点位") + self.btn_place_point = PrimaryPushButton("上传点位") + self.btn_pick_point = PrimaryPushButton("上传点位") + self.btn_high_freq = PrimaryPushButton("上传点位") # 右侧操作按钮 - self.btn_upload_mold = PushButton("上传模具") - self.btn_modify_mold = PushButton("修改模具") - self.btn_delete_mold = PushButton("删除模具") - self.btn_batch_upload = PushButton("通过文件上传") # 需要文件对话框 + self.btn_upload_mold = PrimaryPushButton("上传模具") + self.btn_modify_mold = PrimaryPushButton("修改模具") + self.btn_delete_mold = PrimaryPushButton("删除模具") + self.btn_batch_upload = PrimaryPushButton("通过文件上传") # 需要文件对话框 def __initStyles(self): # ========== 设置样式 ========== # 1. 左侧按钮样式(适中大小) - left_btn_style = """ - QPushButton { - min-height: 40px; - min-width: 150px; - font-size: 14px; - padding: 5px 10px; - } - """ for btn in [ self.btn_upload_model, self.btn_suction_point, @@ -86,24 +78,16 @@ class MoldManagementUI(QWidget): self.btn_pick_point, self.btn_high_freq, ]: - btn.setStyleSheet(left_btn_style) + btn.setFixedHeight(46) # 2. 右侧按钮样式(较大尺寸) - right_btn_style = """ - QPushButton { - min-height: 36px; - min-width: 166px; - font-size: 16px; - padding: 10px 20px; - } - """ for btn in [ self.btn_upload_mold, self.btn_modify_mold, self.btn_delete_mold, self.btn_batch_upload, ]: - btn.setStyleSheet(right_btn_style) + btn.setFixedHeight(99) def __initLayout(self): # ========== 布局设计 ========= diff --git a/tests/test_moju_point_set.py b/tests/test_moju_point_set.py new file mode 100644 index 0000000..c4d6c93 --- /dev/null +++ b/tests/test_moju_point_set.py @@ -0,0 +1,259 @@ +from common import * +from PySide6.QtWidgets import ( + QWidget, + QLabel, + QHBoxLayout, + QVBoxLayout, + QDoubleSpinBox, + QLayout, + QApplication, + QDialog, +) +from qfluentwidgets import ( + PrimaryPushButton, + PushButton, + StrongBodyLabel, + SubtitleLabel, + DoubleSpinBox, + MessageBox, + isDarkTheme, + setTheme, + Theme, +) +import random + + +class MoJuPointSetDialog(QDialog): + def __init__(self, point_name, parent=None): + super().__init__(parent) + + self.setWindowTitle("模具点位设置") + self.resize(850, 320) + + # 0. 传入的点位名称 + self.point_name = point_name + # 1. 点位名称编号 + self.current_point_num = 1 # 当前点位编号(初始为1) + # 2. 存储各轴输入框:key=轴名(X/Y/Z/Rx/Ry/Rz), value=DoubleSpinBox对象 + self.axis_spins = {} + # 3. 存储已经设置好的点位 {点位名称1: [x, y, z, rx, ry, rz], ......} + self.point_dict = {} + + self.init_ui() + + self._initThemeStyle() + + def init_ui(self): + # 主布局:垂直排列顶部区域和“添加下一个点”按钮 + main_layout = QVBoxLayout(self) + main_layout.setSpacing(30) # 组件间间距 + main_layout.setContentsMargins(20, 20, 20, 20) # 窗口边距 + + # ---------- 顶部区域:点标签 + 坐标输入 + 右侧按钮 ---------- + top_layout = QHBoxLayout() + top_layout.setSpacing(40) # 左右区域间距 + + # ---- 左侧:点标签 + 坐标输入 ---- + left_layout = QVBoxLayout() + left_layout.setSpacing(20) + + # “点1:” 标签行 + point_label_layout = QHBoxLayout() + self.point_label = SubtitleLabel(f"{self.point_name}{self.current_point_num}") + point_label_layout.addWidget(self.point_label) + point_label_layout.addStretch() # 让标签靠左 + left_layout.addLayout(point_label_layout) + + # X/Y/Z 输入行 + xyz_layout = QHBoxLayout() + self._add_axis_input(xyz_layout, "X") + xyz_layout.addSpacing(30) # 轴之间的间距 + self._add_axis_input(xyz_layout, "Y") + xyz_layout.addSpacing(30) + self._add_axis_input(xyz_layout, "Z") + left_layout.addLayout(xyz_layout) + + # Rx/Ry/Rz 输入行 + rxyz_layout = QHBoxLayout() + self._add_axis_input(rxyz_layout, "Rx") + rxyz_layout.addSpacing(30) + self._add_axis_input(rxyz_layout, "Ry") + rxyz_layout.addSpacing(30) + self._add_axis_input(rxyz_layout, "Rz") + left_layout.addLayout(rxyz_layout) + + top_layout.addLayout(left_layout) + + # ---- 右侧:三个功能按钮 ---- + right_layout = QVBoxLayout() + right_layout.setSpacing(20) # 按钮间间距 + + # “获取机械臂点位” 按钮 + get_robot_btn = PrimaryPushButton("获取机械臂点位") + get_robot_btn.clicked.connect(self.onGetRobotPos) + + # “确认上传” 按钮 + confirm_upload_btn = PrimaryPushButton("确认上传") + confirm_upload_btn.clicked.connect(self.onConfirmUpload) + + # “返回上页” 按钮 + return_btn = PrimaryPushButton("返回上页") + return_btn.clicked.connect(self.onReturnBeforePage) + + right_layout.addWidget(get_robot_btn) + right_layout.addWidget(confirm_upload_btn) + right_layout.addWidget(return_btn) + + top_layout.addLayout(right_layout) + main_layout.addLayout(top_layout) + + # ---------- 底部:“添加下一个点” 按钮 ---------- + add_next_layout = QHBoxLayout() + + add_next_layout.addStretch() + add_next_btn = PrimaryPushButton("添加下一个点") + add_next_btn.setMinimumSize(180, 40) + add_next_btn.setMaximumSize(220, 45) + add_next_btn.clicked.connect(self.onAddNextPoint) + + add_next_layout.addWidget(add_next_btn) + # 添加右侧伸缩项,将按钮固定在中间 + add_next_layout.addStretch() + + main_layout.addLayout(add_next_layout) + + def _add_axis_input(self, layout: QHBoxLayout, axis_name: str): + """添加“标签 + 双精度输入框”到布局""" + label = StrongBodyLabel(f"{axis_name}:") + spin = DoubleSpinBox() + spin.setRange(-180, 180) # 数值范围 + spin.setSingleStep(0.1) # 步长(滚轮或上下键的变化量) + spin.setDecimals(3) # 小数位数 + self.axis_spins[axis_name] = spin # 放双精度输入框的字典 + layout.addWidget(label) + layout.addWidget(spin) + + # ---------- 按钮点击槽函数 ---------- + def onGetRobotPos(self): + for spin in self.axis_spins.values(): + random_num = round(random.uniform(-180, 180), 3) + spin.setValue(random_num) + + def onConfirmUpload(self): + # 确认上传 + + # 1、先保存当前界面的数据,再上传 + self.__saveCurentPoint() + + # 2、点位写入数据库? + print(self.point_dict) + + # 3 、提示 + if self.point_dict: + # 提取所有点位名(字典的key),并格式化为列表 + point_names = list(self.point_dict.keys()) + # 构造提示文本(用换行和符号美化显示) + message = "以下点位上传成功:\n" + for name in point_names: + message += f"• {name}\n" # 用•符号列出每个点位名 + # 弹出成功提示框 + MessageBox( + "上传成功", # 标题 + message, # 内容 + self, # 父窗口 + ).exec() + + # 4、确认上传之后,关闭点位上传对话框 + self.close() + + # 返回上一页 + def onReturnBeforePage(self): + if self.current_point_num <= 1: + MessageBox( + "错误", + f"已处于第一个点位 ({self.point_name}1) ,无法继续返回上一页", + self, + ).exec() + return # 直接返回,不执行后续操作 + + # 0. 先保存当前界面的数据,再返回上一页 + self.__saveCurentPoint() + + # 1、当前编号减一和更新标签 + self.current_point_num -= 1 + self.point_label.setText(f"{self.point_name}{self.current_point_num}") + + # 2、显示上一页点位名的点位数据 + before_point_name = self.point_label.text() + if before_point_name in self.point_dict: + self.__showPointValue(before_point_name) + else: + # 上一页点位名不存在 + for spin in self.axis_spins.values(): + spin.setValue(0.0) + # 上一页的点位数据缺失,请重新获取并设置点位 + # 这里是发生了异常,一般情况,不会没有保存上一页点位数据 + MessageBox( + "异常", + f"上一页的点位数据缺失,请重新获取并设置点位", + self, + ).exec() + + def onAddNextPoint(self): + # 0. 先保存当前界面的数据,再跳转到下一页 + self.__saveCurentPoint() + + # 1. 跳转下一页,更新点位编号和标签 + self.current_point_num += 1 + self.point_label.setText(f"{self.point_name}{self.current_point_num}") + + # 2. 如果下一页的点位数据已经保存,则获取并显示 + # 否则清空所有输入框的值(设置为0.0), 表示仍然需要设置 + next_point_name = self.point_label.text() + if next_point_name in self.point_dict: + self.__showPointValue(next_point_name) + else: + for spin in self.axis_spins.values(): + spin.setValue(0.0) + + # 保存当前界面的点位 + def __saveCurentPoint(self): + current_point_value = [ + self.axis_spins["X"].value(), + self.axis_spins["Y"].value(), + self.axis_spins["Z"].value(), + self.axis_spins["Rx"].value(), + self.axis_spins["Ry"].value(), + self.axis_spins["Rz"].value(), + ] + self.point_dict[f"{self.point_name}{self.current_point_num}"] = ( + current_point_value + ) + + # 根据点位名称,显示点位值 (字典中保存的) + def __showPointValue(self, point_name: str): + if point_name not in self.point_dict: + return + + coords = self.point_dict[point_name] + self.axis_spins["X"].setValue(coords[0]) + self.axis_spins["Y"].setValue(coords[1]) + self.axis_spins["Z"].setValue(coords[2]) + self.axis_spins["Rx"].setValue(coords[3]) + self.axis_spins["Ry"].setValue(coords[4]) + self.axis_spins["Rz"].setValue(coords[5]) + + # 根据主题初始化样式表 + def _initThemeStyle(self): + if isDarkTheme(): # 深色主题 + self.setStyleSheet("background-color: rgb(32, 32, 32);") + else: # 浅色主题 + self.setStyleSheet("background-color: rgb(243, 243, 243);") + + +if __name__ == "__main__": + app = QApplication([]) + setTheme(Theme.DARK) + window = MoJuPointSetDialog("吸取点") + window.show() + sys.exit(app.exec())