feat: 添加线径警告信号机制,优化警告提示框的显示与关闭逻辑

This commit is contained in:
zhu-mengmeng 2025-07-20 17:39:48 +08:00
parent fa36263c61
commit d81765e7d2
2 changed files with 63 additions and 32 deletions

Binary file not shown.

View File

@ -57,6 +57,7 @@ class MainWindow(MainWindowUI):
unloading_level_ui_signal = Signal(int) # 用于在主线程中更新下料层数UI
unloading_position_ui_signal = Signal(int) # 用于在主线程中更新下料位置UI
emergency_stop_signal = Signal(int, str) # 用于在主线程中处理急停信号
diameter_warning_signal = Signal(float, str, str) # 参数final_value, bccd, tccd
def __init__(self, user_id=None, user_name=None, corp_name=None, corp_id=None):
"""初始化主窗口"""
@ -321,6 +322,9 @@ class MainWindow(MainWindowUI):
# 连接急停信号
self.emergency_stop_signal.connect(self._handle_emergency_stop_ui)
# 连接线径警告信号
self.diameter_warning_signal.connect(self.show_diameter_warning)
# 连接炉号查询按钮信号
if hasattr(self, 'luno_query_button'):
self.luno_query_button.clicked.connect(self.handle_luno_query)
@ -2217,6 +2221,11 @@ class MainWindow(MainWindowUI):
# 检查称重值是否在范围内
if weight_kg < min_weight or weight_kg > max_weight:
# 写入寄存器D10 给值 2 表示重量超出范围
modbus = ModbusUtils()
client = modbus.get_client()
modbus.write_register_until_success(client, 10, 2)
modbus.close_client(client)
# 显示自动关闭的警告提示框
self.warning_msg = QMessageBox(self)
self.warning_msg.setIcon(QMessageBox.Warning)
@ -3276,38 +3285,11 @@ class MainWindow(MainWindowUI):
self.set_inspection_value('xj', xj_config, final_value)
logging.info(f"已将稳定的线径值 {final_value:.3f} 保存到工程号 {gc_note} (行 {data_row})")
else:
# 显示自动关闭的警告提示框
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_signal.emit(final_value, bccd, tccd)
# 显示提示框(非模态)
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秒后再次尝试
# 重置测量列表,防止重复触发
self._diameter_measurements = []
# 阻止继续执行,等待用户处理
logging.warning(f"线径值 {final_value:.3f} 超出公差范围,已阻止保存,等待用户处理")
@ -3360,6 +3342,56 @@ class MainWindow(MainWindowUI):
self._diameter_session_measurements = []
self._diameter_session_start_time = 0
@Slot(float, str, str)
def show_diameter_warning(self, final_value, bccd, tccd):
"""显示线径超出范围警告(在主线程中执行)"""
try:
# 显示自动关闭的警告提示框
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()
# Windows平台强制关闭方法
def force_close_diameter_warning():
try:
if hasattr(self, 'diameter_warning_msg') and self.diameter_warning_msg:
if self.diameter_warning_msg.isVisible():
# 方法1正常关闭
self.diameter_warning_msg.close()
# 方法2强制删除
self.diameter_warning_msg.deleteLater()
# 方法3隐藏窗口
self.diameter_warning_msg.hide()
# 方法4设置为不可见
self.diameter_warning_msg.setVisible(False)
logging.debug("线径警告弹框已强制关闭")
else:
logging.debug("线径警告弹框已不可见,跳过关闭")
except Exception as e:
logging.warning(f"强制关闭线径警告弹框时出错: {str(e)}")
finally:
# 清理引用
try:
if hasattr(self, 'diameter_warning_msg'):
delattr(self, 'diameter_warning_msg')
except:
pass
# 使用多个定时器确保关闭Windows平台优化
QTimer.singleShot(2000, force_close_diameter_warning) # 1秒后关闭
QTimer.singleShot(3000, force_close_diameter_warning) # 2秒后最后尝试
logging.info(f"线径警告弹框已显示将在1-3秒后自动关闭")
except Exception as e:
logging.error(f"显示线径警告弹框时出错: {str(e)}")
def on_scanner_data_received(self, port_name, data):
"""扫码器数据接收回调函数
@ -3859,7 +3891,6 @@ class MainWindow(MainWindowUI):
elif self.record_table.selectionModel().hasSelection():
self._delete_package_table_rows()
else:
QMessageBox.warning(self, "提示", "请先选择要删除的数据行")
return
except Exception as e: