You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:11:04