天天看點

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

目錄:

 一、對話框綜合示例

二、QDialog

三、QInputDialog

四、QMessageDialog

五、QFileDialog

pyqt5的對話框有多種類型,比如輸入對話框(QInputDialog)、顔色對話框(QColorDialog)、字型對話框(QFontDialog)、消息對話框(QMessageBox)、檔案對話框(QFileDialog)等,他們都是Dialog的子類。

對話框的使用可以提高人機互動,友善使用者輸入資料,修改參數,改變設定,選擇檔案等。

一、對話框綜合示例

 下面,我們通過一個小例子初步了解各類對話框。首先需要說明下,所有的對話框預設為模态視窗,即使用者必須處理完目前對話框之後,才可以與父視窗互動。

1 import sys,os
 2 from PyQt5.QtGui import QIcon
 3 from PyQt5.QtWidgets import (QWidget,QHBoxLayout,QPushButton,QTextEdit,QFontDialog, QApplication,
 4                              QColorDialog,QInputDialog,QVBoxLayout,QFileDialog,QMessageBox)
 5 
 6 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
 7 
 8 class MyWindow(QWidget):
 9     def __init__(self):
10         super(MyWindow, self).__init__()
11         self.initUI()
12 
13     def initUI(self):
14         self.setWindowTitle('對話框示例')
15         self.setWindowIcon(QIcon(r'%s\4.圖示素材\chuan.ico' % path))
16         self.setGeometry(600,300,500,400)
17 
18         '''建立三個按鍵,一個多行文本框'''
19         btn_input = QPushButton('輸入')
20         btn_font = QPushButton('字型')
21         btn_color = QPushButton('顔色')
22         btn_file = QPushButton('檔案')
23         self.text = QTextEdit()
24 
25         '''将三個按鍵布置在用一個水準布局容器中,然後将水準布局視為一個整體,與文本框布置在垂直布局中'''
26         hbx = QHBoxLayout()
27         hbx.addWidget(btn_input)
28         hbx.addWidget(btn_font)
29         hbx.addWidget(btn_color)
30         hbx.addWidget(btn_file)
31 
32         vbx = QVBoxLayout()
33         vbx.addLayout(hbx)
34         vbx.addWidget(self.text)
35 
36         self.setLayout(vbx)
37 
38         btn_input.clicked.connect(self.inputDialog)
39         btn_font.clicked.connect(self.fontDialog)
40         btn_color.clicked.connect(self.colorDialog)
41         btn_file.clicked.connect(self.fileDialog)
42 
43     def inputDialog(self):
44         text,ok = QInputDialog.getText(self,'輸入文本框','請輸入您的文本内容')
45         #傳回值是一個包含兩個元素的元組
46         if ok:
47             self.text.setText(text)
48 
49     def fontDialog(self):
50         font, ok = QFontDialog.getFont() #傳回值是一個包含兩個元素的元組
51         if ok:
52             self.text.setFont(font)
53 
54     def colorDialog(self):
55         color = QColorDialog.getColor()
56         if color.isValid: #通過isValid()可以判斷使用者選擇的顔色是否有效,若使用者選擇取消,isValid()将傳回false
57             self.text.setTextColor(color)
58 
59     def fileDialog(self):
60         '''打開單個檔案'''
61         fname, _ = QFileDialog.getOpenFileName(self, '打開', '/home','Text Files (*.txt)')
62         # 傳回值是包含2個元素的元組,但這裡隻需要第一個;這裡還加了一個過濾器,隻打開txt檔案
63         if fname:
64             f = open(fname, 'r')
65             with f:
66                 data = f.read()
67                 self.text.setText(data)
68 
69     def closeEvent(self, QCloseEvent):
70         reply = QMessageBox.question(self,'消息框','您确認退出嗎',QMessageBox.Yes|QMessageBox.No,QMessageBox.No)
71         if reply:
72             QCloseEvent.accept()
73         else:
74             QCloseEvent.ignore()
75 
76 
77 if __name__ == '__main__':
78     app = QApplication(sys.argv)
79     win = MyWindow()
80     win.show()
81     sys.exit(app.exec_())      

對話框示例

效果圖如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

窗體上共有5個控件:4個按鍵,1個文本框。

def inputDialog(self):
        text,ok = QInputDialog.getText(self,'輸入文本框','請輸入您的文本内容')
        if ok:
            self.text.setText(text)
           

