在大部分的操作系统中,为了更好的实现人机交互,windows以及linux中均为提供一系列的对话框来完成特定场景下的功能,诸如字体大小选择,字体颜色选择等等。PyQt5中定义了一些列的标准对话框的类,让使用者能够方便和快捷的通过各个类完成字体大小、颜色,以及文件的选择。
PyQt5的场景的对话框有,QFileDialog,QColorDialog,QFontDialog,QErrorMessage,QInputDialog,QMessageBox,QPrintDialog,QProcessDialog等。
QFileDialog
class QFileDialog(QDialog)
| QFileDialog(QWidget, Qt.WindowFlags)
| QFileDialog(QWidget parent=None, str caption='', str directory='', str filter='')
QFileDialog继承自QDialog。QFileDialog是PyQt中用于文件打开和保存的标准对话框。
通过如下的示例进行说明:
#-*- coding:utf-8 -*-
'''
QFileDialog
'''
__author__ = 'Tony Zhu'
from PyQt5.QtWidgets import QApplication, QDialog,QWidget, QFileDialog, QPushButton, QLineEdit, QGridLayout
import sys
import os
class FileDialog(QDialog):
def __init__(self):
super(FileDialog,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QFileDialog")
self.setGeometry(400,400,300,260)
self.fileButton = QPushButton("文件对话框")
self.fileLineEdit = QLineEdit()
self.fileButton.clicked.connect(lambda:self.openFile(self.fileLineEdit.text()))
self.mainLayout = QGridLayout()
self.mainLayout.addWidget(self.fileButton,0,0)
self.mainLayout.addWidget(self.fileLineEdit,0,1)
self.setLayout(self.mainLayout)
def openFile(self,filePath):
if os.path.exists(filePath):
path = QFileDialog.getOpenFileName(self,"Open File Dialog",filePath,"Python files(*.py);;Text files(*.txt)")
else:
path = QFileDialog.getOpenFileName(self,"Open File Dialog","/","Python files(*.py);;Text files(*.txt)")
self.fileLineEdit.setText(str(path[0]))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = FileDialog()
ex.show()
sys.exit(app.exec_())
控件类型 | 控件名称 | 作用 |
---|---|---|
QPushButton | fileButton | 确认打开文件路径 |
QLineEdit | fileLineEdit | 显示打开的文件路径 |
QFileDialog | 文件操作对话框类 |
示例说明:
通过文件对话框来选择所需的文件(默认为当前路径,或者QLineEdit指定的路径),并且将打开的文件路径显示在QLineEdit中。
代码分析:
L21~23:
self.fileButton = QPushButton("文件对话框")
self.= QLineEdit() self.fileButton.clicked.connect(lambda:self.openFile(self.fileLineEdit.text()))
创建QPushButton和QLineEdit实例,并且绑定fileButton的clicked信号与自定义的槽函数openFile().
由于槽函数openFile()在调用的时候需要传入参数,因此使用lambda将传入参数的openFile()重新定义作为槽函数,即触发clicked事件的时候将调用openFile(self.fileLineEdit.text())) 这个槽函数。
L25~27:
self.mainLayout = QGridLayout()
self.mainLayout.addWidget(self.fileButton,0,0)
self.mainLayout.addWidget(self.fileLineEdit,0,1)
创建网格布局,将定义的fileButton 和fileLineEdit 添加到布局中
L31~37:
def openFile(self,filePath):
if os.path.exists(filePath):
path = QFileDialog.getOpenFileName(self,"Open File Dialog",filePath,"Python files(*.py);;Text files(*.txt)")
else:
path = QFileDialog.getOpenFileName(self,"Open File Dialog","/","Python files(*.py);;Text files(*.txt)")
self.fileLineEdit.setText(str(path[0]))
自定义的槽函数,用来通过QFileDialog来打开对应目录的文件。
os.path.exists()判断输入的字符串是否为一个路径,如果是一个路径则通过,QFileDialog.getOpenFileName()打开对应filePath的目录;负责打开“/”路径的目录,及当前程序执行路径的根目录。
由于QFileDialog类有很多方法均为静态方法,因此在没有实例化对象的情况下,直接通过类名操作静态方法,其中getOpenFileName()就为静态方法。
|
| getOpenFileName(...)
| QFileDialog.getOpenFileName(QWidget parent=None, str caption='', str directory='', str filter='', str initialFilter='', QFileDialog.Options options=0) -> (str, str)
第1个参数parent,用于指定父组件;
第2个参数caption,是QFileDialog对话框的标题;
第3个参数directory,是对话框显示时默认打开的目录,”.” 代表程序运行目录,”/” 代表当前盘符的根目录(Windows,Linux下/就是根目录了),需要注意不同平台下路径的显示方式,比如Windows平台的C盘”C:\”等
第4个参数filter,是对话框中文件后缀名过滤器。比如我们使用”Python files(.py)”就让它只能显示后缀名是.py的文件。如果需要使用多个过滤器,使用”;;”分割,比如”Python files(.py);;Text files(.txt)”,为两个过滤器分别过滤python文件和txt文件;
第5个参数initialFilter,为默认的过滤器;
第6个参数options,是对话框的一些参数设定,比如只显示文件夹等等,它的取值是 QFileDialog.Options,每个选项可以使用 | 运算组合起来。
QColorDialog
class QColorDialog(QDialog)
| QColorDialog(QWidget parent=None)
| QColorDialog(QColor, QWidget parent=None)
QColorDialog依旧继承自QDialog。QColorDialog是PyQt中用于颜色原则的标准对话框。
通过如下的示例进行说明:
#-*- coding:utf-8 -*-
'''
QColorDialog
'''
__author__ = 'Tony Zhu'
from PyQt5.QtWidgets import QApplication, QDialog,QWidget, QColorDialog, QPushButton, QGridLayout, QFrame
from PyQt5.QtGui import QPalette,QColor
import sys
from PyQt5.QtCore import Qt
class ColorDialog(QDialog):
def __init__(self):
super(ColorDialog,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("ColorDialog")
self.setGeometry(400,400,300,260)
self.colorButton = QPushButton("颜色对话框")
self.colorFrame = QFrame()
self.colorFrame.setFrameShape(QFrame.Box)
self.colorFrame.setAutoFillBackground(True)
self.colorButton.clicked.connect(self.openColor)
self.mainLayout = QGridLayout()
self.mainLayout.addWidget(self.colorButton,0,0)
self.mainLayout.addWidget(self.colorFrame,0,1)
self.setLayout(self.mainLayout)
def openColor(self):
color = QColorDialog.getColor(Qt.white,None,"Selectting Color")
if color.isValid():
self.colorFrame.setPalette(QPalette(color))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = ColorDialog()
ex.show()
sys.exit(app.exec_())
控件类型 | 控件名称 | 作用 |
---|---|---|
QPushButton | colorButton | 打开颜色对话框 |
QFrame | colorFrame | 添加调色盘控件,用于显示选择的颜色 |
示例说明:
通过颜色对话框选择所需要的颜色,并将最终选择的颜色显示在调色盘中。
代码分析:
L22~26:
self.colorButton = QPushButton("颜色对话框")
self.colorFrame = QFrame()
self.colorFrame.setFrameShape(QFrame.Box)
self.colorFrame.setAutoFillBackground(True)
self.colorButton.clicked.connect(self.openColor)
实例化colorButton 和colorFrame 对象,其中绑定colorButton 的clicked信号与自定义的槽函数openColor().
在colorFrame 中通过setPalette()方法添加调色盘,最终将选择的颜色显示在调色盘中。
setFrameShape()设定frame的形状
setAutoFillBackground()设定frame自动填充背景色
L28~30:
self.mainLayout = QGridLayout() self.mainLayout.addWidget(self.colorButton,0,0) self.mainLayout.addWidget(self.colorFrame,0,1)
将colorButton和colorFrame添加到网格布局的对应位置
L34~37:
def openColor(self):
color = QColorDialog.getColor(Qt.white,None,"Selectting Color")
if color.isValid():
self.colorFrame.setPalette(QPalette(color))
自定义选择颜色的方法,QColorDialog.getColor()打开颜色选择对话框,并且将选择的颜色设置到colorFrame的调色盘部件中。
由于QColorDialog类有很多方法均为静态方法,因此在没有实例化对象的情况下,直接通过类名操作静态方法,其中getColor()就为静态方法。
| getColor(...)
| QColorDialog.getColor(QColor initial=Qt.white, QWidget parent=None, str title=QString(), QColorDialog.ColorDialogOptions options=0) -> QColor
|
第1个参数initial,用于指定默认的颜色,函数默认为Qt.white;
第2个参数parent,用于指定父组件;
第3个参数title,是QColorDialog对话框的标题;
第4个参数options,是对话框的一些参数设定,比如是否显示Alpha值等等,每个选项可以使用 | 运算组合起来。具体可以查看API函数的说明。
QColorDialog操作相对简单一些,具体的API的一些使用可以参考一下官网的说明。