feat: 修改轴重和线径超出范围时的警告提示逻辑,添加自动关闭功能

This commit is contained in:
zhu-mengmeng 2025-07-20 16:44:20 +08:00
parent 7dbf1c1efc
commit fa36263c61
3 changed files with 98 additions and 14 deletions

Binary file not shown.

View File

@ -2,7 +2,7 @@ from pymodbus.client import ModbusTcpClient
import time
client = ModbusTcpClient('localhost', port=5020)
client.connect()
client.write_registers(address=11, values=[14322])
client.write_registers(address=11, values=[11322])
# client.write_registers(address=3, values=[0])
# time.sleep(2)
# client.write_registers(address=0, values=[0])
@ -15,7 +15,7 @@ client.write_registers(address=11, values=[14322])
# client.write_registers(address=2, values=[0])
# client.write_registers(address=13, values=[1])
# time.sleep(2)
client.write_registers(address=13, values=[1])
client.write_registers(address=13, values=[0])

View File

@ -2204,6 +2204,66 @@ class MainWindow(MainWindowUI):
logging.warning("工程号为空")
return
# 检查轴重要求范围
if "轴重要求" in self.info_values and self.info_values["轴重要求"] is not None:
try:
zzyq_value = self.info_values["轴重要求"].text().strip()
if zzyq_value and "-" in zzyq_value:
# 解析轴重要求范围,格式如 "12.5-13.5"
parts = zzyq_value.split("-")
if len(parts) == 2:
min_weight = float(parts[0].strip())
max_weight = float(parts[1].strip())
# 检查称重值是否在范围内
if weight_kg < min_weight or weight_kg > max_weight:
# 显示自动关闭的警告提示框
self.warning_msg = QMessageBox(self)
self.warning_msg.setIcon(QMessageBox.Warning)
self.warning_msg.setWindowTitle('重量超出范围')
self.warning_msg.setText(f"称重值 {weight_kg:.3f}kg 不在轴重要求范围内 ({min_weight:.1f} - {max_weight:.1f}kg)")
self.warning_msg.setStandardButtons(QMessageBox.NoButton)
self.warning_msg.setModal(False) # 确保非模态
self.warning_msg.setWindowFlags(self.warning_msg.windowFlags() | Qt.WindowStaysOnTopHint) # 置顶显示
# 使用 show 而非 exec_ 保持非阻塞
self.warning_msg.show()
# 强制关闭方法1使用多种定时器策略
def force_close_weight_warning():
try:
if hasattr(self, 'warning_msg') and self.warning_msg:
if self.warning_msg.isVisible():
self.warning_msg.close()
self.warning_msg.deleteLater()
logging.debug("重量警告弹框已强制关闭")
else:
logging.debug("重量警告弹框已不可见,跳过关闭")
except Exception as e:
logging.warning(f"强制关闭重量警告弹框时出错: {str(e)}")
finally:
# 清理引用
if hasattr(self, 'warning_msg'):
delattr(self, 'warning_msg')
# 使用多个定时器确保关闭
QTimer.singleShot(5000, force_close_weight_warning) # 5秒后关闭
QTimer.singleShot(6000, force_close_weight_warning) # 6秒后再次尝试
# 阻止继续执行,等待用户处理
logging.warning(f"称重值 {weight_kg:.3f}kg 超出轴重要求范围,已阻止保存,等待用户处理")
return
else:
logging.info(f"称重值 {weight_kg:.3f}kg 在轴重要求范围内 ({min_weight:.1f} - {max_weight:.1f}kg)")
else:
logging.debug(f"轴重要求格式不正确: '{zzyq_value}'")
else:
logging.debug(f"轴重要求格式不正确或为空,跳过范围检查: '{zzyq_value}'")
except (ValueError, AttributeError) as e:
logging.warning(f"解析轴重要求失败,跳过范围检查: {str(e)}")
else:
logging.debug("轴重要求字段不存在或为空,跳过范围检查")
# 暂时断开信号连接避免触发cellChanged信号
try:
self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed)
@ -3216,18 +3276,42 @@ class MainWindow(MainWindowUI):
self.set_inspection_value('xj', xj_config, final_value)
logging.info(f"已将稳定的线径值 {final_value:.3f} 保存到工程号 {gc_note} (行 {data_row})")
else:
reply = QMessageBox.question(
self,
'确认保存',
f"线径 {final_value:.3f} 不在公差范围内 ({bccd} - {tccd})\n是否继续保存?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply == QMessageBox.Yes:
self.set_inspection_value('xj', xj_config, final_value)
logging.info(f"已将超出公差范围的线径值 {final_value:.3f} 保存到工程号 {gc_note} (行 {data_row})")
else:
logging.info(f"用户取消保存超出范围的线径值: {final_value:.3f}")
# 显示自动关闭的警告提示框
self.diameter_warning_msg = QMessageBox(self)
self.diameter_warning_msg.setIcon(QMessageBox.Warning)
self.diameter_warning_msg.setWindowTitle('线径超出范围')
self.diameter_warning_msg.setText(f"线径 {final_value:.3f} 不在公差范围内 ({bccd} - {tccd})")
self.diameter_warning_msg.setStandardButtons(QMessageBox.NoButton) # 不显示按钮
self.diameter_warning_msg.setModal(False) # 确保非模态
self.diameter_warning_msg.setWindowFlags(self.diameter_warning_msg.windowFlags() | Qt.WindowStaysOnTopHint) # 置顶显示
# 显示提示框(非模态)
self.diameter_warning_msg.show()
# 强制关闭方法:使用多种定时器策略
def force_close_diameter_warning():
try:
if hasattr(self, 'diameter_warning_msg') and self.diameter_warning_msg:
if self.diameter_warning_msg.isVisible():
self.diameter_warning_msg.close()
self.diameter_warning_msg.deleteLater()
logging.debug("线径警告弹框已强制关闭")
else:
logging.debug("线径警告弹框已不可见,跳过关闭")
except Exception as e:
logging.warning(f"强制关闭线径警告弹框时出错: {str(e)}")
finally:
# 清理引用
if hasattr(self, 'diameter_warning_msg'):
delattr(self, 'diameter_warning_msg')
# 使用多个定时器确保关闭
QTimer.singleShot(2000, force_close_diameter_warning) # 1秒后关闭
QTimer.singleShot(3000, force_close_diameter_warning) # 2秒后再次尝试
# 阻止继续执行,等待用户处理
logging.warning(f"线径值 {final_value:.3f} 超出公差范围,已阻止保存,等待用户处理")
return
else:
# 无公差范围,直接保存
self.set_inspection_value('xj', xj_config, final_value)