PyQt5系列教程(11):今天的消息挺全哦!

上期我們補充學習了QFileDialog以及列印文件相關的對話框。

這次我們再學習下消息對話框。

今天完成後的效果就是這樣的:

下面我們還是和以往一樣,按照代碼來進行講解。

#conding=utf-8nnfrom PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QMessageBox, QLabel, QCheckBoxnfrom PyQt5.QtGui import QPixmapnimport sysnclass Example(QWidget):n def __init__(self):n super().__init__()n self.initUI()nn def initUI(self):nn self.setGeometry(300, 300, 330, 300)n self.setWindowTitle(關注微信公眾號:學點編程吧--消息對話框)nn self.la = QLabel(這裡將會顯示我們選擇的按鈕信息,self)n self.la.move(20,20)n self.bt1 = QPushButton(提示,self)n self.bt1.move(20,70)n self.bt2 = QPushButton(詢問,self)n self.bt2.move(120,70)n self.bt3 = QPushButton(警告,self)n self.bt3.move(220,70)n self.bt4 = QPushButton(錯誤,self)n self.bt4.move(20,140)n self.bt5 = QPushButton(關於,self)n self.bt5.move(120,140)n self.bt6 = QPushButton(關於Qt,self)n self.bt6.move(220,140)nn self.bt1.clicked.connect(self.info)n self.bt2.clicked.connect(self.question)n self.bt3.clicked.connect(self.warning)n self.bt4.clicked.connect(self.critical)n self.bt5.clicked.connect(self.about)n self.bt6.clicked.connect(self.aboutqt)nn self.show()n n def info(self):n reply = QMessageBox.information(self,提示,這是一個消息提示對話框!, QMessageBox.Ok | QMessageBox.Close, QMessageBox.Close)n if reply == QMessageBox.Ok:n self.la.setText(你選擇了Ok!)n else:n self.la.setText(你選擇了Close!)n n def question(self):n reply = QMessageBox.question(self,詢問,這是一個詢問消息對話框,默認是No, QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel, QMessageBox.No)n if reply == QMessageBox.Yes:n self.la.setText(你選擇了Yes!)n elif reply == QMessageBox.No:n self.la.setText(你選擇了No!)n else:n self.la.setText(你選擇了Cancel!)n n def warning(self):n # reply = QMessageBox.warning(self,警告,這是一個警告消息對話框, QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel, QMessageBox.Save)n cb = QCheckBox(所有文檔都按此操作)n msgBox = QMessageBox()n msgBox.setWindowTitle(警告)n msgBox.setIcon(QMessageBox.Warning)n msgBox.setText(這是一個警告消息對話框)n msgBox.setInformativeText(出現更改願意保存嗎?)n Save = msgBox.addButton(保存, QMessageBox.AcceptRole)n NoSave = msgBox.addButton(取消, QMessageBox.RejectRole)n Cancel = msgBox.addButton(不保存, QMessageBox.DestructiveRole)n msgBox.setDefaultButton(Save)n msgBox.setCheckBox(cb)n cb.stateChanged.connect(self.check)n reply = msgBox.exec()n if reply == QMessageBox.AcceptRole:n self.la.setText(你選擇了保存!)n elif reply == QMessageBox.RejectRole:n self.la.setText(你選擇了取消!)n else:n self.la.setText(你選擇了不保存!)n n def critical(self):n # reply = QMessageBox.critical(self,錯誤,這是一個錯誤消息對話框, QMessageBox.Retry | QMessageBox.Abort | QMessageBox.Ignore , QMessageBox.Retry)n msgBox = QMessageBox()n msgBox.setWindowTitle(錯誤)n msgBox.setIcon(QMessageBox.Critical)n msgBox.setText("這是一個錯誤消息對話框")n msgBox.setStandardButtons(QMessageBox.Retry | QMessageBox.Abort | QMessageBox.Ignore)n msgBox.setDefaultButton(QMessageBox.Retry)n msgBox.setDetailedText(這是詳細的信息:學點編程吧,我愛你!)n reply = msgBox.exec() nn if reply == QMessageBox.Retry:n self.la.setText(你選擇了Retry!)n elif reply == QMessageBox.Abort:n self.la.setText(你選擇了Abort!)n else:n self.la.setText(你選擇了Ignore!)n n def about(self):n #QMessageBox.about(self,關於,這是一個關於消息對話框!)n msgBox = QMessageBox(QMessageBox.NoIcon, 關於,不要意淫了,早點洗洗睡吧!)n msgBox.setIconPixmap(QPixmap("beauty.png"))n msgBox.exec()n n def aboutqt(self):n QMessageBox.aboutQt(self,關於Qt)n n def check(self):n if self.sender().isChecked():n self.la.setText(你打勾了哦)n else:n self.la.setText(怎麼又不打了啊)n nif __name__ == __main__:n app = QApplication(sys.argv)n ex = Example()n sys.exit(app.exec_())n

