1. 程式人生 > >PyQt中的各種提示框

PyQt中的各種提示框

在實際的程式開發中,經常會用到各種各樣的訊息框來給使用者一些提示或提醒,Qt提供了QMessageBox類來實現此項功能。在本例項中,分析了各種訊息框的使用方式及之間的區別。各種訊息框的使用如圖所示:

實現程式碼如下:

  1. # -*- coding: utf-8 -*-   
  2. from PyQt4.QtGui import *  
  3. from PyQt4.QtCore import *  
  4. import sys  
  5. QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))  
  6. class MessageBoxDlg(QDialog):  
  7.     def
     __init__(self,parent=None):  
  8.         super(MessageBoxDlg,self).__init__(parent)  
  9.         self.setWindowTitle("Messagebox")  
  10.         self.label=QLabel("About Qt MessageBox")  
  11.         questionButton=QPushButton("Question")  
  12.         informationButton=QPushButton("Information")  
  13.         warningButton=QPushButton("Warning"
    )  
  14.         criticalButton=QPushButton("Critical")  
  15.         aboutButton=QPushButton("About")  
  16.         aboutqtButton=QPushButton("About Qt")  
  17.         customButton=QPushButton("Custom")  
  18.         gridLayout=QGridLayout(self)  
  19.         gridLayout.addWidget(self.label,0,0,1,2)  
  20.         gridLayout.addWidget(questionButton,1
    ,0)  
  21.         gridLayout.addWidget(informationButton,1,1)  
  22.         gridLayout.addWidget(warningButton,2,0)  
  23.         gridLayout.addWidget(criticalButton,2,1)  
  24.         gridLayout.addWidget(aboutButton,3,0)  
  25.         gridLayout.addWidget(aboutqtButton,3,1)  
  26.         gridLayout.addWidget(customButton,4,0)  
  27.         self.connect(questionButton,SIGNAL("clicked()"),self.slotQuestion)  
  28.         self.connect(informationButton,SIGNAL("clicked()"),self.slotInformation)  
  29.         self.connect(warningButton,SIGNAL("clicked()"),self.slotWarning)  
  30.         self.connect(criticalButton,SIGNAL("clicked()"),self.slotCritical)  
  31.         self.connect(aboutButton,SIGNAL("clicked()"),self.slotAbout)  
  32.         self.connect(aboutqtButton,SIGNAL("clicked()"),self.slotAboutQt)  
  33.         self.connect(customButton,SIGNAL("clicked()"),self.slotCustom)  
  34.     def slotQuestion(self):  
  35.         button=QMessageBox.question(self,"Question",  
  36.                                     self.tr("已到達文件結尾,是否從頭查詢?"),  
  37.                                     QMessageBox.Ok|QMessageBox.Cancel,  
  38.                                     QMessageBox.Ok)  
  39.         if button==QMessageBox.Ok:  
  40.             self.label.setText("Question button/Ok")  
  41.         elif button==QMessageBox.Cancel:  
  42.             self.label.setText("Question button/Cancel")  
  43.         else:  
  44.             return  
  45.     def slotInformation(self):  
  46.         QMessageBox.information(self,"Information",  
  47.                                 self.tr("填寫任意想告訴於使用者的資訊!"))  
  48.         self.label.setText("Information MessageBox")  
  49.     def slotWarning(self):  
  50.         button=QMessageBox.warning(self,"Warning",  
  51.                                    self.tr("是否儲存對文件的修改?"),  
  52.                                    QMessageBox.Save|QMessageBox.Discard|QMessageBox.Cancel,  
  53.                                    QMessageBox.Save)  
  54.         if button==QMessageBox.Save:  
  55.             self.label.setText("Warning button/Save")  
  56.         elif button==QMessageBox.Discard:  
  57.             self.label.setText("Warning button/Discard")  
  58.         elif button==QMessageBox.Cancel:  
  59.             self.label.setText("Warning button/Cancel")  
  60.         else:  
  61.             return  
  62.     def slotCritical(self):  
  63.         QMessageBox.critical(self,"Critical",  
  64.                              self.tr("提醒使用者一個致命的錯誤!"))  
  65.         self.label.setText("Critical MessageBox")  
  66.     def slotAbout(self):  
  67.         QMessageBox.about(self,"About",self.tr("About事例"))  
  68.         self.label.setText("About MessageBox")  
  69.     def slotAboutQt(self):  
  70.         QMessageBox.aboutQt(self,"About Qt")  
  71.         self.label.setText("About Qt MessageBox")  
  72.     def slotCustom(self):  
  73.         customMsgBox=QMessageBox(self)  
  74.         customMsgBox.setWindowTitle("Custom message box")  
  75.         lockButton=customMsgBox.addButton(self.tr("鎖定"),  
  76.                                           QMessageBox.ActionRole)  
  77.         unlockButton=customMsgBox.addButton(self.tr("解鎖"),  
  78.                                             QMessageBox.ActionRole)  
  79.         cancelButton=customMsgBox.addButton("cancel",QMessageBox.ActionRole)  
  80.         customMsgBox.setText(self.tr("這是一個自定義訊息框!"))  
  81.         customMsgBox.exec_()  
  82.         button=customMsgBox.clickedButton()  
  83.         if button==lockButton:  
  84.             self.label.setText("Custom MessageBox/Lock")  
  85.         elif button==unlockButton:  
  86.             self.label.setText("Custom MessageBox/Unlock")  
  87.         elif button==cancelButton:  
  88.             self.label.setText("Custom MessageBox/Cancel")  
  89. app=QApplication(sys.argv)  
  90. MessageBox=MessageBoxDlg()  
  91. MessageBox.show()  
  92. 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提供的訊息框型別基本涵蓋了開發應用中使用的各種情況,並且提供了自定義訊息框的方式,滿足各種特殊的需求,在實際應用中關鍵是分析實際的應用需求,根據不同的應用環境選擇最合適的訊息框,以使程式簡潔而合理。