QMessageBox右上角关闭按钮检测异常:Rejected分支未触发却走No分支
QMessageBox关闭叉号误触发No分支的解决方法
你在使用QMessageBox时设置了Yes和No按钮,希望通过QMessageBox.Rejected分支捕获用户点击右上角叉号的操作,但实际点击叉号时却总是进入No分支。
问题原因
Qt默认会将QMessageBox.No按钮标记为RejectRole角色,而QMessageBox的关闭叉号(escape操作)会自动触发对应RejectRole角色的按钮动作,因此点击叉号等同于点击了No按钮,返回值为QMessageBox.No而非QMessageBox.Rejected。
解决方法
要区分点击No按钮和关闭叉号的操作,需要修改QMessageBox的escape按钮设置,让关闭叉号返回QMessageBox.Rejected而非No的对应值。以下是两种常用实现方式:
方法一:直接设置Escape按钮为无效值
通过setEscapeButton(-1)让关闭叉号不再关联No按钮,此时点击叉号会返回QMessageBox.Rejected:
msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Question) msgBox.setText("Do you want to add more items?") msgBox.setWindowTitle("Add more items") msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) # 关键:设置Escape按钮为无效值,关闭叉号将返回Rejected msgBox.setEscapeButton(-1) path = f"Purchasing_Order_{pdf_vendorName}_{pdf_contact}.pdf" returnValue = msgBox.exec() if returnValue == QMessageBox.Yes: # do this pass elif returnValue == QMessageBox.No: generate_purchase_reciept(pdf_dataframe, multi_item_df) # do this try: msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Question) msgBox.setWindowIcon(QtGui.QIcon("whatsapp-logo.png")) msgBox.setText("Do you want to send this bill to Client's WhatsApp?") msgBox.setWindowTitle("WhatsApp Message Send Option") msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) # 同样给该对话框设置Escape按钮 msgBox.setEscapeButton(-1) returnValue = msgBox.exec() path = f"Purchasing_Order_{pdf_vendorName}_{pdf_contact}.pdf" if returnValue == QMessageBox.Ok: # do this pass elif returnValue == QMessageBox.Rejected: print("WhatsApp dialog closed without choice") except: # do this pass from MainPage import Ui_Form2 Form.close() self.MainWindow = QtWidgets.QMainWindow() self.mainpage = Ui_Form2() self.mainpage.setupUi(self.MainWindow) self.MainWindow.show() elif returnValue == QMessageBox.Rejected: print("Message box closed without making a choice")
方法二:添加隐藏的Reject按钮并关联Escape操作
通过添加一个隐藏的、对应RejectRole的按钮,将Escape操作绑定到该按钮,以此区分No按钮和关闭叉号:
msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Question) msgBox.setText("Do you want to add more items?") msgBox.setWindowTitle("Add more items") # 添加标准按钮并获取引用 yes_btn = msgBox.addButton(QMessageBox.Yes) no_btn = msgBox.addButton(QMessageBox.No) # 添加隐藏的Reject按钮 reject_btn = msgBox.addButton(QMessageBox.RejectRole) reject_btn.hide() # 设置Escape按钮为隐藏的Reject按钮 msgBox.setEscapeButton(reject_btn) path = f"Purchasing_Order_{pdf_vendorName}_{pdf_contact}.pdf" returnValue = msgBox.exec() if msgBox.clickedButton() == yes_btn: # do this pass elif msgBox.clickedButton() == no_btn: generate_purchase_reciept(pdf_dataframe, multi_item_df) # do this try: msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Question) msgBox.setWindowIcon(QtGui.QIcon("whatsapp-logo.png")) msgBox.setText("Do you want to send this bill to Client's WhatsApp?") msgBox.setWindowTitle("WhatsApp Message Send Option") ok_btn = msgBox.addButton(QMessageBox.Ok) cancel_btn = msgBox.addButton(QMessageBox.Cancel) reject_btn_whatsapp = msgBox.addButton(QMessageBox.RejectRole) reject_btn_whatsapp.hide() msgBox.setEscapeButton(reject_btn_whatsapp) msgBox.exec() path = f"Purchasing_Order_{pdf_vendorName}_{pdf_contact}.pdf" if msgBox.clickedButton() == ok_btn: # do this pass except: # do this pass from MainPage import Ui_Form2 Form.close() self.MainWindow = QtWidgets.QMainWindow() self.mainpage = Ui_Form2() self.mainpage.setupUi(self.MainWindow) self.MainWindow.show() elif msgBox.clickedButton() == reject_btn: print("Message box closed without making a choice")
内容的提问来源于stack exchange,提问作者aashahid
相关产品推荐
相关产品推荐