消息對話框主要涉及QMessageBox類。QMessageBox類提供了一個模態對話框,用於通知用戶或詢問用戶問題並接收答案。

消息框顯示主要文本以提醒用戶情況,信息性文本以進一步解釋警報或詢問用戶一個問題,以及可選的詳細文本,以便在用戶請求時提供更多數據。 消息框還可以顯示用於接受用戶響應的圖標和標準按鈕。

提供了兩個使用QMessageBox的API,基於屬性的API和靜態函數。 調用靜態函數是更簡單的方法,但是比使用基於屬性的API更不靈活,結果信息較少。 兩種方法我們在程序中都使用了。

我們通過上面的動畫可以看到一般而言,消息對話框分為五種,分別是提示信息、詢問、警告、錯誤、關於,其中關於又分為兩種,一種是一般性關於、另一種是關於Qt的介紹,可以明顯看見不同。對於前四種,其分別對應的圖標如下:

我們從幾個槽函數來開始介紹五種消息對話框,至於界面定義、信號與槽函數調用屬於以前的知識點,這裡不再重複。

def info(self):n reply = QMessageBox.information(self,提示,這是一個消息提示對話框!,QMessageBox.Ok | QMessageBox.Close, QMessageBox.Close)n if reply == QMessageBox.Ok:n self.la.setText(你選擇了Ok!)n else:n self.la.setText(你選擇了Close!)n

這裡我們描述了一個信息提示的對話框。它的函數調用格式如下:

QMessageBox.information(QWidget, str, str, buttons: Union[QMessageBox.StandardButtons, QMessageBox.StandardButton] = QMessageBox.Ok, defaultButton: QMessageBox.StandardButton = MessageBox.NoButton)n

打開包含指定父窗口小部件並給定了標題和文本的信息消息對話框。這句話分別對應了第一、二、三個參數。

第四個參數則是我們要在消息對話框上想要顯示的按鈕。

第五個參數defaultButton指定按Enter鍵時使用的按鈕。如果defaultButton是QMessageBox.NoButton,QMessageBox會自動選擇合適的默認值。

當然還有更多的按鈕可以供我們選擇,如下圖:

這個函數中我們顯示的按鈕分別是Ok、Close,默認按鈕是Close。

注意看下圖中按鈕的焦點在哪。

if reply == QMessageBox.Ok:n self.la.setText(你選擇了Ok!)nelse:n self.la.setText(你選擇了Close!)n

標籤上的信息會根據我們選擇的按鈕信息相應的變化,判斷是選擇了OK還是Close。

def question(self):n reply = QMessageBox.question(self,詢問,這是一個詢問消息對話框,默認是No, QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel, QMessageBox.No)n if reply == QMessageBox.Yes:n self.la.setText(你選擇了Yes!)n elif reply == QMessageBox.No:n self.la.setText(你選擇了No!)n else:n self.la.setText(你選擇了Cancel!)n

這個函數與上一個函數的內容差不多,唯一不同的地方是,產生的消息對話框帶了一個「?」,這裡不做詳解了,如下圖:

上面兩種產生消息對話框的方式,就是調用靜態函數的方式了,下面我們則重點講解一下基於屬性的調用。

