【QT】文件目录操作

目录

1 文件目录操作相关的类

2 实例概述

2.1 实例功能

2.2 信号发射者信息的获取

3 QCoreApplication类

4 QFile类

5 QFilelnfo类

6 QDir类

7 QTemporaryDir和QTemporaryFiIe

8 QFiIeSystemWatcher类

文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能。

1 文件目录操作相关的类

Qt为文件和目录操作提供了一些类,利用这些类可以方便地实现一些操作。Qt提供的与文件
和目录操作相关的类包括以下几个。
  • QCoreApplication:用于提取应用程序路径、程序名等文件信息。
  • QFile:除了打开文件操作外,QFile还有复制文件、删除文件等功能。
  • QFileInfo:用于提取文件的信息,包括路径、文件名、后缀等。
  • QDir:用于提取目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和 文件,文件重命名等操作。
  • QTemporaryDir和QTemporaryFile:用于创建临时目录和临时文件。
  • QFileSystemWatcher:文件和目录监听类,监听目录下文件的添加、删除等变化,监听文 件修改变化。
这些类基本涵盖了文件操作需要的主要功能,有些功能还在某些类里重复出现,例如QFile 和QDir都具有删除文件、判断文件是否存在的功能。

2 实例概述

2.1 实例功能

实例samp7_3演示前述各种目录与文件操作类的主要功能,图7-3是实例运行时的窗口。窗 口左侧是一个QToolBox组件,分为6组,每一组是一个或两个类的功能演示,在每个组里放置一 些QPushButton按钮,每个按钮主要调用类的某个函数,按钮的标题就是使用的函数的名称。
窗口右侧是显示区,可以选择一个目录、一个文件,然后左侧的功能基本上都是对选择的目 录或文件进行操作,右下方是一个QPlainTextEdit组件,用于显示信息。

2.2 信号发射者信息的获取

每个按钮一般用函数名称作为标题,例如“QFileInfo类”分组里的按钮"baseName()”是要演示QFileInfo的baseName()函数。另外,将Qt帮助文件里的这个函数的基本描述文字复制作为 按钮的ToolTip文字,例如"baseName()"按钮的ToolTip属是“Returns the base name of the file  without the path”。
图7-3 实例samp7_3运行时窗口
在按钮被单击时,先显示按钮的标题和ToolTip信息,以便明显地知道按钮演示的功能。例 如,"baseName()”按钮的clicked()槽函数代码如下:
void Dialog::on_pushButton_30_clicked()
{//QFileInfo.basename()QPushButton *btn = (QPushButton*) sender();ui->plainTextEdit->appendPlainText(btn->text());ui->plainTextEdit->appendPlainText(btn->toolTip());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.baseName();ui->plainTextEdit->appendPlainText(str+"\n");
}

     代码的前3行是用于获取按钮对象,并显示按钮的text和toolTip文字。

        这里用到了QObject::sender()函数,该函数用于在槽函数里获取发射信号的对象。因为这个函数是按钮的clicked()信号的槽函数,所以,sender()获取的信号发射对象就是这个按钮。然后将此对象转换为QPushButton类型变量btn,就可以访问btn的text()和toolTip()函数了。

        这种方法的优点是没有出现对象的ObjectName,这3行代码可以在任何一个按钮的clicked()信号槽函数里出现。如果是直接用按钮的ObjectName,则每个按钮里的代码里需要修改名称。本实例有几十个按钮,工作量很大,也容易遗漏了修改名称。

        对上面的代码还可以进一步优化,因为每个按钮的槽函数里都要重复这3行代码,将其编写为一个函数,然后在按钮的响应代码里调用。优化后的代码如下:

