PyQt5基本窗口控件(对话框类控件)
对话框类控件
QDialog
为了更好地实现人机交互,比如Windows及Linux等系统均会提供一系列的标
准对话框来完成特定场景下的功能,如选择字号大小、字体颜色等。在PyQt5中定
义了一系列的标准对话框类,让使用者能够方便和快捷地通过各个类完成字号大小、
字体颜色以及文件的选择等。
QDiaIog类的子类主要有QMessageBox、QFiIeDialog、QFontDialog、QInputDialog
等,这些内容在本节都会介绍到。
QDialog类的继承结构如图4-30所示。
QDialog类中的常用方法如表4-21所示。
方法 | 描述 |
---|---|
setWindowTitIe() | 设置对话框标题 |
setWindowModality() | 设置窗口模态。取值如下:QtNonModal,非模态,可以和程序的其他窗交互;Qt.WindowModaI,窗口模态,程序在未处理完当前对话框时,将阻止和对话框的父窗口进行交;Qt.ApplieationModaI,应程序模态,阻止和任何其他窗口进行交互 |
QDialog的使用
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *class DialogDemo(QMainWindow):def __init__(self,parent=None):super(DialogDemo,self).__init__(parent)self.setWindowTitle("Dialog例子")self.resize(350,300)self.btn=QPushButton(self)self.btn.setText("弹出对话框")self.btn.move(50,50)self.btn.clicked.connect(self.showdialog)def showdialog(self):dialog=QDialog()btn=QPushButton("ok",dialog)btn.move(50,50)dialog.setWindowTitle("Dialog")dialog.setWindowModality(Qt.ApplicationModal)dialog.exec_()if __name__=='__main__':app=QApplication(sys.argv)demo=DialogDemo()demo.show()sys.exit(app.exec_())
运行效果
代码分析
在这个例子中,Dialog窗口的WindowModality属性决定是否为模态或非模态。
当用户按下Esc键时,对话框窗口将会默认调用QDialog.reject()方法,然后关闭对
话框窗口。
单击QWidget窗口中的PushButton按钮时,将生成一个对话框窗口。在对话框
窗口的标题栏上没有最小化和最大化控件。以下代码将给按钮的clicked信号添加槽
函数showdialog()。
self.btn.clicked.connect(self.showdialog)
由于DiaIog窗口的WindowModaIity属性设置为Qt.AppIicationModal模态,用
户只有关闭所弹出的对话框窗口后,才能关闭主窗口。以下代码用于设置对话框模态:
dialog.setWindowModality(Qt.ApplicationModal)
QMessageBox
QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过单击
不同的标准按钮对消息进行反馈。每个标准按钮都有一个预定义的文本、角色和十
六进制数。
QMessageBox类提供了许多常用的弹出式对话框,如提示、警告、错误、询问、
关于等对话框。这些不同类型的QMessageBox对话框只是显示时的图标不同,其他
功能是一样的。
QMessageBox类中的常用方法如表4-22所示。
方法 | 描述 |
---|---|
information(QWidget parent,title,text,buttons,defaultButton) | 弹出消息对诂框,各参数解释如下:parent,指定的父窗口控件title,对话标题;text,对话框文本;buttons:多个标冲按钮,默认为OK按钮;defauItButtont:默认选中的标准按钮,默认是第一个标准按钮 |
question(QWidget parent,title,text,buttons,deftuItButton) | 弹出问答对话框(各参数解释同上) |
warning(QWidget parent,title,text,buttons,defaultButton) | 弹出警告对话框(各参数解释同上) |
ctiticaI(QWidget parent,title,text.buttons,defauItButton) | 弹出错误对话框(各参数解释同上) |
about(QWidget parent,title,text) | 弹出关于对话框(各参数解释同上) |
setTitle() | 设置标题 |
setText() | 设置消息正文 |
setIcon() | 设置出对话框的图片 |
QMessageBox的使用
import sys
from PyQt5.QtCore import*
from PyQt5.QtGui import *
from PyQt5.QtWidgets import*class WinForm(QWidget):def __init__(self):super(WinForm,self).__init__()self.setWindowTitle("QMessageBox")self.resize(300,100)self.myButton=QPushButton(self)self.myButton.setText("点击弹出消息框")self.myButton.clicked.connect(self.msg)def msg(self):# 使用infomation信息框reply=QMessageBox.information(self,"标题","对话框消息正文",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)print(reply)if __name__ == '__main__':app = QApplication(sys.argv)demo=WinForm()demo.show()sys.exit(app.exec_())
运行效果
QInputDialog
QInputDialog控件是一个标准对话框,由一个文本框和两个按钮(OK按钮和
Cancel按钮)组成。当用户单击OK按钮或按Enter键后,在父窗口可以收集通过
QlnputDialog控件输入的信息。QInputDialog控件是QDialog标准对话框的一部分。
在QInputDialog控件中可以输入数字、字符串或列表中的选项。标签用于提示
必要的信息。
QInputDialog类中的常用方法如表4-25所示。
方法 | 描述 |
---|---|
getlnt() | 从控件中获得标准整数输入 |
getDouble() | 从控件中获得标准浮点数输入 |
getText() | 从控件中获得标准字符串输入 |
getItem() | 从控件中获得列表里的选项输入 |
QlnputDiaIog的使用
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class InputdialogDemo(QWidget):def __init__(self,parent=None):super(InputdialogDemo,self).__init__(parent)layout=QFormLayout()self.btn1=QPushButton("获取列表里的选项")self.btn1.clicked.connect(self.getItem)self.le1=QLineEdit()layout.addRow(self.btn1,self.le1)self.btn2=QPushButton("获取字符串")self.btn2.clicked.connect(self.getText)self.le2=QLineEdit()layout.addRow(self.btn2,self.le2)self.btn3=QPushButton("获得整数")self.btn3.clicked.connect(self.getInt)self.le3=QLineEdit()layout.addRow(self.btn3,self.le3)self.setLayout(layout)self.setWindowTitle("Input Dialog 例子")def getItem(self):items=("C","C++","Java","Python")item,ok=QInputDialog.getItem(self,"select input dialog","语言列表",items,0,False)if ok and item:self.le1.setText(item)def getText(self):text,ok=QInputDialog.getText((self,"Text Input Dialog",'输入姓名:'))if ok:self.le2.setText(str(text))def getInt(self):num,ok=QInputDialog.getInt(self,"integer inpt dualog","输入数字")if ok:self.le3.setText(str(num))if __name__ == '__main__':app=QApplication(sys.argv)demo=InputdialogDemo()demo.show()sys.exit(app.exec_())
运行效果截图
代码分析:
在这个例子中,在QFormLayout布局管理器中放置了三个按钮和三个文本框。
当单击按钮时,将弹出标准对话框,把按钮的单击信号与自定义的槽函数连接起来。
self.btn1.clicked.connect(self.getItem)
self.btn2.clicked.connect(self.getText)
self.btn3.clicked.connect(self.getInt)
当调用QInputDialog.getltem()函数时,QlnputDialog控件包含一个QCombox控
件和两个按钮,用户从QCombox中选择一个选项后,允许用户确认或取消操作。
def getItem(self):items=("C","C++","Java","Python")item,ok=QInputDialog.getItem(self,"select input dialog","语言列表",items,0,False)if ok and item:self.le1.setText(item)
同理,当调用QInputDialog、getText()函数时,QInputDialog控件包含一个文本框
和两个按钮,允许用户输入字符串;当调用QInputDialog.getInt()函数时,QInputDialog
包含一个QSpinBox控件和两个按钮,允许用户输入整数。
QFontDialog
QFontDialog控件是一个常用的字体选择对话框,可以让用户选择所显示文本的
字号大小、样式和格式。QFontDialog是QDialog标准对话框的一部分。使用
QFontDialog类的静态方法getFont(),可以从字体选择对话框中选择文本的显示字号
大小、样式和格式。
QFontDialog的使用
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class FontDialogDemo(QWidget):def __init__(self,parent=None):super(FontDialogDemo,self).__init__(parent)layout=QVBoxLayout()self.fontButton=QPushButton("choose font")self.fontButton.clicked.connect(self.getFont)layout.addWidget(self.fontButton)self.fontLineEdit=QLabel("Hello,测试字体例子")layout.addWidget(self.fontLineEdit)self.setLayout(layout)self.setWindowTitle("Font Dialog 例子")def getFont(self):font,ok=QFontDialog.getFont()if ok:self.fontLineEdit.setFont(font)if __name__=='__main__':app=QApplication(sys.argv)demo=FontDialogDemo()demo.show()sys.exit(app.exec_())
运行效果:
代码分析:
在这个例子中,通过字体选择对话框选择相应的字体,并且所选择字体的效果
显示在QLineEdit的文本上。
实例化fontButton和fontLineEdit对象,并将fontButton的clicked信号和槽函
数getFont()绑定在一起。
self.fontButton=QPushButton("choose font")
self.fontButton.clicked.connect(self.getFont)
self.fontLineEdit=QLabel("Hello,测试字体例子")
创建QVBoxLayout布局,在垂直布局管理器中添加fontButton和fontLineEdit
组件,并按照相应的位置添加到栅格布局中。
layout=QVBoxLayout()
layout.addWidget(self.fontButton)
layout.addWidget(self.fontLineEdit)
当单击fontButton按钮时,将clicked信号发送到槽函数getFont()中。
self.fontButton.clicked.connect(self.getFont)
自定义槽函数,选择字体,并将字体效果设置到fontLineEdit中。getFont()方法
返回的为元组类型,同时返回所选择的字体和函数执行的状态。
def getFont(self):font,ok=QFontDialog.getFont()if ok:self.fontLineEdit.setFont(font)
QFileDialog
QFileDialog是用于打开和保存文件的标准对话框。QFileDialog类继承自
QDialog类。
QFileDialog在打开文件时使用了文件过滤器,用于显示指定扩展名的文件。也
可以设置使用QFileDialog打开文件时的起始目录和指定扩展名的文件。
QFileDialog类中的常用方法如表4-26所示。
方法 | 描述 |
---|---|
getOpenFileName() | 返回用户所选择文件的名称,并打开该文件 |
getSaveFiIeName() | 使用用户选择的文件名并保存文件 |
setFiIeMode() | 可以选择的文件类型,枚举常量是:QFileDialog.AnyFile,任何文件;QFileDialog.EnstingFile,己存在的文件;QFi]eDialog.mrectory,文件且录;QFileDialog.ExistingFiles,己经存在的多个文件 |
setFilter() | 设置过滤器,只显示过滤器允许的文件类型 |
QFileDialog的使用
# -*- coding: utf-8 -*-'''【简介】PyQt5中 QFileDialog 例子'''import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class filedialogdemo(QWidget):def __init__(self, parent=None):super(filedialogdemo, self).__init__(parent)layout = QVBoxLayout()self.btn = QPushButton("加载图片")self.btn.clicked.connect(self.getfile)layout.addWidget(self.btn)self.le = QLabel("")layout.addWidget(self.le)self.btn1 = QPushButton("加载文本文件")self.btn1.clicked.connect(self.getfiles)layout.addWidget(self.btn1)self.contents = QTextEdit()layout.addWidget(self.contents)self.setLayout(layout)self.setWindowTitle("File Dialog 例子")def getfile(self):fname, _ = QFileDialog.getOpenFileName(self, 'Open file', 'c:\\', "Image files (*.jpg *.gif)")self.le.setPixmap(QPixmap(fname))def getfiles(self):dlg = QFileDialog()dlg.setFileMode(QFileDialog.AnyFile)dlg.setFilter(QDir.Files)if dlg.exec_():filenames = dlg.selectedFiles()f = open(filenames[0], 'r')with f:data = f.read()self.contents.setText(data)if __name__ == '__main__':app = QApplication(sys.argv)ex = filedialogdemo()ex.show()sys.exit(app.exec_())
运行效果
代码分析:
在这个例子中,通过文件对话框来选择文件,其中第一个文件对话框只允许打
开图片文件,并把所加载的图片显示在标签(QLabel)中;第二个文件对话框只允
许打开文本文件,并把文本内容显示在文本框(QTextEdit)内。
第一个按钮使用QFileDialog.getOpenFileNam(),调用文件对话框来显示图像,
并显示在一个标签控件中。它负责打开c盘目录下的文件。其核心代码如下:
fname, _ = QFileDialog.getOpenFileName(self, 'Open file', 'c:\\', "Image files (*.jpg *.gif)")self.le.setPixmap(QPixmap(fname))
在QFileDialog.getOpenFiIeNam()函数中:
- 第一个参数用于指定父组件;
- 第二个参数是QFileDialog对话框的标题;
- 第三个参数是对话框显示时默认打开的目录,“.”代表程序运行目录,“/”代
表当前盘下的根目录(在Windows、Linux下“/”就表示根目录)。需要注意
不同平台下路径的显示方式,比如Windows平台下的C盘“C:\”等。 - 第四个参数是对话框中文件扩展名过滤器(Filter)。比如使用“lmage files(.jpg.glf)"表示只能显示打展名为.jpg或.gif的文件。
第二个按钮使用文件对话框(QFileDialog)对象的exec0方法来选择文件,并
把所选文件的内容显示在文本编辑控件中。其核心代码如下:
def getfiles(self):dlg = QFileDialog()dlg.setFileMode(QFileDialog.AnyFile)dlg.setFilter(QDir.Files)if dlg.exec_():filenames = dlg.selectedFiles()f = open(filenames[0], 'r')with f:data = f.read()self.contents.setText(data)