def warning(self):n # reply = QMessageBox.warning(self,警告,這是一個警告消息對話框, QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel, QMessageBox.Save)n cb = QCheckBox(所有文檔都按此操作)n msgBox = QMessageBox()n msgBox.setWindowTitle(警告)n msgBox.setIcon(QMessageBox.Warning)n msgBox.setText(這是一個警告消息對話框)n msgBox.setInformativeText(出現更改願意保存嗎?)n Save = msgBox.addButton(保存, QMessageBox.AcceptRole)n NoSave = msgBox.addButton(取消, QMessageBox.RejectRole)n Cancel = msgBox.addButton(不保存, QMessageBox.DestructiveRole)n msgBox.setDefaultButton(Save)n msgBox.setCheckBox(cb)n cb.stateChanged.connect(self.check)n reply = msgBox.exec()n if reply == QMessageBox.AcceptRole:n self.la.setText(你選擇了保存!)n elif reply == QMessageBox.RejectRole:n self.la.setText(你選擇了取消!)n else:n self.la.setText(你選擇了不保存!)n

這個函數我們分別使用了基於屬性和靜態函數的方式產生消息對話框,當然實際使用時需要注釋一種。區別還是有的,如下圖:

不知道大家注意到沒有,這次的按鈕裡面顯示的是中文哦!!!而之前一直都是英文啊(考驗大家英語的水平到了)。這就是基於屬性的產生消息對話框的好處,雖然繁瑣但是貴在牛逼啊!

cb = QCheckBox(所有文檔都按此操作)n

因為要在對話框中增加一個複選框,所以我新建了一個複選框對象,複選框的內容就是「所有文檔都按此操作」。

msgBox.setWindowTitle(警告)nmsgBox.setIcon(QMessageBox.Warning)nmsgBox.setText(這是一個警告消息對話框)nmsgBox.setInformativeText(出現更改願意保存嗎?)n

這四個語句分別有如下表示:

  1. 設置消息對話框的標題:警告。
  2. 設置消息對話框的圖標:QMessageBox.Warning,也就是警告圖標,當然也可以選擇QMessageBox.information、QMessageBox.question、QMessageBox.critical。
  3. 設置消息對話框的要顯示的消息框文本,如果文本格式設置(QMessageBox.textFormat),文本將被解釋為純文本或富文本。 默認設置為Qt.AutoText,即消息框將嘗試自動檢測文本的格式。
  4. 設置消息對話框更完整描述的信息性文本,可以使用Infromative文本來擴展text()以向用戶提供更多信息。 在Mac上,此文本以text()下方的小系統字體顯示。 在其他平台上,它只是附加到現有文本。

Save = msgBox.addButton(保存, QMessageBox.AcceptRole)nNoSave = msgBox.addButton(取消, QMessageBox.RejectRole)nCancel = msgBox.addButton(不保存, QMessageBox.DestructiveRole)nmsgBox.setDefaultButton(Save)n

這裡我實際上是新建了三個按鈕,當然是中文的,每個對應著一種事件的角色,是接受、拒絕還是放棄。最後我們設置了默認的按鈕是保存。你可以看見焦點是在這個按鈕上。如下圖:

msgBox.setCheckBox(cb)ncb.stateChanged.connect(self.check)n

我們需要在消息對話框上設置之前建立的那個複選框。當我們選擇這個複選框的時候產生了stateChanged信號,對應的將連接check()這個槽函數。

reply = msgBox.exec()n

這行這個語句讓消息對話框能夠顯示出來,並將我們選中的按鈕返回給reply這個變數。

if reply == QMessageBox.AcceptRole:n self.la.setText(你選擇了保存!)nelif reply == QMessageBox.RejectRole:n self.la.setText(你選擇了取消!)nelse:n self.la.setText(你選擇了不保存!)n

當我們選擇不同的按鈕時候,我們則在標籤上有不同的顯示。

例如:

  1. AcceptRole表示點擊按鈕可以接受對話框;
  2. RejectRole表示單擊該按鈕將導致對話框被拒絕;
  3. DestructiveRole表示單擊該按鈕將導致破壞性更改(例如「丟棄更改」)並關閉對話框。

