From fa36263c613249a38f838f2f9ffe13cf8444580f Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Sun, 20 Jul 2025 16:44:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E8=BD=B4=E9=87=8D?= =?UTF-8?q?=E5=92=8C=E7=BA=BF=E5=BE=84=E8=B6=85=E5=87=BA=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E8=AD=A6=E5=91=8A=E6=8F=90=E7=A4=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/jtDB.db | Bin 192512 -> 196608 bytes from pymodbus.py | 4 +- widgets/main_window.py | 108 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 98 insertions(+), 14 deletions(-) diff --git a/db/jtDB.db b/db/jtDB.db index b23c4dbba04e536055e0484e9dcd478c8ece05c8..8744e45b1a13443687d55dbfceaeb984bc6dacdb 100644 GIT binary patch delta 4692 zcmcIoe{2)i9Y4Rb9sjyq632F(A0!k4gv{o>cXxK|RnWAnrlzG~npr7G9kf6jf)g^5 zumHo5sL&js65rTMQeY`1G3zuKq+QaKK&7ewp=nz+Y11?Tsh!ZW!K$HZoi=Ij5+FY3 zOrg+7`6KuFem|e@z3=C~@4f84Y~Q`xaj2Mko?#eBf2V%B7X=N^pIQ6ArG_@;#btZV z8@(JW0p*an5SZqiecV`{%ktONNXY+(zsX-8$}hjfvx{W!(9Na-ShShp=jJYQoU=!4 zbrx)X+cb|o0UlvCTSX;5?^(99(yr7c+{%Z?dEj&^e>i^59E7kMLS@Ox4uwCl%wSdO zPAo7vom|I4^44cyfzp5C$V^P9a$&#)cG4h9^7jFLCa{P!jRU(Q&;V1Zu{8_$--^H)zYkA1Khw}6On;Y}Q+l-80!4OM681!LSjsjs3hLPln zx9TIv6K|P~2sn(eC%#n|fz_V)k7gq{*f5pUtOteFq%As#5EcYayh#_qAy2$dbJ@NWXL<&p6FhGH!Q=k8!(UQ;i zsaEBQW38ba@O`u!O+1?ykM8SlGLZfzuZfy$Sx{qwd%G|D>q9m zmi~pO)p6Gj7G{4xJ;&f+Sd{b}Ljm&A4p6v8Kry&k6l8c)I7 z9f!eC2+}cR%`T|d@-$xU7)k@~A{dn|>3SJsNY4UkykAc+CtXlGhS*rfSWqqTfPxLO znF`*cL%#FCa;>t7T>GoRTP*+p{Q?%YZK!|c)eY;lYX#|k2lZ?MLnQythC-)^12e`z zQgxebBzZC5`8M(i9ESq_Aja94MSOqE>>Xx@0|jZ#4~e;12IR~T@C0bhb~}1F>`*)1}6JNTRk?Vz1p_%Uc91v|i2wy|rwDzk({ z+rcunt*c#K_ENHKC-@`V+_gvWF#h;8j^AxGW^MI?Hb zCVm(LO9>YP?Rn}k)@T!%+))nN6E=|^m*(629a|Px<(F1DnRy&n!Et59uH~G!xY*?_ zWxTF3#>;V)9#7f4DyOqzPlZ=849<-OAQF9OGBGll*gMhHGx=uE)QLrX{NxIVF&0)o z3t@6>2>MZVax{@r_N3kzP951h(Z6rz~GtCr6Ibn4NbL8(vv*b?n`5rOu6}MhCB+ zS5mJH+$!+KxdRh#@1A&X|1>rskI_G`p89oa>~ON+!qLgYy{Un*ozn$&nk(antiJm%BlQ+2!IozE?rp<5jj? zvy-u7;IIYJ%NGhkNRD0s68SO?+K1me1S$=NB66u4EXd4R64%e^P=I1$J1XZWH?Geg zzSswT&gO9T8_c7|RV1e$gdAqhG;CUDG8#`AS5Z?rj3Ba+G$%kwcfr>|w!QO*cJB%*dzbuNg>_FRWRgN1I?}YWSK`3&T`e8Lc!{ z?-%|+pjyN*gO%?6YE>A8LIME^P-qlTqzNIQ2ZE@!XlUk}*v>e%^9Ok^_gk)( zy6II1+b9>QFUb1vYFSU|L&~Jd#OdThNA<1v2|9}vrJDVfI63Tsy`5}F=HEf$a zM;)r}is?%mQk`%gyagG&ZF1=h9o-vI*1hqb%B05q8!huMY_nXVPJ4H`T4uJLQI|5a X!Yy(!-3{GkDp8j0P?v|#c+>v_YOcfp delta 1194 zcmY*XZA_b06u$3y+qWNYZ{HT|2+#o?Z7CnRs=L*WpHJ;wxT(f?PiaFJc`U6cIzRICOTmYxF5-*@UXB_>ez zcp~vAe=2)P>%uQe@^L`%7PJz@VfL85l;1R-CawCfb+2mgYhHtdFu<&qw`s^KRag&K z+DIv-`OG(WSa6|Z2g(fIr=Q!6&h7S(vA((MrtRgyhaY|TaAbOWc_L~3q*j35Qq~xA zYYCyDHntHjV_(Ha*ia(Gew^|NA}g5Aa%DL6E4bOE=_n_ASvYQkD+U&b9bzkS1qfl^ z#g{oV$ns}oXwhew7iSKb3f3|+lwl*YGDtekx-yEsjN;>2RWY7C{pn)0Q{DaGc=)ZN zoTG@NilahB(rU@miJ_`8EExxPav0HG}_QG-RvE$xT-e)^^7FKpvKkKA-g-!mB3u36e3fC~xG?xY)=!if8`gTD^ z%NTUvw-Knt`(tnf?3HR>iPn}!@+sOQa9btc5QDyQoC||fq=ewTFfhF;(;4)6o`ffd zff+Jk{v%5GHg-V_S>1RdstR)}f;H-}cI=HpGg>C#oQ_AypfI1*trrS>(1GOqALknN z7A3~x#DXS&rcaB~7Y_&+55NV7VV+R^s-#fmn%rj|H@i*irnl&loTFbgJa3E`9b9)p zFJA8N#Kk1n8t8ztxYrJC{J+Zkq=~Bp#OD5PjDF6aprjqX$E^-%;$Gv&U2s`LUm^88 z=Uwqie;dAZmFJ{8;Rg*L=RF?2C^q)D<5U-T@n{Fs2`yO>|1uoH^)B#XWfwH@(xzhA0RGLA#AmpHF6x{0Aff1<0`cW9c;Vr1fXKq3pmm@0vJ*mV^ zU|I;C#6&n-#XXE1czCi{_0XmE;uc0Us)ebVD10M|y*Y(QN3$H)S$QI%qw;UWE;XPo z1~q&ervzvHsLVnUPR;^N4bMVzjeU)ncj;Zz9eK?7f#Dr}ozAY^*E|x3z(dyfGLsN$ zz{O2)b8~1&cCj-vP87D_x~elEG+ 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)