(1) “輸入”按鍵連接配接了inputDialog方法,當使用者點選該按鍵時,會彈出輸入文本框。輸入文本框可以限制使用者輸入的内容。例如限制輸入字元串,限制使用者輸入證書,或者限制使用者隻能從有限内容中選擇。目前示例中使用者輸入的是字元串。其他幾種類型後續會詳細介紹。當然,使用者也可以不通過該輸入框直接在文本框内輸入内容,這裡隻是為了做展示,是以“多此一舉”。效果如如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

(2)當使用者點選“字型”按鍵時,可以從字型對話框中選擇字型大小,樣式和格式。效果圖如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

(3)當使用者點選“顔色”對話框時,會彈出顔色對話框,該對話框有以下幾種功能:

  1. 從基礎顔色中選擇需要的顔色;
  2. 從色譜圖中選擇所需顔色;
  3. 将喜歡的顔色添加到常用顔色中;
  4. 使用取色器在螢幕上取色;
  5. 微調三原色數值。

效果圖及對應功能如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

(4)當使用者點選“檔案”按鍵時,會彈出檔案對話框。這裡可以設定檔案對話框彈出式父元件、标題、預設打開目錄以及檔案擴充名過濾器,後面會詳細介紹。在目前示例中,隻能打開單個檔案,且隻允許使用者打開txt檔案,并将檔案内容寫到文本框中。效果圖如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

(5)當使用者退出主視窗時,會彈出消息框,不再詳述,效果圖如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

二、QDialog

所有對話框窗體的标題欄上沒有最小化和最大化控件,且預設為模态視窗。如果需要修改該屬性,可調用setWindowModality()方法,取值如下:

  • Qt.NonModal。非模态,在未關閉對話框時,可以和程式的其他視窗進行互動;
  • Qt.WindowModal。模态視窗。使用者必須處理完目前對話框,才可以和父視窗互動;
  • Qt.ApplicationModal。應用程式級模态,即使用者在未處理完目前對話框時,不能和任何其他視窗進行互動。

用法如下

Dialog.setWindowModality(Qt.WindowModal)
           

三、QInputDialog

QInputDialog 控件是一個标準對話框,由一個輸入文本框和兩個按鈕組成。可以從該對話框中獲得字元串、數字和清單選項。常用方法如下:

  • getItem()。限制選擇清單中已有選項
  • getDouble()。限制浮點數輸入
  • getInt()。限制整數輸入
  • getText()。獲得字元串
1 import sys,os
 2 from PyQt5.QtWidgets import QWidget,QApplication,QInputDialog,QPushButton,QLineEdit,QHBoxLayout,QVBoxLayout
 3 from PyQt5.QtGui import QIcon
 4 
 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
 6 
 7 class MyWindow(QWidget):
 8     def __init__(self):
 9         super(MyWindow, self).__init__()
10         self.initUI()
11 
12     def initUI(self):
13         self.setWindowTitle('QInputDialog示例')
14         self.setWindowIcon(QIcon(r'%s\4.圖示素材\chuan.ico' % path))
15         self.setGeometry(600,300,350,200)
16 
17         btn_str = QPushButton('獲得字元串')
18         btn_int = QPushButton('獲得整數')
19         btn_item = QPushButton('獲得清單選項')
20         self.lineEdit_str = QLineEdit()
21         self.lineEdit_int = QLineEdit()
22         self.lineEdit_item = QLineEdit()
23 
24         vbx1 = QVBoxLayout()
25         vbx1.addWidget(btn_int)
26         vbx1.addWidget(btn_item)
27         vbx1.addWidget(btn_str)
28 
29         vbx2 = QVBoxLayout()
30         vbx2.addWidget(self.lineEdit_int)
31         vbx2.addWidget(self.lineEdit_item)
32         vbx2.addWidget(self.lineEdit_str)
33 
34         hbx = QHBoxLayout()
35         hbx.addLayout(vbx1)
36         hbx.addLayout(vbx2)
37         self.setLayout(hbx)
38 
39         btn_item.clicked.connect(self.getItem)
40         btn_int.clicked.connect(self.getInt)
41         btn_str.clicked.connect(self.getStr)
42 
43     def getItem(self):
44         items = ['裝載機','平地機','推土機','挖掘機','自卸車'] #這裡設定成清單或元組都可以
45         item, ok = QInputDialog.getItem(self,'選擇項目','請選擇您的需求',items,0,False)
46         if ok and item:
47             self.lineEdit_item.setText(item)
48 
49     def getInt(self):
50         # num,ok = QInputDialog.getDouble(self,'雙精度','輸入您得數字')
51         num, ok = QInputDialog.getInt(self,'擷取整數','輸入您的數字(-10~10)',0,-10,10,1)
52         if ok:
53             self.lineEdit_int.setText(str(num))
54 
55     def getStr(self):
56         str, ok = QInputDialog.getText(self,'擷取字元串','請輸入您的文本',QLineEdit.Normal,'字元串',)
57         if ok:
58             self.lineEdit_str.setText(str)
59 
60 
61 if __name__ == '__main__':
62     app = QApplication(sys.argv)
63     win = MyWindow()
64     win.show()
65     sys.exit(app.exec_())      

