diff --git a/db/jtDB.db b/db/jtDB.db index 8744e45..ee9b90e 100644 Binary files a/db/jtDB.db and b/db/jtDB.db differ diff --git a/widgets/main_window.py b/widgets/main_window.py index 87468ee..7ef2a8a 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -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: