消息彈窗
-
消息對話框主要涉及QMessageBox類,QMessageBox類提供了一個模態對話框,用於通知用戶或詢問用戶問題並接收答案
-
消息框顯示主要文本以提醒用戶情況,信息性文本以進一步解釋警報或詢問用戶一個問題,以及可選的詳細文本,以便在用戶請求時提供更多數據
- 消息框還可以顯示用於接受用戶響應的圖標和標准按鈕
-
消息對話框分為五種,分別是提示信息、詢問、警告、錯誤、關於
- 其中關於又分為兩種,一種是一般性關於、另一種是介紹性關於
- 提供了兩個 API 供使用QMessageBox,基於屬性的 API 和靜態函數,調用靜態函數是更簡單的方法,但是比使用基於屬性的API更不靈活,結果信息較少
# 基於屬性的 API
msgBox = QMessageBox()
msgBox.setText("The document has been modified.")
msgBox.exec_()
# 靜態函數 API
ret = QMessageBox.warning(self, self.tr("My Application"),
self.tr("The document has been modified.\n" + \
"Do you want to save your changes?"),
QMessageBox.Save | QMessageBox.Discard
| QMessageBox.Cancel,
QMessageBox.Save)
- 嚴重性級別和圖標和像素圖屬性
像素圖片 | 級別 | 說明 |
---|---|---|
![]() |
Question | 用於在正常操作期間提出問題 |
![]() |
Information | 用於報告有關正常操作的信息 |
![]() |
Warning | 用於報告非嚴重錯誤。 |
![]() |
Critical | 用於報告嚴重錯誤。 |
- 常用的消息彈窗 QMessageBox.Icon
彈窗類型 | 描述 |
---|---|
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.YesToAll | 使用YesRole |
QMessageBox.No | 用NoRole |
QMessageBox.NoToAll | 使用NoRole |
QMessageBox.Abort | 一個用RejectRole |
QMessageBox.Retry | 使用AcceptRole |
QMessageBox.Ignore | 一個用AcceptRole |
QMessageBox.NoButton | 無效的按鈕 |
- AcceptRole表示點擊按鈕可以接受對話框
- RejectRole表示單擊該按鈕將導致對話框被拒絕
- DestructiveRole表示單擊該按鈕將導致破壞性更改(例如“丟棄更改”)並關閉對話框
- 錯誤彈窗
- 使用 QMessageBox.critical() 方法
QMessageBox.critical(window, # 父窗口QWidget
'錯誤', # 窗口標題
"這是一個錯誤彈窗", # 窗口提示信息
QMessageBox.Cancel | QMessageBox.Close,
# 窗口內添加按鈕-QMessageBox.StandardButton,可重復添加使用 | 隔開;如果不寫,會有個默認的QMessageBox.StandardButton
QMessageBox.Cancel, # 設置默認按鈕(前提是已經設置有的按鈕,若是沒有設置,則無效)
)
- 小案例
from PyQt5.Qt import *
from PyQt5.QtWidgets import QMessageBox
app = QApplication([])
window = QWidget()
window.resize(300, 200)
window.move(300, 300)
def critical():
api = QMessageBox.critical(window, # 父窗口QWidget
'錯誤', # 窗口標題
"這是一個錯誤彈窗", # 窗口提示信息
QMessageBox.Cancel | QMessageBox.Close,
# 窗口內添加按鈕-QMessageBox.StandardButton,可重復添加使用 | 隔開;如果不寫,會有個默認的QMessageBox.StandardButton
QMessageBox.Cancel, # 設置默認按鈕(前提是已經設置有的按鈕,若是沒有設置,則無效)
)
if api == QMessageBox.Cancel:
label.setText("您選擇了Cancel")
elif api == QMessageBox.Close:
label.setText("您選擇了Close")
btn = QPushButton(window)
btn.setText('錯誤')
btn.move(20, 80)
btn.clicked.connect(critical)
label = QLabel(window)
label.resize(120, 30)
label.move(20, 30)
window.show()
app.exec_()
- 警告彈窗
- 使用 QMessageBox.warning() 方法
warning = QMessageBox() # 創建QMessageBox()對象
warning.setIcon(QMessageBox.Warning) # 設置彈窗的QMessageBox.Icon類型
warning.setWindowTitle('警告') # 設置彈窗標題
warning.setText("這是一個警告彈窗") # 設置彈窗提示信息
warning.setStandardButtons(QMessageBox.Ok | QMessageBox.Close) # 設置彈窗的按鈕;可以添加多個,使用 | 隔開
off = warning.addButton('取消', QMessageBox.RejectRole) # 使用 addButton() 方法添加自定義按鈕
api = warning.exec_() # 指定退出鍵;返回選中按鈕的值
- 小案例
from PyQt5.Qt import *
from PyQt5.QtWidgets import QMessageBox
app = QApplication([])
window = QWidget()
window.resize(300, 200)
window.move(300, 300)
def warning():
warning = QMessageBox() # 創建QMessageBox()對象
warning.setIcon(QMessageBox.Warning) # 設置彈窗的QMessageBox.Icon類型
warning.setWindowTitle('警告') # 設置彈窗標題
warning.setText("這是一個警告彈窗") # 設置彈窗提示信息
ok = warning.addButton('確認', QMessageBox.AcceptRole) # 使用 addButton() 方法添加自定義按鈕
quit = warning.addButton('退出', QMessageBox.RejectRole)
warning.setDefaultButton(quit) # 設置默認按鈕
api = warning.exec_() # 指定退出鍵;返回選中按鈕的值
if api == QMessageBox.AcceptRole:
label.setText("您選中了確認")
elif api == QMessageBox.RejectRole:
label.setText("您選中了退出")
btn = QPushButton(window)
btn.setText('警告')
btn.move(20, 80)
btn.clicked.connect(warning)
label = QLabel(window)
label.resize(120, 30)
label.move(20, 30)
window.show()
app.exec_()
- 詢問彈窗
- 使用 QMessageBox.question 方法
QMessageBox.question(window,
'確認',
'這是一個詢問彈窗',
)
- 小案例
from PyQt5.Qt import *
from PyQt5.QtWidgets import QMessageBox
app = QApplication([])
window = QWidget()
window.resize(300, 200)
window.move(300, 300)
def question():
question = QMessageBox.question(window,
'確認',
'這是一個詢問彈窗',
)
if question == QMessageBox.Yes:
label.setText("您選擇了Yes")
else:
label.setText("您選擇了No")
btn = QPushButton(window)
btn.setText('錯誤')
btn.move(20, 80)
btn.clicked.connect(question)
label = QLabel(window)
label.resize(120, 30)
label.move(20, 30)
window.show()
app.exec_()
- 信息提示框
- 使用 QMessageBox.information 方法
info = QMessageBox()
info.setIcon(QMessageBox.Information)
info.setWindowTitle('信息')
info.setText("這一個信息提示彈窗")
info.addButton("確認", QMessageBox.AcceptRole)
info.addButton("取消", QMessageBox.RejectRole)
info.addButton("忽略", QMessageBox.DestructiveRole)
api = info.exec_()
- 使用 QMessageBox.about 方法
QMessageBox.about(window,
'關於',
"這是關於信息彈窗",
)
- 小案例
from PyQt5.Qt import *
from PyQt5.QtWidgets import QMessageBox
app = QApplication([])
window = QWidget()
window.resize(300, 200)
window.move(300, 300)
def information():
info = QMessageBox()
info.setIcon(QMessageBox.Information)
info.setWindowTitle('信息')
info.setText("這一個信息提示彈窗")
info.addButton("確認", QMessageBox.AcceptRole)
info.addButton("取消", QMessageBox.RejectRole)
info.addButton("忽略", QMessageBox.DestructiveRole)
api = info.exec_()
if api == QMessageBox.AcceptRole:
label.setText("您選擇了確認")
elif api == QMessageBox.RejectRole:
label.setText("您選擇了取消")
else:
label.setText("您選擇了忽略")
def about():
QMessageBox.about(window,
'關於',
"這是關於信息彈窗",
)
btn = QPushButton(window)
btn.setText('提示信息')
btn.move(20, 80)
btn.clicked.connect(information)
btn1 = QPushButton(window)
btn1.setText("關於")
btn1.move(150, 80)
btn1.clicked.connect(about)
label = QLabel(window)
label.resize(120, 30)
label.move(20, 30)
window.show()
app.exec_()