川小胖学python

博客园 首页 新随笔 联系 订阅 管理

目录:

 一、对话框综合示例

二、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_())
对话框示例

效果图如下:

窗体上共有5个控件:4个按键,1个文本框。

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

(1) “输入”按键连接了inputDialog方法,当用户点击该按键时,会弹出输入文本框。输入文本框可以限制用户输入的内容。例如限制输入字符串,限制用户输入证书,或者限制用户只能从有限内容中选择。当前示例中用户输入的是字符串。其他几种类型后续会详细介绍。当然,用户也可以不通过该输入框直接在文本框内输入内容,这里只是为了做展示,所以“多此一举”。效果如如下:

(2)当用户点击“字体”按键时,可以从字体对话框中选择字体大小,样式和格式。效果图如下:

(3)当用户点击“颜色”对话框时,会弹出颜色对话框,该对话框有以下几种功能:

  1. 从基础颜色中选择需要的颜色;
  2. 从色谱图中选择所需颜色;
  3. 将喜欢的颜色添加到常用颜色中;
  4. 使用取色器在屏幕上取色;
  5. 微调三原色数值。

效果图及对应功能如下:

(4)当用户点击“文件”按键时,会弹出文件对话框。这里可以设置文件对话框弹出式父组件、标题、默认打开目录以及文件扩展名过滤器,后面会详细介绍。在当前示例中,只能打开单个文件,且只允许用户打开txt文件,并将文件内容写到文本框中。效果图如下:

(5)当用户退出主窗口时,会弹出消息框,不再详述,效果图如下:

二、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示例

效果图如下:

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 0 正常显示输入的字符,默认选项。
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示例

效果图如下:

该窗体上共有四个按键,对应四种类型的消息对话框。

 其中,问答对话框,警告对话框,严重错误对话框的方法相同,以问答对话框为例,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示例

效果图如下:

 

 


 

posted on 2019-03-16 22:10  川小胖学Python  阅读(4386)  评论(0编辑  收藏  举报