feat: 添加线径警告信号机制,优化警告提示框的显示与关闭逻辑
This commit is contained in:
parent
fa36263c61
commit
d81765e7d2
BIN
db/jtDB.db
BIN
db/jtDB.db
Binary file not shown.
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user