前言
网上关于pyqt和pyside的教程和问题解答实在是凌乱的很,最近也在用qt的框架写东西,经过需要自定义一些控件,这篇文章关于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来实现中文显示。
这需要我们了解以下内容:
- QMessageBox的定义方法
- 添加按钮的角色(ButtonRole)有哪些
- 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的文档~