void Dialog::on_pushButton_30_clicked()
{//QFileInfo.basename()showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.baseName();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::showBtnInfo(QObject *btn)
{ //显示btn的信息QPushButton *theBtn =static_cast<QPushButton*>(btn);ui->plainTextEdit->appendPlainText(theBtn->text());ui->plainTextEdit->appendPlainText(theBtn->toolTip()+"\n");
}
在主窗口类中定义一个私有函数showBtnInfo(),接收QObject *btn对象作为输入参数,将 QObject对象转换为QPushButton对象,然后显示按钮的text和toolTip。
在按钮的响应代码里只需用一行语句调用showBtnInfo()函数,并将sender()作为参数传递。
本实例有几十个按钮,每个按钮的响应代码的第一行都是showBtnInfo(sender()),这样可以大 大简化代码。

3 QCoreApplication类

QCoreApplication是为无GUI应用提供事件循环的类,是所有应用程序类的基类,其子类 QGuiApplication为有GUI界面的应用程序提供流控制和主要的设定,QGuiApplication的子类 QApplication为基于QWidget的应用程序提供支持,包括界面的初始化等。
创建的Qt Widget Application都是基于QApplication的,在main()函数里可以看到QApplication 的应用。
QCoreApplication提供了一些有用的静态函数,可以获取应用程序的名称、启动路径等信息, 几个函数的名称和功能见表7-4(省略了函数参数中的const关键字) 。

4 QFile类

前面使用QFile类进行文件的操作,应用了QFile::open()函数。除了打开文件提供读写操作 外,QFile还有一些静态函数和成员函数用于文件操作。表7-5是QFile的一些静态函数(省略了 函数参数中的const关键字)。
静态函数是无需创建QFile类对象实例就可以调用的函数,例如使用静态函数exists()判断一 个文件是否存在的代码如下:
void Dialog::on_pushButton_51_clicked()
{showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件bool the=QFile::exists(sous);if(the)ui->plainTextEdit->appendPlainText(+"true \n");elseui->plainTextEdit->appendPlainText(+"false \n");
}
QFile还提供了对应的成员函数,见表7-6(省略了函数参数中的const关键字)。
创建QFile对象时可以在构造函数里指定文件名,也可以用setFileName()指定文件,但是文 件打开后不能再调用setFileName()函数。指定的文件作为QFile对象的当前文件,然后成员函数 copy()、rename()等都是基于当前文件的操作。

5 QFilelnfo类

QFileInfo类的接口函数提供文件的各种信息。QFileInfo对象创建时可以指定一个文件名作为 当前文件,也可以用setFile()函数指定一个文件作为当前文件。
QFileInfo常见接口函数和功能见表7-7。除了一个静态函数exists()之外,其他都是公共接口 函数,接口函数的操作都是针对当前文件(省略了函数参数中的const关键字)。
QFileInfo提供的这些函数可以提取文件的信息,包括目录名、文件基名(不带后缀)、文件 后缀等,利用这些函数可以实现灵活的文件操作。例如,下面的代码是利用QFile::rename()函数和 QFileInfo的一些功能实现文件重命名功能的代码,其中就用到了提取路径、提取文件基名的功能。
void Dialog::on_pushButton_50_clicked()
{//QFile::rename()showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件QFileInfo   fileInfo(sous);//源文件信息QString newFile=fileInfo.path()+"/"+fileInfo.baseName()+".XYZ"; //更改文件后缀为".XYZ"QFile::rename(sous,newFile); //重命名文件ui->plainTextEdit->appendPlainText("源文件:"+sous);ui->plainTextEdit->appendPlainText("重命名为:"+newFile+"\n");
}
表7-7中的函数的使用方法和执行效果不再详细列举和说明,运行实例samp7_3观察执行结 果,可参考Qt帮助文件或samp7_3的源程序看函数使用方法。

6 QDir类

QDir是进行目录操作的类,在创建QDir对象时传递一个目录字符串作为当前目录,然后QDir 函数就可以针对当前目录或目录下的文件进行操作。表7一8是QDir的一些静态函数(省略了函数 参数中的const关键字)。
在使用QFileDialog选择打开一个文件或目录时需要传递一个初始目录,这个时候就可以使用 QDir::currentpath()获取应用程序当前目录作为初始目录,前面一些实例程序的代码中己经用到过 这个功能。
表7-9是QDir的一些公共接口函数(省略了函数参数中的const关键字)。
获取目录下的目录或文件列表的函数entryList()需要传递QDir::Filter枚举类型的参数以获取 不同的结果,QDir::Filter枚举类型的常用取值如下。
  • QDir::AllDirs:列出所有目录名。
  • QDir::Files:列出所有文件。
  • QDir::Drives:列出所有盘符(Unix系统下无效)。
  • QDir::NoDotAndDotDot:不列出特殊的符号,如"."和".."。
  • QDir::AllEntries:列出目录下所有项目。
列出所有子目录的程序如下:
void Dialog::on_pushButton_11_clicked()
{//列出子目录showBtnInfo(sender());QDir    dir(ui->editDir->text());QStringList strList=dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);ui->plainTextEdit->appendPlainText("所选目录下的所有目录:");for(int i=0;i<strList.count();i++)ui->plainTextEdit->appendPlainText(strList.at(i));ui->plainTextEdit->appendPlainText("\n");
}

 列出一个目录下所有文件的程序如下:

void Dialog::on_pushButton_17_clicked()
{//列出所有文件showBtnInfo(sender());QDir    dir(ui->editDir->text());QStringList strList=dir.entryList(QDir::Files);ui->plainTextEdit->appendPlainText("所选目录下的所有文件:");for(int i=0;i<strList.count();i++)ui->plainTextEdit->appendPlainText(strList.at(i));ui->plainTextEdit->appendPlainText("\n");
}

7 QTemporaryDir和QTemporaryFiIe

QTemporaryDir是用于创建、删除临时目录的类,其主要函数见表7-10。
在系统临时目录,即QDir::tempPath目录下创建一个临时目录,临时目录名称以QCoreApplication:: applicationName()为前缀,后加6个字符。临时目录可以设置为使用完后自动删除,即临时目录变 量删除时,临时目录也删除。
QTemporaryFile是用于创建临时文件的类,临时文件保存在系统临时目录下。临时文件以 QCoreApplication::applicationName()作为文件名,以“xxxxxx”6个随机数字作为文件后缀。将 QTemporaryFile::
setAutoRemove()函数设置为是否自动删除临时文件QTemporaryFile::
open()函数 用于打开临时文件,只有打开临时文件,才实际创建了此文件。

8 QFiIeSystemWatcher类

QFileSystemWatcher是对目录和文件进行监听的类。把某些目录或文件添加到QFileSystem Watcher对象的监听列表后,当目录下发生文件新建、删除等操作时会发射directoryChanged()信号, 当监听的文件发生修改、重命名等操作时,会发射fileChanged()信号。所以,这个类在进行目录 或文件监听时起作用。
QFileSystemWatcher的主要接口函数见表7-11(省略了函数参数中的const关键字)。
QFileSystemWatcher有两个信号,分别是目录变化和文件变化时发射的信号。
void QFileSystemWatcher::directoryChanged(const QString &path)
void QFileSystemWatcher::fileChanged(const QString &path)
图7-4是实例中测试QFileSystemWatcher的界面。首先打开一个目录和一个文件,单击 "addPath()开始监听”按钮将文件和目录都添加到监听列表,并且将信号与槽函数关联起来。然后在 目录下复制某个文件,会发射directoryChanged()信号,重命名所监听的文件后会发射fileChanged() 信号,如图7-4所示的运行结果。
图7-4测试QFileSystemWatcher的运行界面
为了测试QFileSystemWatcher的功能,在主窗口类中定义了QFileSystemWatcher类型的变量 和两个信号的槽函数,定义如下:
private:QFileSystemWatcher  fileWatcher;
public slots:void on_directoryChanged(const QString path);void on_fileChanged(const QString path);

 两个槽函数仅是显示传递的参数,并显示提示文字,其代码如下:

void Dialog::on_directoryChanged(const QString path)
{ //directoryChanged()信号的槽函数ui->plainTextEdit->appendPlainText(path);ui->plainTextEdit->appendPlainText("目录发生了变化\n");
}void Dialog::on_fileChanged(const QString path)
{//fileChanged()信号的槽函数ui->plainTextEdit->appendPlainText(path);ui->plainTextEdit->appendPlainText("文件发生了变化\n");
}
图7-4中QFileSystemWatcher分组里“addPath()开始监听"和
"removePath()停止监听"两个 按钮的代码如下:
void Dialog::on_pushButton_46_clicked()
{//开始监听,addPath()showBtnInfo(sender());ui->plainTextEdit->appendPlainText("监听目录:"+ui->editDir->text()+"\n");fileWatcher.addPath(ui->editDir->text());//添加监听目录fileWatcher.addPath(ui->editFile->text());//添加监听文件QObject::connect(&fileWatcher,&QFileSystemWatcher::directoryChanged,this,&Dialog::on_directoryChanged); //directoryChangedQObject::connect(&fileWatcher,&QFileSystemWatcher::fileChanged,this,&Dialog::on_fileChanged); //fileChangedthis,&Dialog::on_fileChanged); //fileChanged
}void Dialog::on_pushButton_47_clicked()
{//停止监听,removePath()showBtnInfo(sender());ui->plainTextEdit->appendPlainText("停止监听目录:"+ui->editDir->text()+"\n");fileWatcher.removePath(ui->editDir->text());//fileWatcher.removePath(ui->editFile->text());//QObject::disconnect(&fileWatcher,&QFileSystemWatcher::directoryChanged,this,&Dialog::on_directoryChanged); //directoryChangedQObject::disconnect(&fileWatcher,&QFileSystemWatcher::fileChanged,this,&Dialog::on_fileChanged); //fileChanged
}

       采用addPath()函数添加目录和文件后,将信号和槽函数关联起来,开始监听。

        停止监听时,用removePath()函数移除监听的目录和文件,并用disconnect()解除信号与槽的关联。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存管理(mmu)/内存分配原理/多级页表

1.为什么要做内存管理&#xff1f; 随着进程对内存需求的扩大&#xff0c;和同时调度的进程增加&#xff0c;内存是比较瓶颈的资源&#xff0c;如何更好的高效的利于存储资源是一个重要问题。 这个内存管理的需求也是慢慢发展而来&#xff0c;早期总线上的master是直接使用物…

Oracle篇—分区索引的重建和管理(第三篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

ES的一些名称和概念总结

概念 先看看ElasticSearch的整体架构&#xff1a; 一个 ES Index 在集群模式下&#xff0c;有多个 Node &#xff08;节点&#xff09;组成。每个节点就是 ES 的Instance (实例)。每个节点上会有多个 shard &#xff08;分片&#xff09;&#xff0c; P1 P2 是主分片, R1 R2…

达梦数据库——记录一次离谱的登录失败报错

好久没更新了哇 前面有整理过一些常见的数据库登录失败问题哈&#xff0c;今天记录一个遇到概率比较小&#xff0c;但碰上了一般不太容易找到原因的登录失败问题。 今天给客户同时初始化了三台服务器数据库&#xff0c;惟独这一台死活登不进去&#xff0c;满脑子问号&#xf…

【论文解读】Object Goal Navigation usingGoal-Oriented Semantic Exploration

论文&#xff1a;https://devendrachaplot.github.io/papers/semantic-exploration.pdf 代码&#xff1a;https://github.com/devendrachaplot/Object-Goal-Navigation 项目&#xff1a; Object Goal Navigation using Goal-Oriented Semantic Exploration example&#xff1…

2、鼠标事件、键盘事件、浏览器事件、监听事件、冒泡事件、默认事件、属性操作

一、鼠标事件 1、单击事件&#xff1a;onclick <body><header id"head">我是头部标签</header> </body> <script> var head document.getElementById("head")head.onclick function () {console.log("我是鼠标单击…

金蝶云星空--写插件不重启IIS热更新简单配置指南

云星空7.5版本&#xff0c;以简单方式配置并测试了热更新的实现方式可行&#xff0c;操作如下&#xff08;7.5外版本没试过&#xff0c;大家可试下&#xff09;&#xff1a; 1、打开WebSite\App_Data\Common.config&#xff0c;修改appSettings&#xff0c;设置IsEnablePlugIn…

go slice 扩容实现

基于 Go 1.19。 go 的切片我们都知道可以自动地进行扩容&#xff0c;具体来说就是在切片的容量容纳不下新的元素的时候&#xff0c; 底层会帮我们为切片的底层数组分配更大的内存空间&#xff0c;然后把旧的切片的底层数组指针指向新的内存中&#xff1a; 目前网上一些关于扩容…

redis源码之:clion搭建cluster环境

cluster集群通常每个node节点都是一主N从的模式&#xff0c;此处为简化环境搭建&#xff0c;所有node节点均只有一个主节点。 在clion环境中&#xff0c;为方便debug&#xff0c;需要通过配置多个cmake application实现redis-server、redis-cli等源码debug模式启动。 一、配置…

费曼学习法 - 理工科的学习利器

费曼学习法是以物理学家理查德费曼&#xff08;Richard Feynman&#xff09;命名的一种高效的学习方法。它旨在帮助你深入理解复杂概念&#xff0c;并能够用简单的语言解释它们。费曼学习法是一个学习框架&#xff0c;能够帮你对给定主题进行深入理解&#xff0c;包含以下4个简…

HTML-表单

表单 概念&#xff1a;一个包含交互的区域&#xff0c;用于收集用户提供的数据。 1.基本结构 示例代码&#xff1a; <form action"https://www.baidu.com/s" target"_blank" method"get"><input type"text" name"wd&q…

完成NAT实验

实验要求&#xff1a; 步骤一&#xff1a;配置vlan vlan b 2 3 interface GigabitEthernet 0/0/2 port link-type access port default vlan 2 interface GigabitEthernet 0/0/3 port link-type access port default vlan 3 interface GigabitEthernet 0/0/1 port link-type…

【PyTorch】使用PyTorch创建卷积神经网络并在CIFAR-10数据集上进行分类

前言 在深度学习的世界中&#xff0c;图像分类任务是一个经典的问题&#xff0c;它涉及到识别给定图像中的对象类别。CIFAR-10数据集是一个常用的基准数据集&#xff0c;包含了10个类别的60000张32x32彩色图像。在本博客中&#xff0c;我们将探讨如何使用PyTorch框架创建一个简…

C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码

杨辉 Blaise Pascal 这是某些程序员看完会哭的代码。 杨辉三角形&#xff08;Yanghui Triangle&#xff09;&#xff0c;是一种序列数值的三角形几何排列&#xff0c;最早出现于南宋数学家杨辉1261年所著的《详解九章算法》一书。 欧洲学者&#xff0c;最先由帕斯卡&#x…

Windows打开IE浏览器命令最简单的方法

问题场景&#xff1a; 许多插件或特定版本的系统需要使用ie浏览器来访问&#xff0c;window默认的ie浏览器是被禁用的如何快速打开ie浏览器解决问题 目录 问题场景&#xff1a; 测试环境&#xff1a; 检查环境是否支持&#xff1a; 问题解决&#xff1a; 方法一 方法二 方法…

03 SB实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

hex 尽然可以 设置透明度,透明度参数对比图 已解决

还不知道CSS Color Module Level 4标准早在2014年就推出8位hex和4位hex来支持设置alpha值&#xff0c;以实现hex和rgba的互转。这个办法可比6位HEX转RGBA简洁多了&#xff0c;先来简单解释一下&#xff1a; 8位hex是在6位hex基础上加后两位来表示alpha值&#xff0c;00表示完全…

Hadoop-MapReduce-MRAppMaster启动篇

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在上一篇<Hadoop-MapReduce-源码跟读-客户端篇>中已经将到&#xff1a;作业提交到ResourceManager&#xff0c;那…

数据结构——树的合集

目录 文章目录 前言 一.树的表达方式 1.树的概念 2.树的结点 3.树的存储结构 01.双亲表示法 顺序表示形式 优缺点说明 02.孩子表示法 03.孩子兄弟表示法 04.非类存储代码演示 二.二叉树 1.树的特点 2.二叉树 01.定义 02.二叉树的性质 03.满二叉树 04.完全二叉树…

uniapp封装公共的方法或者数据请求方法

仅供自己参考&#xff0c;不是每个页面都用到这个方法&#xff0c;所以我直接在用到的页面引用该公用方法&#xff1a; 1、新建一个util.js文件 export const address function(options){return new Promise((resolve,reject)>{uni.request({url:"https://x.cxniu.…