PyQt5桌面应用开发(6):文件对话框

本文目录

  • PyQt5桌面应用系列
  • 介绍
  • QFileDialog的静态接口
    • QFileDialog的对象接口
  • 示例
  • 结论
  • 后记

PyQt5桌面应用系列

  • PyQt5桌面应用开发(1):需求分析
  • PyQt5桌面应用开发(2):事件循环
  • PyQt5桌面应用开发(3):并行设计
  • PyQt5桌面应用开发(4):界面设计
  • PyQt5桌面应用开发(5):对话框
  • PyQt5桌面应用开发(6):文件对话框
  • PyQt5桌面应用开发(7):文本编辑+语法高亮与行号

介绍

读入和写文件是一个GUI程序的常用操作。前者导入需要处理的数据,后者把数据输出到硬盘上后期使用。PyQt5提供了PyQt5.QtWidgets.QFileDialog类来完成常用的文件打开、文件存储的功能。

这个类有两个接口形式。第一种形式采用静态函数,调用的方式就是QFileDialog.method(),比如QFileDialog.getOpenFileName()。第二种形式需要先创建一个QFileDialog对象,然后调用对象的method()方法,比如QFileDialog().getOpenFileName()

QFileDialog的静态接口

方便使用的静态函数包括下面的函数:

    def getExistingDirectory(self, parent, QWidget=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """ getExistingDirectory(parent: typing.Optional[QWidget] = None, caption: str = '', directory: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = QFileDialog.ShowDirsOnly) -> str """
        pass

    def getExistingDirectoryUrl(self, parent, QWidget=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """ getExistingDirectoryUrl(parent: typing.Optional[QWidget] = None, caption: str = '', directory: QUrl = QUrl(), options: Union[QFileDialog.Options, QFileDialog.Option] = QFileDialog.ShowDirsOnly, supportedSchemes: Iterable[str] = []) -> QUrl """
        pass

    def getOpenFileName(self, parent, QWidget=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """ getOpenFileName(parent: typing.Optional[QWidget] = None, caption: str = '', directory: str = '', filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0) -> Tuple[str, str] """
        pass

    def getOpenFileNames(self, parent, QWidget=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """ getOpenFileNames(parent: typing.Optional[QWidget] = None, caption: str = '', directory: str = '', filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0) -> Tuple[List[str], str] """
        pass

    def getOpenFileUrl(self, parent, QWidget=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """ getOpenFileUrl(parent: typing.Optional[QWidget] = None, caption: str = '', directory: QUrl = QUrl(), filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0, supportedSchemes: Iterable[str] = []) -> Tuple[QUrl, str] """
        pass

    def getOpenFileUrls(self, parent, QWidget=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """ getOpenFileUrls(parent: typing.Optional[QWidget] = None, caption: str = '', directory: QUrl = QUrl(), filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0, supportedSchemes: Iterable[str] = []) -> Tuple[List[QUrl], str] """
        pass

    def getSaveFileName(self, parent, QWidget=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """ getSaveFileName(parent: typing.Optional[QWidget] = None, caption: str = '', directory: str = '', filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0) -> Tuple[str, str] """
        pass

    def getSaveFileUrl(self, parent, QWidget=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """ getSaveFileUrl(parent: typing.Optional[QWidget] = None, caption: str = '', directory: QUrl = QUrl(), filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0, supportedSchemes: Iterable[str] = []) -> Tuple[QUrl, str] """
        pass

可以很方便的打开目录、多文件、单文件,保存文件。函数的返回值第一就是文件的路径,第二个是文件的类型。如果采用Url的形式,则可以打开类似于PyQt5.QtCore.QUrl('file:///C:/Users/User/qchen/pyqt5/chart1.py')的形式,这种方式应该还可以很方便的打开ftp等形式的文件。

QFileDialog的对象接口

采用对象的接口也非常直观。

  1. 创建一个QFileDialog对象;
  2. 调用QFileDialog对象的setWindowTitle()方法设置标题;
  3. 调用QFileDialog对象的setDirectory()方法设置默认打开的目录;
  4. 调用QFileDialog对象的setNameFilter()方法设置文件过滤器;
  5. 调用QFileDialog对象的setFileMode()方法设置文件模式;
  6. 调用QFileDialog对象的setViewMode()方法设置视图模式;
  7. 调用QFileDialog对象的setOption()方法设置对话框的选项;
  8. 调用QFileDialog对象的open()方法打开对话框;
  9. 调用QFileDialog对象的selectedFiles()方法获取选中的文件,或者调用QFileDialog对象的selectedUrl()方法获取选中的文件的Url。

示例

下面的示例代码演示了如何使用QFileDialog类。

import sys
from functools import partial

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenuBar, QAction, QTextEdit, QFileDialog, QWidget, QStatusBar, \
    QToolBar, QStyle

current_file: str = None


def open_file_func(parent: QWidget, content: QTextEdit, checked: bool):
    try:
        file, current_filter = QFileDialog.getOpenFileName(parent,
                                                           "Open File",
                                                           ".",
                                                           "Text Files (*.txt);;Python Files (*.py);;Markdown Files ("
                                                           "*.md)")

        with open(file, "r", encoding="utf-8") as fid:
            content.setText(fid.read())
            global current_file
            current_file = file
            if isinstance(parent, QMainWindow):
                parent: QMainWindow
                parent.statusBar().showMessage(f"Opened {file}")
                parent.setWindowTitle(file)
    except Exception as e:
        content.setText(f"<b style='color:#FF0000'>{str(e)}</b>")
        current_file = None


def save_file_func(parent: QWidget, content: QTextEdit, checked: bool):
    try:
        global current_file
        if current_file is None:
            save_as_file_func(parent, content, checked)
            return
        with open(current_file, "w", encoding="utf-8") as fid:
            fid.write(content.toPlainText())
            if isinstance(parent, QMainWindow):
                parent: QMainWindow
                parent.statusBar().showMessage(f"Saved {current_file}")
                parent.setWindowTitle(current_file)
    except Exception as e:
        content.setText(f"<b style='color:#FF0000'>{str(e)}</b>")
        current_file = None


def save_as_file_func(parent: QWidget, content: QTextEdit, checked: bool):
    try:
        file, current_filter = QFileDialog.getSaveFileName(parent,
                                                           "Open File",
                                                           ".",
                                                           "Text Files (*.txt);;Python Files (*.py);;Markdown Files ("
                                                           "*.md)")
        with open(file, "w", encoding="utf-8") as fid:
            fid.write(content.toPlainText())
            global current_file
            current_file = file
            if isinstance(parent, QMainWindow):
                parent: QMainWindow
                parent.statusBar().showMessage(f"Saved {file}")
                parent.setWindowTitle(file)
    except Exception as e:
        content.setText(f"<b style='color:#FF0000'>{str(e)}</b>")
        current_file = None


def file_edited(parent: QMainWindow):
    parent: QMainWindow
    if current_file == parent.windowTitle():
        parent.setWindowTitle(f"{current_file}*")


if __name__ == '__main__':
    app = QApplication(sys.argv)

    mw = QMainWindow()
    content_edit = QTextEdit(mw)
    menu = QMenuBar(mw)
    sb = QStatusBar(mw)
    tb = QToolBar(mw)

    content_edit.textChanged.connect(partial(file_edited, mw))

    mw.setMenuBar(menu)
    mw.setCentralWidget(content_edit)
    mw.setStatusBar(sb)
    mw.addToolBar(tb)

    file_menu = menu.addMenu("&File")

    open_file = QAction("Open", mw)
    open_file.setShortcut("Ctrl+O")
    open_file.setIcon(mw.style().standardIcon(QStyle.SP_DialogOpenButton))
    open_file.triggered.connect(partial(open_file_func, mw, content_edit))

    save_as_file = QAction("Save as", mw)
    save_as_file.setShortcut("Ctrl+Shift+S")
    save_as_file.setIcon(QIcon("sa.png"))
    save_as_file.triggered.connect(partial(save_as_file_func, mw, content_edit))

    save_file = QAction("Save", mw)
    save_file.setShortcut("Ctrl+S")
    save_file.setIcon(mw.style().standardIcon(QStyle.SP_DialogSaveButton))
    save_file.triggered.connect(partial(save_file_func, mw, content_edit))

    exit_app = QAction("Exit", mw)
    exit_app.setShortcut("Ctrl+Q")
    exit_app.setIcon(mw.style().standardIcon(QStyle.SP_DialogCloseButton))
    exit_app.triggered.connect(lambda checked: mw.close())

    file_menu.addAction(open_file)
    file_menu.addAction(save_file)
    file_menu.addAction(save_as_file)
    file_menu.addSeparator()
    file_menu.addAction(exit_app)

    tb.addAction(open_file)
    tb.addAction(save_file)
    tb.addAction(save_as_file)
    tb.addAction(exit_app)

    mw.setWindowTitle("File Open Dialog")
    mw.resize(800, 600)
    mw.setWindowIcon(QIcon("icon.png"))
    mw.show()

    sys.exit(app.exec_())

这个示例实现了一个非常简单的文本编辑器。打开文件、存储文件、另存文件都实现为QAction,这个可以在菜单和工具栏上复用,还是非常方便的。

程序界面

当文件被编辑时,标题中增加*,便于保存和另存。PyQt5很好很强大啊。当然如果需要一次打开多个文件,那么这里可能需要实现一个MDIArea,这个就不是本文的重点了。

这个程序用到functools.partial,很好的帮助我们在设置QActiontriggered信号时传递参数。如果使用lambda,可能不便于捕捉参数的当地值。

程序的图标使用了部分PyQt5的标准图标,标准图标的名称用SP_xxxxQStyle中获得。

内置图标

程序本身的图标准备了两个图片文件。

程序图标
另存图标

结论

  1. QFileDialg是一个非常方便的文件选择对话框,可以用来打开文件、保存文件、选择文件夹等。
  2. QFileDialog的静态方法可以直接使用,也可以创建一个实例来使用。
  3. QFileDialog的静态方法返回的是一个元组,第一个元素是文件名,第二个元素是文件类型。

后记

当然,作为一个程序员,我对前面那个弱智玩意有很多不满意的地方,没办法,只好增加了代码语法高亮、行号、当前行高亮。

这亿点点细节就只有下次再写。
一点点细节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MRI k空间概念整理

以下内容为MRI期末复习笔记&#xff0c;仅供复习参考使用。 K空间概念 K空间为包含MR数据的阵列&#xff0c;也可定义为原始数据阵列相位编码轴和频率编码轴的交叉点 MR扫描得到的数据为谱空间数据&#xff0c;谱空间数据与空间数据位置无直接对应关系 k空间每一数据点或数据…

不能使用chatGPT?这3个平替甚至比chatGPT更强

不能使用chatGPT&#xff1f;这3个平替甚至比chatGPT更强 chatGPT&#xff0c;一款由OpenAI开发的新型AI聊天机器人&#xff0c;正在势如破竹地改变着许多人的工作和生活方式。作为一款基于大语言模型的聊天机器人&#xff0c;chatGPT能够理解自然语言并进行人机对话。与传统的…

用于scATAC-seq有监督分类的Cellcano

细胞类型识别是单细胞数据分析的基本步骤。由于高质量参考数据集的可用性&#xff0c;有监督细胞分类方法在scRNA-seq数据中很受欢迎。染色质可及性分析&#xff08;scATAC-seq&#xff09;的最新技术进步为理解表观遗传异质性带来了新的见解。随着scATAC-seq数据集的不断积累&…

html5地理位置信息介绍, 百度地图使用

文章目录 1. HTML5中地理信息API1.1 Geolocation 接口 2. 在vue中使用百度地图3. 在react中使用百度地图 1. HTML5中地理信息API HTML5 的地理位置 API 可以让你获取用户的地理位置信息&#xff0c;并将其用于许多不同的应用场景&#xff0c;例如&#xff1a; 在地图上显示用…

钴基双金属氧化物储能材料的高效制备和电化学应用

一、引言 钴金属氧化物作为一类典型的储能材料&#xff0c;既可以用于锂离子电池负极材料&#xff0c;又可以用于超级电容器电极材料&#xff0c;因而备受关注 。在作为锂离子电池负极材料时&#xff0c;具有较高的理论比容量&#xff0c;但充放电体积变化较大、材料导电性较差…

爬虫为什么需要ip

爬虫需要使用爬虫ip主要是为了解决以下问题&#xff1a; 1、反爬虫机制&#xff1a;许多网站会设置反爬虫机制来防止爬虫程序的访问&#xff0c;例如限制IP地址的访问频率、检测访问来源等。使用爬虫ip可以绕过这些限制&#xff0c;使得爬虫程序更难被检测到。 2、访问限制&a…

浅拷贝和深拷贝

浅拷贝&#xff1a; 定义&#xff1a;浅拷贝&#xff08;Shallow Copy&#xff09;是一种简单的对象复制方式&#xff0c;将一个对象的数据成员直接复制给另一个对象&#xff08;通常是通过默认的复制构造函数或赋值运算符实现&#xff09;&#xff0c;这些数据成员可以是基本…

JavaScript:字符串

文章目录 字符串344. 反转字符串reverse() 方法&#xff08;打基础的时候&#xff0c;不要太迷恋库函数&#xff09;代码及思路 541. 反转字符串 IIJavaScript String split() 方法JavaScript Array join() 方法代码分析见注释 剑指 Offer 05. 替换空格思路注意&#xff1a;上面…

网络基础学习:什么是网络与网络发展史

什么是网络与网络发展史 什么是网络&#xff1f;什么是网络发展史&#xff1f;分组交换技术TCP/IP技术Web技术ARPANET&#xff08;1969年&#xff09;Internet&#xff08;1983年&#xff09;万维网&#xff08;1990年&#xff09;移动互联网&#xff08;2007年&#xff09;物联…

KDGK-F断路器机械特性测试仪

一、产品概述 KDGK-F 断路器机械特性测试仪可用于各电压等级的真空、六氟化硫、少油、多油等电力系统高压开关的机械特性参数测试与测量。测量数据稳定&#xff0c;抗干扰性强&#xff0c;可在500KV等级及以下电站做实验&#xff0c;接线方便&#xff0c;操作简单&#xff0c;是…

第14章 项目采购管理

文章目录 采购管理包括如下几个过程14.2 编制采购计划 462编制采购计划的输出1&#xff09;采购管理计划2&#xff09;采购工作说明书3&#xff09;采购文件 14.2.3 工作说明书&#xff08;SOW&#xff09; 14.3 实施采购 47414.3.2 实施采购的方法和技术 476&#xff08;1&…

No.054<软考>《(高项)备考大全》【冲刺8】《软考之 119个工具 (6)》

《软考之 119个工具 &#xff08;6&#xff09;》 99.应急应对策略:100.风险在评估:101.风险审计:102.偏差和趋势分析:103.技术绩效测量:104.自制或外购分析:105.市场调研:106.投标人会议:107.建议书评价技术:108.独立核算:109.广告:110.采购谈判:111.合同变更控制系统:112.采购…

ArduPilot之GPS Glitch问题M8N模块配置

ArduPilot之GPS Glitch问题&M8N模块配置 1. 源由2. 现象3. 视频分析3.1 配置&#xff08;不理想&#xff09;3.2 配置优化3.3 优化配置短时间3D LockGlitch3.4 优化配置长时间3D DGPS Lock3.5 使用尽量多的卫星系统3.5.1 配置一3.5.2 配置二 3.6 同一时间段&#xff08;M8N…

3.3 泰勒公式例题分析

例1 写出函数f(x)带有拉格朗日余项的n阶麦克劳林公式 我的答案&#xff1a; 一、信息 1.f(x)的表达式 2.目标求这个f(x)的n阶麦克劳林公式 二、分析 条件1&#xff1a;告诉我f(x)的表达式为我后续带入公式做准备 条件2&#xff1a;告诉我用什么公式和此次求解的方向 三…

平面设计师都在用的设计素材网站,免费下载~

很多新手设计师不知道去哪里找高清、免费的设计素材&#xff0c;今天我就给大家推荐5个设计素材网站&#xff0c;免费下载&#xff0c;赶紧收藏起来把&#xff01; 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站&#xff0c;主要是站内素…

普通2本,去过字节外包,到现在年薪25W+的测试开发,我的2年转行心酸经历...

个人简介 我是一个普通二本大学机械专业毕业&#xff0c;17年毕业&#xff0c;19年转行&#xff0c;目前做IT行业的软件测试已经有3年多&#xff0c;职位是高级测试工程师&#xff0c;坐标上海… 我想现在我也有一点资格谈论关于转行这个话题&#xff1b;希望你在决定转行之前…

unity-VRTK-simulator开发学习日记2(抛物线 导包|使用|调用方法)

导包 使用抛物线 1.层级目录下添加抛物线曲线 曲线上面那个是直线 2.将跟踪控制器 给到抛物线的“跟随资源” &#xff08;选择哪只手射出射线&#xff09; 3.激活按键 找到模拟手柄按键 找到simulator的交互的几个按键&#xff08;ButtonOne为例&#xff09; value&#x…

从4k到42k,软件测试工程师的涨薪史,给我看哭了

清明节一过&#xff0c;盲猜大家已经无心上班&#xff0c;在数着日子准备过五一&#xff0c;但一想到银行卡里的余额……瞬间心情就不美丽了。 最近&#xff0c;2023年高校毕业生就业调查显示&#xff0c;本科毕业月平均起薪为5825元。调查一出&#xff0c;便有很多同学表示自己…

第六章 Iptables与Firewalld防火墙

第六章 Iptables与Firewalld防火墙 一、Iptables 1、策略与规则链 &#xff08;1&#xff09;、防火墙策略规则的设置 一种是“通”即放行&#xff0c;另一种是“堵”即阻止。 当防火墙的默认策略为拒绝时&#xff08;堵&#xff09;&#xff0c;就要设置允许规则通&#x…

[论文笔记] In Search of an Understandable Consensus Algorithm (Extended Version)

In Search of an Understandable Consensus Algorithm (Extended Version) 寻找可理解的共识算法 (扩展版) [Extended Paper] [Original Paper] ATC’14 (Original) 摘要 Raft 是一个用于管理复制日志的共识算法. Raft 更易于理解, 且为构建实际的系统提供了更好的基础. Raf…