QInputDialog示例

效果圖如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

3.1 getItem()

def getItem(self):
    items = ['裝載機','平地機','推土機','挖掘機','自卸車'] 
    item, ok = QInputDialog.getItem(self,'選擇項目','請選擇您的需求',items,0,False)
    if ok and item:
        self.lineEdit_item.setText(item)      

該方法限制使用者隻能在給定的有限内容中做選擇。“有限的内容”即示例中的items,這裡設定成清單或者元組都是可以的。其次,geiItem方法參數較多,下面進行講解:

QInputDialog.getItem(QWidget, str, str, list-of-str, int current=0, bool editable=True)

參數依次為:父元件;對話框标題;對話框提示資訊;清單對象;預設顯示值在清單中的索引值;控件中顯示的文字是否可編輯(True:可編輯;False:不可編輯)

3.2 getInt()和getDouble()

def getInt(self):
    # num,ok = QInputDialog.getDouble(self,'雙精度','輸入您得數字')
    num, ok = QInputDialog.getInt(self,'擷取整數','輸入您的數字(-10~10)',0,-10,10,1)
    if ok:
        self.lineEdit_int.setText(str(num))      

getInt()和getDouble()使用方法是完全相同的。注意最後将輸入值傳給父元件時一定要把資料變為字元串。同樣的,該方法參數衆多,下面進行介紹:

QInputDialog.getInt(QWidget, str, str, int value=0, int min=-2147483647, int max=2147483647, int step=1)

  1. 第一個參數為父元件;
  2. 第二個參數為對話框标題;
  3. 第三個參數為對話框提示資訊;
  4. 第四個參數為預設值;
  5. 第五個參數為允許輸入的最小值;
  6. 第六個參數為允許輸入的最大值;
  7. 第七個參數為步長

3.3 getText()

def getStr(self):
    str, ok = QInputDialog.getText(self,'擷取字元串','請輸入您的文本',QLineEdit.Normal,'字元串',)
    if ok:
        self.lineEdit_str.setText(str)      

QInputDialog.getText(QWidget, str, str, QLineEdit.EchoMode echo=QLineEdit.Normal, str text=QString())

幾個參數依次是:父元件;對話框标題;對話框提示資訊;對話框中QLineEdit控件的輸入模式;預設值。其中,對話框中QLineEdit控件的輸入模式有4種,詳情如下表:

常量 内容
QLineEdit.Normal 正常顯示輸入的字元,預設選項。
QLineEdit.NoEcho 1 不顯示任何輸入,常用于密碼類型,其密碼長度都需要保密的時候。
QLineEdit.Password 2 顯示平台相關的密碼掩碼字元,而不是實際的字元輸入。
QLineEdit.PasswordEchoOnEdit 3 在編輯的時候顯示字元,負責顯示密碼類型。

四、QMessageDialog

1 import sys,os
 2 from PyQt5.QtWidgets import QWidget,QApplication,QMessageBox,QPushButton,QHBoxLayout,QVBoxLayout
 3 from PyQt5.QtGui import QIcon
 4 
 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
 6 
 7 class MyWindow(QWidget):
 8 
 9     def __init__(self):
