PyQt中的各種提示框
在實際的程式開發中,經常會用到各種各樣的訊息框來給使用者一些提示或提醒,Qt提供了QMessageBox類來實現此項功能。在本例項中,分析了各種訊息框的使用方式及之間的區別。各種訊息框的使用如圖所示:
實現程式碼如下:
- # -*- coding: utf-8 -*-
- from PyQt4.QtGui import *
- from PyQt4.QtCore import *
- import sys
- QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
- class MessageBoxDlg(QDialog):
- def
- super(MessageBoxDlg,self).__init__(parent)
- self.setWindowTitle("Messagebox")
- self.label=QLabel("About Qt MessageBox")
- questionButton=QPushButton("Question")
- informationButton=QPushButton("Information")
- warningButton=QPushButton("Warning"
- criticalButton=QPushButton("Critical")
- aboutButton=QPushButton("About")
- aboutqtButton=QPushButton("About Qt")
- customButton=QPushButton("Custom")
- gridLayout=QGridLayout(self)
- gridLayout.addWidget(self.label,0,0,1,2)
- gridLayout.addWidget(questionButton,1
- gridLayout.addWidget(informationButton,1,1)
- gridLayout.addWidget(warningButton,2,0)
- gridLayout.addWidget(criticalButton,2,1)
- gridLayout.addWidget(aboutButton,3,0)
- gridLayout.addWidget(aboutqtButton,3,1)
- gridLayout.addWidget(customButton,4,0)
- self.connect(questionButton,SIGNAL("clicked()"),self.slotQuestion)
- self.connect(informationButton,SIGNAL("clicked()"),self.slotInformation)
- self.connect(warningButton,SIGNAL("clicked()"),self.slotWarning)
- self.connect(criticalButton,SIGNAL("clicked()"),self.slotCritical)
- self.connect(aboutButton,SIGNAL("clicked()"),self.slotAbout)
- self.connect(aboutqtButton,SIGNAL("clicked()"),self.slotAboutQt)
- self.connect(customButton,SIGNAL("clicked()"),self.slotCustom)
- def slotQuestion(self):
- button=QMessageBox.question(self,"Question",
- self.tr("已到達文件結尾,是否從頭查詢?"),
- QMessageBox.Ok|QMessageBox.Cancel,
- QMessageBox.Ok)
- if button==QMessageBox.Ok:
- self.label.setText("Question button/Ok")
- elif button==QMessageBox.Cancel:
- self.label.setText("Question button/Cancel")
- else:
- return
- def slotInformation(self):
- QMessageBox.information(self,"Information",
- self.tr("填寫任意想告訴於使用者的資訊!"))
- self.label.setText("Information MessageBox")
- def slotWarning(self):
- button=QMessageBox.warning(self,"Warning",
- self.tr("是否儲存對文件的修改?"),
- QMessageBox.Save|QMessageBox.Discard|QMessageBox.Cancel,
- QMessageBox.Save)
- if button==QMessageBox.Save:
- self.label.setText("Warning button/Save")
- elif button==QMessageBox.Discard:
- self.label.setText("Warning button/Discard")
- elif button==QMessageBox.Cancel:
- self.label.setText("Warning button/Cancel")
- else:
- return
- def slotCritical(self):
- QMessageBox.critical(self,"Critical",
- self.tr("提醒使用者一個致命的錯誤!"))
- self.label.setText("Critical MessageBox")
- def slotAbout(self):
- QMessageBox.about(self,"About",self.tr("About事例"))
- self.label.setText("About MessageBox")
- def slotAboutQt(self):
- QMessageBox.aboutQt(self,"About Qt")
- self.label.setText("About Qt MessageBox")
- def slotCustom(self):
- customMsgBox=QMessageBox(self)
- customMsgBox.setWindowTitle("Custom message box")
- lockButton=customMsgBox.addButton(self.tr("鎖定"),
- QMessageBox.ActionRole)
- unlockButton=customMsgBox.addButton(self.tr("解鎖"),
- QMessageBox.ActionRole)
- cancelButton=customMsgBox.addButton("cancel",QMessageBox.ActionRole)
- customMsgBox.setText(self.tr("這是一個自定義訊息框!"))
- customMsgBox.exec_()
- button=customMsgBox.clickedButton()
- if button==lockButton:
- self.label.setText("Custom MessageBox/Lock")
- elif button==unlockButton:
- self.label.setText("Custom MessageBox/Unlock")
- elif button==cancelButton:
- self.label.setText("Custom MessageBox/Cancel")
- app=QApplication(sys.argv)
- MessageBox=MessageBoxDlg()
- MessageBox.show()
- app.exec_()
本例項主要分析7種類型的訊息框,包括Question訊息框,Information訊息框,Warning訊息框,Critical訊息框,About訊息框,AboutQt訊息框以及Custom自定義訊息框。
Question訊息框,Information訊息框,Warning訊息框和Critical訊息框的用法大同小異,這些訊息框一般都包含一條提示資訊,一個圖示以及若干個按鈕,它們的作用都是給使用者提供一些提醒或一些簡單的詢問。按圖示的不同可區分為以下4個級另
Question:為正常的操作提供一個簡單的詢問。
Information:為正常的操作提供一個提示。
Warning:提醒使用者發生了一個錯誤。
Critical:警告使用者發生了一個嚴重錯誤。
下面分別對各種訊息框的使用方法進行分析。
下圖為Question訊息框。
關於Question訊息框,呼叫時直接使用QMessageBox.question()即可。
第一個引數為訊息框的父視窗指標。
第二個引數為訊息框的標題欄。
第三個引數為訊息框的文字提示資訊,前3個引數對於其他幾種訊息框基本是一樣的。
後面兩個引數都是對訊息框按鈕的設定,QMessageBox類提供了許多標準按鈕,如QMessageBox.Ok,QMessageBox.Close,QMessageBox.Discard等,具體可查問Qt幫助。
第四個引數即填寫希望在訊息框中出現的按鈕,可根據需要在標準按鈕中選擇,用“|”連寫,預設為QMessageBox.Ok。
第五個引數為預設按鈕,即訊息框出現時,焦點預設處於哪個按鈕上。
函式的返回值為按下的按鈕,當用戶按下Escape鍵時,相當於返回QMessageBox.Cancel。
如下圖所示為Information訊息框。
Information訊息框使用頻率最高也最簡單,直接呼叫QMessageBox.information()即可。
第一個引數為訊息框的父視窗指標。
第二個引數為訊息框的標題欄。
第三個引數為訊息框的文字提示資訊。
後面的兩個引數與Qustion訊息框的用法一樣,但在使用的過程中,經常會省略後兩個引數,直接使用預設的QMessageBox.Ok按鈕。
Information訊息框和Question訊息框可以通用,使用權Question訊息框的地方都可以使用Information訊息框替換。
如下圖所示為Warning訊息框。
Warning訊息框的最常用法為當用戶進行了一個非正常操作時,提醒使用者並詢問是否進行某項操作,如關閉文件,提醒並詢問使用者是否儲存對文件的修改。例項中實現的即是此操作。
函式呼叫的方式與前面Question訊息框的呼叫方式大致相同。
第一個引數為訊息框的父視窗指標。
第二個引數為訊息框的標題欄。
第三個引數為訊息框的文字提示資訊,
第四個引數為希望在訊息框中出現的按鈕,可根據需要在標準按鈕中選擇,用“|”連寫,預設為QMessageBox.Ok。
第五個引數為預設按鈕,即訊息框出現時,焦點預設處於哪個按鈕上。
如下圖所示為Critical訊息框。
Critical訊息框是在系統出現嚴重錯誤時對使用者進行提醒的。它的用法也相對簡單,通常情況下和Information訊息框一樣,在呼叫時只填寫前3個引數即可。
如下圖所示為About訊息框。
About訊息框一般用於提供系統的版本等資訊。只需提供資訊而並不需要使用者反饋資訊,因此它的用法相對簡單,直接呼叫QMessageBox.about(),並只用指定訊息框父視窗,標題欄以及資訊的內容即可。
在介紹完以上幾種基本訊息框的用法後,還有兩種特殊的訊息框型別,分別是“About Qt訊息框”以及自定義訊息框。
如下圖所示為About Qt訊息框。
“AboutQt訊息框”是Qt預定好的一種訊息框,用於提供Qt的相關資訊,只需直接呼叫QMessageBox.aboutQt(),並提定父視窗和標題欄即可,其中顯示的內容是Qt預定義好的。
最後,當以上所有的訊息框都不能滿足開發的需求時,Qt還允許Custom自定義訊息框。包括訊息框的圖示,按鈕,內容等都可根據需要進行設定。本例項中即實現了一個如下圖所示的自定義訊息框。
在slotCustom()函式中,第84行首先建立一個QMessageBox物件customMsgBox。第85行設定此訊息框的標題欄為Custommessage box。
第86-90行定義訊息框所需的按鈕,因此QMessageBox類提供了一個addButton()函式來為訊息框增加自定義按鈕,addButton()函式的第一個引數為按鈕顯示的文字,第二個引數為按鈕型別的描述,具體可查閱QMessageBox.ButtonRole,當然也可使用addButton()函式來加入一個標準按鈕。如第90行在訊息框中加入了一個QMessageBox.Cancel按鈕。訊息框將會按呼叫addButton()的先後次序在訊息框中由左至右依次插入按鈕。
第92行呼叫setText設定自定義訊息框中顯示的提示資訊內容。
第93行呼叫exec()顯示此自定義訊息框。
後面幾行程式碼完成的都是例項中一些顯示的功能,此處不再討論。
通過本例項的分析可見,Qt提供的訊息框型別基本涵蓋了開發應用中使用的各種情況,並且提供了自定義訊息框的方式,滿足各種特殊的需求,在實際應用中關鍵是分析實際的應用需求,根據不同的應用環境選擇最合適的訊息框,以使程式簡潔而合理。