IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Pyqt主要组件QFileDialog,QMessageBox详解,附详细代码(持续更新中.....) -> 正文阅读

[Python知识库]Pyqt主要组件QFileDialog,QMessageBox详解,附详细代码(持续更新中.....)


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. 自己创建

  1. 借助于静态函数-getOpenFileName

    先上代码:

    fname, _ = QFileDialog.getOpenFileName(self, "Open file", 'C:/Users\腻味\Desktop\ClashForWindows', "Images(*.jpg *.gif);;Text files (*.txt)") # 选择文件并将选择的文件路径进行返回
    print(fname)
    

    Tips:

    1. 常用的几个参数:

      caption:{str}对应于"open file"用于定义打开窗口的名称

      dir:{str}用于定义打开窗口默认的文件路径

      selectedFilter:{str}用于定义待操作文件的可选类型

    2. 函数返回值:

      fileName,selectedFilter原代码中的_即代表selectedFilter,用下划线表示我们不关心,但是原函数确实返回,故借其占位

    3. 其他:

      官方文档永远是最好的参考文档,getOpenFileName更多可选参数见官方文档,传送门:QFileDialog — Qt for Python

  2. 借助于函数自己创建

    ? 相比于使用官方提供的静态函数,借助于函数自我创建的方法显然更加复杂,但借助于此种方法的优点在于限制小,可操作性大

    老样子,先上代码:

    fileNames = [] 
    dialog = QFileDialog(self) # QFileDialog类实例化
    dialog.setFileMode(QFileDialog.AnyFile)
    
    ## 指定打开的文件类型:源代码中添加tr,但查阅相关资料后发现tr可以不适用,且一般情况下不推荐使用
    # 参考文献:https://blog.csdn.net/weixin_41567783/article/details/118416484
    dialog.setNameFilter("Images (*.png *.xpm *.jpg)")
    
    ## 理论上,list仅显示文件名和文件夹列表,而Details同时显示详细信息(文件大小,修改时间等)
    # dialog.setViewMode(QFileDialog.Detail)
    # dialog.setViewMode(QFileDialog.List)
    
    dialog.setDirectory('C:/Users\腻味\Pictures\Saved Pictures') ## 此函数可以设计打开时的文件夹
    

    Tips:

    1. setFileMode函数用于设置FileMode,此处有三种模式可供选择:AnyFile,ExistingFile,Directory

      • AnyFile可选任何类型,甚至不存在的文件,因此常用于save as类的对话框
      • ExistingFile可选确实存在的文件
      • Directory可选目录,不可选具体文件
    2. setNameFilter用于指定文件的待选格式,如果阅读源码会发现源码中字符串前加tr,但查阅资料未找到tr的相关定义,最终在一篇博文中提及:tr似乎是为方便语言切换设计的模块,此处可以不使用

      Reference:https://blog.csdn.net/weixin_41567783/article/details/118416484

    3. setViewMode设置文件显示信息,从官方文档看,其包含有两种模式QFileDialog.Detail和QFileDialog.List,一种仅显示文件列表,另外一种还可以显示文件详细信息(如文件大小,修改时间等),但从代码实际运行的效果观察,并未起到作用,无论设置任何Mode,最终显示均为详细信息

    4. SetDirectory用于设定对话框打开默认的文件路径,内部参数传入DirPath即可

    5. 更多信息参照官方文档

最后,附上总体代码:

## QFileDialog模块学习
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'''
        # fname, _ = QFileDialog.getOpenFileName(self, "Open file", 'C:/Users\腻味\Desktop\ClashForWindows', "Images(*.jpg *.gif);;Text files (*.txt)") # 选择文件并将选择的文件路径进行返回
        # print(fname)

        '''2. creat our own QFileDialog'''
        fileNames = [] # 首先赋值为empty directory
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.AnyFile)
        dialog.setNameFilter("Images (*.png *.xpm *.jpg)")
        
        # # dialog.setViewMode(QFileDialog.Detail)
        # # dialog.setViewMode(QFileDialog.List)
        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,翻译过来简单讲就是给予用户信息,询问用户问题,接收用户输入。

? QMessageBoxQT创建中也是非常常见的,在警告框,确认框等方面应用颇多,下面也还是主要介绍QMessageBox的两种构造方法:

  1. 借助于静态函数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:

    1. 关于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'>(虽然此处代码直接输出为数字)

    2. 关于重载函数中buttonsdefaultButton的说明:

      buttons使用|连接,表示会直接在对话框中显示的按钮,而defaultButton则表示默认情况下按钮情况

    3. question,warning,critical,information按钮创建和使用方法类似,区别仅在于对话框左侧的图形显示不同,具体内容详见官方文档

  2. 借助于函数定义方法自己创建

    ? 与QFileDialog相似,借助于函数定义的方法创建比静态方法更自由,限制小,但是创建的难度和复杂度比静态方法要高。

    老样子,先上代码:

    msgBox = QMessageBox() # QMessageBox class 实例化 
    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:

    1. setTextsetInformativeText可以用于设置在对话框中显示的信息,内部传入str类型字符串即可

    2. setStandardButtonssetDefaultButton分别用于设置标准按钮和默认按钮,与静态方法创建时相同

    3. setDetailedText用于添加详细信息,调用函数后对话框上会自动添加show Details按钮,点击后即可显示详细信息,内部传入str字符串即可

    4. ret = msgBox.exec()用于调用对话框,该函数必须被调用,否则对话框不显示,看不见任何效果

      同时ret用于接收函数返回值(用户点击的按钮),因此,假设用户此时点击saveprint的输出值为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) ## 界面中设置一个Button

        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?")
        ## 小界面中设置Button
        msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
        msgBox.setDefaultButton(QMessageBox.Save)
        
        # 设置详细信息的显示,会自动添加Button按钮
        msgBox.setDetailedText("这是一个测试用例\n用于测试setDetailedText的具体用法")

        ## ret本质上会返回用户选择的按钮
        ret = msgBox.exec()
        print(ret == QMessageBox.Save)
        

        '''借助于静态函数进行实例化'''
        # ## warning的弹出框
        # ret = QMessageBox.warning(self, "Warning Message",
        #                        "The document has been modified.\n Do you want to save your changes?",
        #                        QMessageBox.Save | QMessageBox.Discard
        #                        | QMessageBox.Cancel,
        #                        QMessageBox.Save)
        
        # ## information的弹出框
        # ret = QMessageBox.information(self, "Information Message",
        #                        "The document has been modified.\n Do you want to save your changes?",
        #                        QMessageBox.Save | QMessageBox.Discard
        #                        | QMessageBox.Cancel,
        #                        QMessageBox.Save)
        
        # # ## question的弹出框 
        # 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)
        
        # ## critical的弹出框
        # ret = QMessageBox.critical(self, "critical Message",
        #                        "The document has been modified.\n Do you want to save your changes?",
        #                        QMessageBox.Save | QMessageBox.Discard
        #                        | QMessageBox.Cancel,
        #                        QMessageBox.Save)
        # print(type(ret))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWidget()
    window.resize(400, 200)
    window.show()

    sys.exit(app.exec_())

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:17:51  更:2022-04-27 11:19:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:56:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码