10         super(MyWindow, self).__init__()
11         self.initUI()
12 
13     def initUI(self):
14         self.setWindowTitle('QMessageDialog示例')
15         self.setWindowIcon(QIcon(r'%s\4.圖示素材\chuan.ico' % path))
16         self.setGeometry(600,300,350,200)
17 
18         self.btn_question = QPushButton('問答對話框')
19         self.btn_warning = QPushButton('警告對話框')
20         self.btn_critical = QPushButton('嚴重錯誤對話框')
21         self.btn_about = QPushButton('關于對話框')
22 
23         vbx = QVBoxLayout()
24         vbx.addWidget(self.btn_about)
25         vbx.addWidget(self.btn_critical)
26         vbx.addWidget(self.btn_question)
27         vbx.addWidget(self.btn_warning)
28 
29         hbx = QHBoxLayout()
30         hbx.addStretch(1)
31         hbx.addLayout(vbx)
32         hbx.addStretch(1)
33         self.setLayout(hbx)
34 
35         self.btn_question.clicked.connect(self.showquestion)
36         self.btn_warning.clicked.connect(self.showwarning)
37         self.btn_critical.clicked.connect(self.showcritical)
38         self.btn_about.clicked.connect(self.showabout)
39 
40 
41     def showquestion(self):
42         QMessageBox.question(self,'問答對話框','這是一個問答對話框',QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)
43 
44     def showwarning(self):
45         QMessageBox.warning(self, '警告對話框', '這是一個警告對話框', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
46 
47     def showcritical(self):
48         QMessageBox.critical(self, '嚴重錯誤對話框', '這是一個嚴重錯誤對話框', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
49 
50     def showabout(self):
51         QMessageBox.about(self, '關于對話框', '這是一個關于對話框')
52 
53 
54 if __name__ == '__main__':
55     app = QApplication(sys.argv)
56     win = MyWindow()
57     win.show()
58     sys.exit(app.exec_())      

QMessageDialog示例

效果圖如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

該窗體上共有四個按鍵,對應四種類型的消息對話框。

 其中,問答對話框,警告對話框,嚴重錯誤對話框的方法相同,以問答對話框為例,QMessageDialog.question(父元件,’對話框标題‘,’對話框内容‘,按鍵一|按鍵二,預設按鍵)。關于對話框隻有一個按鍵ok,不需要使用者指定按鍵,是以隻需要給定前三項參數即可。在示例中,我們使用了Yes和No兩個按鍵,實際上pyqt中案件類型不止這兩種。

類型 作用
QMessage.Yes
QMessage.No
QMessage.Ok 确認
QMessage.Cancel 取消
QMessage.About 關于
QMessage.Retry 重試
QMessage.Ignore 忽略

 五、QFileDialog

QFileDialog是用于打開和儲存檔案的對話框,常用的方法如下:

方法 内容
getOpenFileName() 傳回所選檔案的名稱,并打開該檔案(單個檔案)
getOpenFileNames() 傳回所選檔案的名稱,并打開該檔案(多個檔案)
getSaveFileName() 以使用者選擇的名稱給檔案命名
setFileMode()

可以選擇檔案類型,枚舉常量是:

QFileDialog.AnyFile 任何檔案

QFileDialog.ExistingFile 已存在的檔案

QFileDialog.Directory 檔案目錄

QFileDialog.ExistingFiles 因存在的多個檔案

setFilter 設定過濾器,隻顯示過濾器允許的檔案類型

綜合示例中getOpenFileName()方法的各參數釋義如下:

getOpenFileName(父元件,标題,對話框打開時預設顯示的目錄,擴充名過濾器)。當擴充名過濾器需要顯示多種檔案類型時,各類型之間需要用兩個分号隔開。示例如下

1 import sys,os
 2 from PyQt5.QtWidgets import QWidget,QApplication,QFileDialog,QPushButton,QTextEdit,QVBoxLayout
 3 from PyQt5.QtGui import QIcon
 4 
 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
 6 
 7 class MyWindow(QWidget):
 8     def __init__(self):
 9         super(MyWindow, self).__init__()
10         self.initUI()
11 
12     def initUI(self):
13         self.setWindowTitle('QFileDialog示例')
14         self.setWindowIcon(QIcon(r'%s\4.圖示素材\chuan.ico' % path))
15         self.setGeometry(600,300,350,200)
16 
17         btn = QPushButton('打開檔案')
18         self.text = QTextEdit()
19 
20         vbx = QVBoxLayout()
21         vbx.addWidget(btn)
22         vbx.addWidget(self.text)
23         self.setLayout(vbx)
24 
25         btn.clicked.connect(self.openfile)
26 
27     def openfile(self):
28         fname, _ = QFileDialog.getOpenFileName(self,'打開檔案','C:\\','TXT Files(*.txt);;DOC Files(*.docx)')
29         if fname:
30             f = open(fname, 'r')
31             with f:
32                 data = f.read()
33                 self.text.setText(data)
34 
35 
36 if __name__ == '__main__':
37     app = QApplication(sys.argv)
38     win = MyWindow()
39     win.show()
40     sys.exit(app.exec_())      

QFileDialog示例

效果圖如下:

六、pyqt5對話框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog一、對話框綜合示例二、QDialog三、QInputDialog四、QMessageDialog 五、QFileDialog

轉載于:https://www.cnblogs.com/chuanxiaopang/p/10536171.html