QMessageBox的基础用法以及自定义按钮


前言

   网上关于pyqt和pyside的教程和问题解答实在是凌乱的很,最近也在用qt的框架写东西,经过需要自定义一些控件,这篇文章关于QMessageBox的。
  文章分为基础介绍和自定义信息框两部分,有带着问题来的可以直接查看后半段。

一、关于QMessageBox

官方的解释:该类提供了一个模式对话框,用于通知用户或向用户提问并接收答案。此类的继承结构如下:QMessageBox的继承关系

二、标准用法

1.5种常用的对话框

QMessageBox提供的很多常用的对话框样式,如提示、警告、错误、询问、关于,这是日常操作中最常用的对话框,而他们的区别,仅仅是图标和按钮。
常规对话框
官方文档中部分图标的样式
官方图标的样式

以下为各个参数的解释
parent,指父级控件,一般填写self
title,对话框的标题
text,正文文本
buttons,多个标准按钮,除了question默认会显示OK
defaultButton,默认选中的按钮

下面是一个基础应用的案例

import sys
from PySide6.QtWidgets import (QApplication,QPushButton, QMessageBox,QWidget)

class MyWindou(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("QMessageBox实例")
        self.resize(300,100)
        self.bot = QPushButton("弹出对话框",self)
        self.bot.clicked.connect(self.showmeg)

    def showmeg(self):
        reply = QMessageBox.information(self,"标题","------正文------")
        print(reply)

if __name__ == "__main__": 
    app = QApplication(sys.argv)
    widget = MyWindou()
    widget.show()
    app.exec()

运行后的界面如下。
代码运行结果

2.标准按钮

在上个例子中我们并没有去设定对话框的按钮,但大多情况下弹出对话框就是为了让用户选择,因此我们要去设定标准按键。
下面是标准按钮的类型,按键角色是属于下一部分的内容,在此不做讲述。
标准按键与按键角色
此时我们在标准按键上添加上按钮就可以完成基础的对话框了

import sys
from PySide6.QtWidgets import (QApplication,QPushButton, QMessageBox,QWidget)

class MyWindou(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("QMessageBox实例")
        self.resize(300,100)
        self.bot = QPushButton("弹出对话框",self)
        self.bot.clicked.connect(self.showmeg)

    def showmeg(self):
        #多个按钮需要用 | 隔开,使用不同的按钮会返回不同的值,例如 Ok 返回 1024,在后面可以根据值来做if判断
        reply = QMessageBox.information(self,"标题","------正文------",QMessageBox.Ok|QMessageBox.Cancel|QMessageBox.Ignore,QMessageBox.Cancel)
        print(reply)

if __name__ == "__main__": 
    app = QApplication(sys.argv)
    widget = MyWindou()
    widget.show()
    app.exec()

3.自定义按钮

qt提供的默认按钮都是英文的,很多时候是不能满足我们的需求的,那这个时候我们就会用到自定的方法了。PS : pyqt和pyside可能会有些许不同,我并没有在pyqt测试.

想要使用自定义按钮就不能使用QMessageBox提供的默认标准弹窗,因为它只能使用StandardButton,因此我们就需要使用自定义QMessageBox来实现中文显示。
这需要我们了解以下内容:

  1. QMessageBox的定义方法
  2. 添加按钮的角色(ButtonRole)有哪些
  3. QT自带的图标(ps:也可以使用自定义的)

a.首先是第一点,常用的定义方法,这些选项实际就是标准弹窗的内容
一些常用的方法
b.按钮的角色(ButtonRole),自定按钮角色其实在角色设定上并不需要分的特别纠结,因为实际的代码逻辑还是需要自定义的。
按钮的角色
c.QT自带的图标,可以不用添加
默认图标
下面是代码实例

import sys
from PySide6.QtWidgets import (QApplication,QPushButton, QMessageBox,QWidget)

class MyWindou(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("QMessageBox实例")
        self.resize(300,100)
        self.bot = QPushButton("弹出对话框",self)
        self.bot.clicked.connect(self.showmeg)

    def showmeg(self):
        #
        MessageBox = QMessageBox(self)
        MessageBox.setWindowTitle("标题")
        MessageBox.setText("------正文------")
        MessageBox.setIcon(QMessageBox.Question)
        MessageBox.addButton("确定",QMessageBox.YesRole)
        MessageBox.addButton("取消",QMessageBox.NoRole)
        reply = MessageBox.exec()
        if reply == QMessageBox.YesRole:
            print("确定")
        else:
            print("取消")
        

if __name__ == "__main__": 
    app = QApplication(sys.argv)
    widget = MyWindou()
    widget.show()
    app.exec()

运行图
自定义的运行实例

4.封装代码

import sys
from PySide6.QtWidgets import (QApplication, QMessageBox)

class MMessageBox(QMessageBox):

    def __init__(self):
        super().__init__()

    def prompt(self,title: str,text: str,Yesbuttonname: str,Nobuttonname: str,MesIcon):
        if isinstance(MesIcon, QMessageBox.Icon):
            self.setIcon(MesIcon)
        else:
            raise ValueError(f"验证 MesIcon 的值不是QMessageBox.Icon, 而是 {type(MesIcon)}")
        self.setWindowTitle(title)
        self.setText(text)
        YesButton = self.addButton(Yesbuttonname, QMessageBox.YesRole)
        Nobutton = self.addButton(Nobuttonname, QMessageBox.NoRole)
        self.exec()
        if self.clickedButton() == YesButton:
            return "Yes"
        elif self.clickedButton() == Nobutton:
            return "No"
        else:
            return None

    
if __name__ == "__main__": 
    app = QApplication(sys.argv)
    tab_widget = MMessageBox()
    reply = tab_widget.prompt("警告","123","确定","取消",QMessageBox.NoIcon)
    tab_widget.show()
    app.exec()

至此QMessageBox的常用方法完结了,更高级的应用请自行查阅pyqt的文档~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值