這裡先把複選框用到的槽函數介紹一下:

def check(self):n if self.sender().isChecked():n self.la.setText(你打勾了哦) n else:n self.la.setText(怎麼又不打了啊)n

這個比較好理解,self.sender()就是傳遞信號過來的對象,這裡就是複選框;isChecked()返回的是一個布爾值,也就是判斷是否被選中,選中了就顯示打勾,否則就是不打勾。

def critical(self):n # reply = QMessageBox.critical(self,錯誤,這是一個錯誤消息對話框, QMessageBox.Retry | QMessageBox.Abort | QMessageBox.Ignore , QMessageBox.Retry)n msgBox = QMessageBox()n msgBox.setWindowTitle(錯誤)n msgBox.setIcon(QMessageBox.Critical)n msgBox.setText("這是一個錯誤消息對話框")n msgBox.setStandardButtons(QMessageBox.Retry | QMessageBox.Abort | QMessageBox.Ignore)n msgBox.setDefaultButton(QMessageBox.Retry)n msgBox.setDetailedText(這是詳細的信息:學點編程吧,我愛你!)n reply = msgBox.exec() nn if reply == QMessageBox.Retry:n self.la.setText(你選擇了Retry!) n elif reply == QMessageBox.Abort:n self.la.setText(你選擇了Abort!)n else:n self.la.setText(你選擇了Ignore!)n

這個函數大部分的使用和上面的差不多,主要介紹幾點:

msgBox.setStandardButtons(QMessageBox.Retry | QMessageBox.Abort | QMessageBox.Ignore)n

表明消息對話框中使用哪些標準按鈕。

msgBox.setDetailedText(這是詳細的信息:學點編程吧,我愛你!)n

該屬性保存要在詳細信息區域中顯示的文本。文本將被解釋為純文本。默認情況下,此屬性包含一個空字元串。

只有設置了這個屬性,ShowDetails...這個按鈕才會出來哦!

如下圖:

def about(self):n #QMessageBox.about(self,關於,這是一個關於消息對話框!)n msgBox = QMessageBox(QMessageBox.NoIcon, 關於,不要意淫了,早點洗洗睡吧!)n msgBox.setIconPixmap(QPixmap("beauty.png"))n msgBox.exec()n

這裡我們同樣用了兩種方式建立關於消息對話框,重點說明第二種,即基於屬性的。我們同樣建立了QMessageBox對象,一開始的時候就將標題還有要顯示的內容帶入了,同時還表明這是一個沒有圖標的消息對話框。

然後我們這種對圖標進行了設計,使用setIconPixmap()函數,注意參數必須是QPixmap類型的。如下圖:

Tips:使用QPixmap前需要導入相應的類,這個類在介紹圖形的時候要重點介紹。

from PyQt5.QtGui import QPixmapn

def aboutqt(self):n QMessageBox.aboutQt(self,關於Qt)n

這裡我們將調用關於Qt的對話框,比較簡單,沒什麼好解釋的,如下圖:

最後我們來看下如何通過Eric6以及Qt設計師來完成本次的示常式序,由於圖文過於繁瑣,採用錄屏的方式。考慮到時間因素,只通過設置兩個按鈕來演示,其餘的請參考,節約大家時間。

qt設計師製作PyQt5消息對話框_騰訊視頻 https://v.qq.com/x/cover/o0556xzau5b/o0556xzau5b.html

總結:

本次我們學習了如何創建並使用消息對話框。

ok,今天就到這裡,我們下期再談談其他的對話框,本身對話框內容就比較多,會多分幾期講解。

如果你想要本次教程中的相關源碼(有美圖哦),請關注微信公眾號:學點編程吧,發送pyqt511,會自動得到相應的百度網盤下載鏈接。


推薦閱讀:

如何系統的自學Python?
給妹子講python--01好用的列表
Python入門 數據結構 dict字典
利用簡書首頁文章標題數據生成詞雲
學習筆記三:改善Python程序的91個建議

TAG:Python | Python教程 | PyQt |