消息框显示主要文本以提醒用户情况,信息性文本以进一步解释警报或询问用户一个问题,以及可选的详细文本,以便在用户请求时提供更多数据。 消息框还可以显示用于接受用户响应的图标和标准按钮。
提供了两个使用QMessageBox的API,基于属性的API和静态函数。 调用静态函数是更简单的方法,但是比使用基于属性的API更不灵活,结果信息较少。
消息对话框分为五种,分别是提示信息、询问、警告、错误、关于。
弹窗类型 | 描述 |
---|---|
QMessageBox.NoIcon | 消息框没有任何图标 |
QMessageBox.Question | 该消息正在提问 |
QMessageBox.Information | 表示该消息没有任何异常 |
QMessageBox.Warning | 表示该消息是警告,但可以处理 |
QMessageBox.Critical | 表示该消息代表一个严重问题 |
可以添加内置的自定义按钮,使用 setStandardButtons() 方法;
如果标准按钮对于您的消息框不够灵活,可以使用 addButton() 重载,它接受 文本 和 ButtonRole 来添加自定义按钮。
QMessageBox 使用 ButtonRole 来确定屏幕上按钮的顺序(根据平台的不同而不同); 可以在调用 exec()之后测试 clickkedbutton()的值
以下描述了标准按钮的标志QMessageBox.StandardButton;每个按钮都有一个定义的 QMessageBox.ButtonRole
标准按钮 | 描述 |
---|---|
QMessageBox.Ok | 使用AcceptRole |
QMessageBox.Open | 使用AcceptRole |
QMessageBox.Save | 使用AcceptRole |
QMessageBox.Cancel | 使用RejectRole |
QMessageBox.Close | 一个用 定义的“关闭”按钮RejectRole |
QMessageBox.Discard | “放弃”或“不保存”按钮,取决于平台,定义为DestructiveRole |
QMessageBox.Apply | 使用ApplyRole |
QMessageBox.Reset | 用ResetRole |
QMessageBox.RestoreDefaults | 使用ResetRole |
QMessageBox.Help | 使用HelpRole |
QMessageBox.SaveAll | 使用AcceptRole |
QMessageBox.Yes | 使用YesRole |
QMessageBox.YesToAll3 | 使用YesRole |
QMessageBox.No | 使用NoRole |
QMessageBox.NoToAll | 使用NoRole |
QMessageBox.Abort | 一个用RejectRole |
QMessageBox.Retry | 使用AcceptRole |
QMessageBox.Ignore | 一个用AcceptRole |
QMessageBox.NoButton | 无效的按钮 |
QMessageBox提供两套接口来实现,一种是static functions(静态方法调用),另外一种 the property-base API(基于属性的API)。直接调用静态方法是一种比较简单的途径,但是没有基于属性API的方式灵活。
一般会使用到其提供的几个 static 函数(C++层的函数原型,其参数类型和python中的一样):
about(QWidget *parent, const QString &title, const QString &text)
question(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
QMessageBox类的 static 函数优点是方便使用,缺点也很明显,非常不灵活。我们只能使用简单的几种形式。为了能够定制QMessageBox细节,我们必须使用QMessageBox的属性设置 API。
from PyQt5.QtWidgets import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setup_ui()
def setup_ui(self):
self.setWindowTitle("消息对话框的使用")
self.resize(300, 500)
self.questButton = QPushButton("questButton")
self.questButton.clicked.connect(self.show_message)
self.infoButton = QPushButton("infoButton")
self.infoButton.clicked.connect(self.show_message)
self.warningButton = QPushButton("warningButton")
self.warningButton.clicked.connect(self.show_message)
self.criticalButton = QPushButton("criticalButton")
self.criticalButton.clicked.connect(self.show_message)
self.aboutButton = QPushButton("aboutQtButton")
self.aboutButton.clicked.connect(self.show_message)
self.infoButton2 = QPushButton("infoButton2")
self.infoButton2.clicked.connect(self.show_message)
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setWindowTitle("The property-base API")
msgBox.setText("The Python file has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setDetailedText("Python is powerful... and fast; \nplays well with others;\n")
fmbox = QFormLayout()
fmbox.addRow("Question", self.questButton)
fmbox.addRow("Infomation", self.infoButton)
fmbox.addRow("Warning", self.warningButton)
fmbox.addRow("Critical", self.criticalButton)
fmbox.addRow("About", self.aboutButton)
fmbox.addRow("Infomation2", self.infoButton2)
self.resultLabel = QLabel("detailed message")
hbox = QHBoxLayout()
hbox.addWidget(self.resultLabel)
fmbox.addRow(hbox)
self.setLayout(fmbox)
def show_message(self):
if self.sender() == self.questButton:
button = QMessageBox.question(self, "Question", "检测到程序有更新,是否安装最新版本?",
QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok)
if button == QMessageBox.Ok:
self.resultLabel.setText("Question: OK
")
elif button == QMessageBox.Cancel:
self.resultLabel.setText("Question: Cancel
")
else:
return
if self.sender() == self.infoButton:
button = QMessageBox.information(self, "Information", "今天是国庆节,休息一下!",
QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok)
if button == self.infoButton.Ok:
self.infoButton.setText("Question: OK
")
elif button == QMessageBox.Cancel:
self.infoButton.setText("Question: Cancel
")
else:
return
if self.sender() == self.criticalButton:
QMessageBox.critical(self, "Critical", "服务器宕机!")
self.resultLabel.setText("Critical
")
if self.sender() == self.aboutButton:
QMessageBox.about(self, "About", "Copyright 2022 June.\n All Right reserved.")
self.resultLabel.setText("About")
if self.sender() == self.infoButton2:
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setWindowTitle("The property-base API")
msgBox.setText("The Python file has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setDetailedText("Python is powerful... and fast; \nplays well with others;\n \
runs everywhere; \n is friendly & easy to learn; \nis Open.")
msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel);
msgBox.setDefaultButton(QMessageBox.Save)
msgBox.exec()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())