PyQt5 如何禁用QMessageBox弹出时的声音及自定义设置QMessageBox属性

本文介绍了一个使用Python和PyQt5开发的批量开发票工具,该工具能够将Excel清单中的数据导入到开票软件中,同时提供了两种弹出消息提示框的方法,并解决了提示音问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

我是一个小白,看到财务大姐开发票几十行的清单一个个的敲到开票软件里太恼火了,正好在学习python就想能不能边学边做帮搞一个直接把Excel清单导入开票软件里批量开发票的工具,现在能正常使用了,但设置的消息提示框弹出的声音太烦人,在网上查了些方法,现在记录下来方便以后查找。


直接上代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox,QCheckBox,QVBoxLayout,QMainWindow
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap

class Demo(QMainWindow):
    def __init__(self):
        super(Demo, self).__init__()
        self.button = QPushButton("第一种弹出消息")
        self.button.clicked.connect(self.show_message)
        self.button2 = QPushButton("第二种弹出消息")
        self.button2.clicked.connect(self.show_message2)

        layout = QVBoxLayout()
        layout.addWidget(self.button)
        layout.addWidget(self.button2)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def AA(self,bt):
        print('按钮被点击了',bt)
        print('点击的按钮是:', self.mb.clickedButton())
        # clickedButton()    #返回被点击的按钮

    def show_message(self):
        mb = QMessageBox(self)  # 创建信息对话框
        # 继承于QDialog,需要show,exec,open来弹出
        # 默认是一个模态对话框,即使show弹出的对话框也是模态的
        # mb = QMessageBox(QMessageBox.NoIcon,'对话框标题','<h2>主要标题信息</h2>',QMessageBox.Ok | QMessageBox.Discard    ,self)
        # 参数1 图标:
        # QMessageBox.NoIcon  没有图标
        # QMessageBox.Warning  警告图标
        # QMessageBox.Critical  严重问题图标
        # QMessageBox.Information   没有任何异常图标
        # QMessageBox.Question  提问图标
        # 参数2 对话框标题
        # 参数3 主要标题信息--可以是富文本
        # 参数4 按钮:
        # QMessageBox.Ok          使用AcceptRole定义的“确定”按钮
        # QMessageBox.Discard     “丢弃”或“不保存”按钮,具体取决于使用DestructiveRole定义的平台
        # QMessageBox.Open   使用AcceptRole定义的“打开”按钮。
        # QMessageBox.Save   使用AcceptRole定义的“保存”按钮。
        # QMessageBox.Cancel   使用RejectRole定义的“取消”按钮。
        # QMessageBox.Close   使用RejectRole定义的“关闭”按钮。
        # QMessageBox.Apply   使用ApplyRole定义的“应用”按钮。
        # QMessageBox.Reset   使用ResetRole定义的“重置”按钮。
        # QMessageBox.RestoreDefaults  使用ResetRole定义的“恢复默认值”按钮。
        # QMessageBox.SaveAll   使用AcceptRole定义的“全部保存”按钮。
        # QMessageBox.Yes   使用YesRole定义的“是”按钮。
        # QMessageBox.YesToAll   使用YesRole定义的“Yes to All”按钮。
        # QMessageBox.No   使用NoRole定义的“否”按钮。
        # QMessageBox.Help  使用HelpRole定义的“帮助”按钮。
        # QMessageBox.NoToAll  使用NoRole定义的“No to All”按钮。
        # QMessageBox.Abort   使用RejectRole定义的“Abort”按钮。
        # QMessageBox.Retry  使用AcceptRole定义的“重试”按钮。
        # QMessageBox.Ignore   使用AcceptRole定义的“忽略”按钮。
        # QMessageBox.NoButton   无效按钮。
        self.mb = mb

        # mb.setModal(False)  #设置是否模态对话框
        mb.setWindowModality(Qt.NonModal)  # 设置成非模态
        mb.setIcon(QMessageBox.Question)  # 设置标准图标
        # mb.setIconPixmap(QPixmap('./大象.png').scaled(100,100))  #用自定义图像做图标
        mb.setTextFormat(Qt.AutoText)  # 设置文本格式
        # Qt.PlainText  普通文本
        # Qt.RichText  富文本--默认
        # Qt.AutoText   自动识别

        mb.setText('<h2>我是主要标题信息</h2>')  # 设置主要标题信息---支持富文本
        mb.setInformativeText('<h3>提示信息</h3>')  # 设置提示信息---支持富文本
        # informativeText()   返回提示文本

        mb.setCheckBox(QCheckBox('复选框', mb))  # 设置复选框
        mb.setDetailedText('我是详细文本')  # 设置详细文本---不支持富文本
        # 按钮:
        mb.setStandardButtons(QMessageBox.Yes)  # 添加标准按钮
        # 设置了Yes和No按钮
        # 按钮类型看上面
        btn = QPushButton('按钮1', mb)
        mb.addButton(btn, QMessageBox.YesRole)  # 添加自定义按钮--方式一
        btn1 = mb.addButton('按钮2', QMessageBox.NoRole)  # 方式二
        # 参数2 按钮角色:
        # YesRole  按钮是一个“是”的按钮
        # InvalidRole   该按钮无效
        # AcceptRole  单击该按钮将使对话框被接受(例如,确定)
        # RejectRole  单击该按钮会导致拒绝对话框(例如取消)
        # DestructiveRole  单击该按钮会导致破坏性更改(例如,对于Discarding Changes)并关闭对话框
        # ActionRole  单击该按钮将导致更改对话框中的元素
        # HelpRole   可以单击该按钮以请求帮助。
        # NoRole  按钮是一个“无”按钮。
        # ApplyRole  该按钮应用当前更改。
        # ResetRole  该按钮将对话框的字段重置为默认值。
        # 返回值:按钮对象

        btn5 = mb.button(QMessageBox.Yes)  # 返回标准按钮的对象

        s = mb.buttonRole(btn1)  # 返回按钮的角色对象

        # mb.removeButton(btn1)  #移除按钮

        mb.setDefaultButton(btn1)  # 设置自定义默认按钮
        mb.setDefaultButton(QMessageBox.Yes)  # 设置标准默认按钮

        s = mb.defaultButton()  # 返回默认按钮

        mb.setEscapeButton(btn1)  # 设置ESC所对应的按钮--自定义
        mb.setEscapeButton(QMessageBox.Yes)  # 设置ESC所对应的按钮--标准按钮

        mb.setTextInteractionFlags(Qt.NoTextInteraction)  # 设置文本交互标志--针对主要标题信息
        # Qt.TextEditorInteraction  允许文本交互---允许编辑
        # Qt.NoTextInteraction   不允许交互

        # 信号:
        mb.buttonClicked.connect(self.AA)  # 按钮被点击时发出信号
        # 会把被点击的按钮对象传递给槽函数

        print(s)
        mb.show()

    def show_message2(self):
        message = '<p>检测到还没有商品编码信息!</p>' \
                  '<p>请选择【商品编码】选项卡下部的【导入商品编码】导入。</p>'
        MsgBox = QMessageBox()
        MsgBox.setStyleSheet("QLabel#qt_msgbox_label{background-color: transparent;min-width: 400px;padding-left: 0px;}"
                             "QPushButton{min-width:85px;min-height:25px; border: 1px solid green;border-radius:5px;}"
                             "QPushButton:hover{color:white;background:#6DDF6D;}"  # background-color: #298DFF;color: #F2F2F2;
                             "QMessageBox{color: #298DFF;background-color: #F2F2F2; border:1px solid #CCFFF6;border-radius:3px;}")
        MsgBox.setIconPixmap(QPixmap(':/img/pic/warning.png').scaled(50, 50))  #  自定义图标后弹出就没有声音了
        # MsgBox.setIcon(QMessageBox.Information)
        MsgBox.setWindowTitle('提示')
        MsgBox.setWindowFlags(Qt.Drawer)  # 去掉左上角图标
        yesButton = MsgBox.addButton("确定", QMessageBox.ActionRole)
        noButton = MsgBox.addButton("退出", QMessageBox.ActionRole)
        # MsgBox.setDefaultButton(noButton)  # 设置默认被选中的按钮.
        # cancelButton = MsgBox.addButton("cancel", QMessageBox.ActionRole)
        MsgBox.setText(message)
        MsgBox.exec_()
        button = MsgBox.clickedButton()
        if button == yesButton:
            print('点了确定按钮')
        else:
            print('点了退出按钮')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

第一种方法参考的是: www.cnblogs.com/liming19680104/p/10356966.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值