Author:qyan.li
Date:2022.4.24
Topic:学习整理QT for python 中各组件的基本用法和示例Demo
Reference:https://blog.51cto.com/quantfabric/2422601
一、写在前面
? 最近计划开始一篇新的博文,内容主要是Qt for python 基本组件的整理和示例Demo ,一方面帮助老师搜集一下相关知识,另一方面也希望系统的学习下QT 组件的相关知识,作为之前
树形组件的补充和拓展。关于树形组件的基本内容,可以参考我之前的博文,链接:https://blog.csdn.net/DALEONE/article/details/123676385?spm=1001.2014.3001.5501
? 同时,我大概会每天更新一点,会持续一段时间,在这个过程中,更新可能会不及时。
二、QT for python 基础组件
? 今天会更新几个弹窗类的组件,这类组件在QT 制作中是至关重要的,比如文件打开,选择,保存的弹窗以及窗口关闭时的警告文件。
1. QFileDialog 组件
? 印象中,应该是在树形组件博文 中简单介绍过此组件,官网对其的界定为The QFileDialog class provides a dialog that allows users to select files or directories ,翻译过来就是提供一个对话框供用户选择文件或者目录。
? 在官网中,QFileDialog提供两种构造的方式:1. 借助于静态函数-static function 2. 自己创建
-
借助于静态函数-getOpenFileName 先上代码: fname, _ = QFileDialog.getOpenFileName(self, "Open file", 'C:/Users\腻味\Desktop\ClashForWindows', "Images(*.jpg *.gif);;Text files (*.txt)")
print(fname)
小Tips:
-
常用的几个参数: caption:{str} 对应于"open file" 用于定义打开窗口的名称 dir:{str} 用于定义打开窗口默认的文件路径 selectedFilter:{str} 用于定义待操作文件的可选类型 -
函数返回值: fileName,selectedFilter 原代码中的_即代表selectedFilter,用下划线表示我们不关心,但是原函数确实返回,故借其占位 -
其他: 官方文档永远是最好的参考文档,getOpenFileName更多可选参数见官方文档,传送门:QFileDialog — Qt for Python
-
借助于函数自己创建 ? 相比于使用官方提供的静态函数,借助于函数自我创建的方法显然更加复杂,但借助于此种方法的优点在于限制小,可操作性大 老样子,先上代码: fileNames = []
dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.AnyFile)
dialog.setNameFilter("Images (*.png *.xpm *.jpg)")
dialog.setDirectory('C:/Users\腻味\Pictures\Saved Pictures')
小Tips:
-
setFileMode 函数用于设置FileMode ,此处有三种模式可供选择:AnyFile,ExistingFile,Directory
AnyFile 可选任何类型,甚至不存在的文件,因此常用于save as 类的对话框ExistingFile 可选确实存在的文件Directory 可选目录,不可选具体文件 -
setNameFilter 用于指定文件的待选格式,如果阅读源码会发现源码中字符串前加tr ,但查阅资料未找到tr 的相关定义,最终在一篇博文中提及:tr 似乎是为方便语言切换设计的模块,此处可以不使用 Reference: https://blog.csdn.net/weixin_41567783/article/details/118416484 -
setViewMode 设置文件显示信息,从官方文档看,其包含有两种模式QFileDialog.Detail和QFileDialog.List ,一种仅显示文件列表,另外一种还可以显示文件详细信息(如文件大小,修改时间等),但从代码实际运行的效果观察,并未起到作用,无论设置任何Mode ,最终显示均为详细信息 -
SetDirectory 用于设定对话框打开默认的文件路径,内部参数传入DirPath 即可 -
更多信息参照官方文档
最后,附上总体代码:
import sys
from PyQt5.QtWidgets import QApplication, QFileDialog, QWidget, QPushButton
class MainWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
button = QPushButton("选择文件", self)
self.resize(800,600)
button.clicked.connect(self.onOKClicked)
def onOKClicked(self):
'''1. Using a static function-getOpenFileName'''
'''2. creat our own QFileDialog'''
fileNames = []
dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.AnyFile)
dialog.setNameFilter("Images (*.png *.xpm *.jpg)")
dialog.setDirectory('C:/Users\腻味\Pictures\Saved Pictures')
if dialog.exec_():
fileNames = dialog.selectedFiles()
print(fileNames)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWidget()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
2022.4.25我又来更新啦,今天主要更新QMessageBox 组件
2. QMessageBox 组件
? QMessageBox 主要用于弹出对话框显示信息提示和指导用户,官方文档给出的定义为The QMessageBox class provides a modal dialog for informing the user or for asking the user a question and receiving an answer ,翻译过来简单讲就是给予用户信息,询问用户问题,接收用户输入。
? QMessageBox 在QT 创建中也是非常常见的,在警告框,确认框等方面应用颇多,下面也还是主要介绍QMessageBox 的两种构造方法:
-
借助于静态函数information,critical,question,warning 老样子,还是先上代码: ret = QMessageBox.question(self, "question Message",
"The document has been modified.\n Do you want to save your changes?",
QMessageBox.Save | QMessageBox.Discard
| QMessageBox.Cancel,
QMessageBox.Save)
上述代码展示如何借助于静态函数实现询问对话框的制作
小Tips:
-
关于question 函数的几点说明: 关于question 函数,官网给出两种构造方法,简单总结下:
question(parent,title,text,button1,button2) ,返回值为int question(parent,title,text,buttons,defaultButton) ,返回值为StandardButton 在本例中,使用的为重载过后的question 方法,QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel 表示Buttons ,而QMessageBox.Save 表示defaultButton 这一点可以在代码中借助于print('type(ret)') 说明,发现输出值为<class 'PyQt5.QtWidgets.QMessageBox.StandardButton'> (虽然此处代码直接输出为数字) -
关于重载函数中buttons 和defaultButton 的说明: buttons 使用| 连接,表示会直接在对话框中显示的按钮,而defaultButton 则表示默认情况下按钮情况 -
question,warning,critical,information 按钮创建和使用方法类似,区别仅在于对话框左侧的图形显示不同,具体内容详见官方文档
-
借助于函数定义方法自己创建 ? 与QFileDialog相似,借助于函数定义的方法创建比静态方法更自由,限制小,但是创建的难度和复杂度比静态方法要高。 老样子,先上代码: msgBox = QMessageBox()
msgBox.setText("The document has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
msgBox.setDefaultButton(QMessageBox.Save)
msgBox.setDetailedText("这是一个测试用例\n用于测试setDetailedText的具体用法")
ret = msgBox.exec()
print(ret == QMessageBox.Save)
小Tips:
-
setText 和setInformativeText 可以用于设置在对话框中显示的信息,内部传入str 类型字符串即可 -
setStandardButtons 和setDefaultButton 分别用于设置标准按钮和默认按钮,与静态方法创建时相同 -
setDetailedText 用于添加详细信息,调用函数后对话框上会自动添加show Details 按钮,点击后即可显示详细信息,内部传入str 字符串即可 -
ret = msgBox.exec() 用于调用对话框,该函数必须被调用,否则对话框不显示,看不见任何效果 同时ret 用于接收函数返回值(用户点击的按钮),因此,假设用户此时点击save ,print 的输出值为true
最后,附上总代码,方便大家参考借鉴:
import sys
from PyQt5.QtWidgets import QApplication, QMessageBox, QWidget, QPushButton
class MainWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
button = QPushButton("OK", self)
self.resize(800, 600)
button.clicked.connect(self.onOKClicked)
def onOKClicked(self):
msgBox = QMessageBox()
msgBox.setText("The document has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
msgBox.setDefaultButton(QMessageBox.Save)
msgBox.setDetailedText("这是一个测试用例\n用于测试setDetailedText的具体用法")
ret = msgBox.exec()
print(ret == QMessageBox.Save)
'''借助于静态函数进行实例化'''
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWidget()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
?
|