做网站需要许可证吗/承德seo
0、引言
我们知道 C 和 C++ 都提供了文件读写的类库,不过 Qt 也有一套自己的文件读写操作;本文主要介绍 Qt 中进行文件读写操作的类 —— QFile。
1、QFileDialog 文件对话框
一般的桌面应用程序,当我们想要打开一个文件时,通常会弹出一个文件对话框。在 Qt 中,文件对话框使用 QFileDialog 类实现。
QFileDialog 类允许用户遍历文件系统,以便选择一个或多个文件或目录。
最简单的创建 QFileDialog 的方法是使用静态函数:
fileName = QFileDialog::getOpenFileName(this,tr("Open Image"), "/home", tr("Image Files (*.png *.jpg *.bmp)"));
tr() 是 Qt 中的一个函数,用于将字符串标记为可翻译的字符串。这个函数的作用是在运行时,根据配置在 Qt Linguist 工具中的翻译,将输入字符串翻译成适当的语言。
这意味着,如果您的应用程序支持多种语言,并且在 Qt Linguist 工具中配置了相应的翻译,那么这些字符串将在运行时被翻译成用户选择的语言。
在上面的例子中,我们使用静态方法创建了一个模态 QFileDialog(什么是 模态对话框?)。该对话框初始显示 "/home" 目录中的内容,并显示与字符串 "Image files (*.png *.jpg *.bmp)" 中给出的模式匹配的文件。文件对话框的父窗口设置为 this,窗口标题设置为 "Open Image"。
如果你想要使用多个过滤器,请用 两个分号 分隔每一个过滤器。例如:
"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"
如果您想要不使用任何文件过滤器,请直接传递空字符串。或者传递
"All Files (*)"
(了解更多...)
在上面的例子中我们可以尝试使用 QFileDialog 选择一个文件并将 fileName 打印到单行文本框,最终实现效果类似于下图:
2、QFile
QFileDialog 只是帮助我们完成了获取文件的绝对路径(什么是 绝对路径(以 Windows 系统为例)?)的工作;接下来才是要进行文件读写的操作。在 Qt 中,文件读写通常与 QFile 类相关。
💬 有关 QFile 的用法,还请读者参考 QFile 的官方文档,这里笔者不再赘述。下面主要介绍 QFileDialog 类配合 QFile 类的使用案例:
2.1、QFile 读操作
以下代码展示了 QFileDialog 类配合 QFile 类打开并读取一张图片文件(我们在与 QPushButton::clicked 信号关联的槽函数中读取图片文件):
//点击“打开”按钮,弹出文件选择对话框
connect(ui->pushButton, &QPushButton::clicked, this, [=](){QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"), "/home" , tr("Image Files (*.png *.jpg *.bmp *.svg)"));//将路径放到 LineEdit 中ui->lineEdit->setText(fileName);//使用文件的绝对路径实例化 QFileQFile file(fileName);//只读模式打开文件file.open(QIODevice::ReadOnly);//全部读取QByteArray bytes = file.readAll();//生成 QImage 实例QImage image = QImage::fromData(bytes);//生成 QPixmap 实例并显示在 QLabel 控件上ui->label->setPixmap(QPixmap::fromImage(image));//关闭文件file.close();
});
使用 QFileDialog 配合 QFile,我们可以做到在运行时选择并读取图片文件:
此外,我们还可以尝试使用 QFileDialog 配合 QFile 打开文本文件,只需略微修改上面示例代码中的槽函数即可:
- 在 Linux(Ubuntu) 下,你可以使用如下命令创建文本文件:
touch filename.txt
- 创建完成后,在其中编辑一些字符,保存后就可以使用如下命令查看该文本文件的字符编码格式:
file filename.txt# 如果文本文件中只有英文字符,则编码格式为 ASCII; # 如果带有中文字符,则编码格式为 UTF-8 Unicode。
- 使用如下命令转换文本文件的字符编码格式(参考链接):
sudo iconv -f 'utf-8' -t 'gbk' filename.txt > GbkText.txt
//点击“打开”按钮,弹出文件选择对话框
connect(ui->pushButton, &QPushButton::clicked, this, [=](){QString fileName = QFileDialog::getOpenFileName(this,tr("Open Text File"), "/home" , tr("Text Files (*.txt)"));//将路径放到 LineEdit 中ui->lineEdit->setText(fileName);//使用文件的绝对路径实例化 QFileQFile file(fileName);//只读模式打开文件file.open(QIODevice::ReadOnly);//全部读取QByteArray bytes = file.readAll();//在 QLabel 文件上显示文本ui->label->setText(bytes);//关闭文件file.close();
});
需要注意的是,QLabel::SetText() 方法接受一个 QString 类型的参数,而在上面的示例代码中我们传递了一个字节数组作为参数。
巧合的是,QString 类提供了一个接受 QByteArray 类型的构造函数,这意味着这里会发生一次隐式转换将 QByteArray 类型转换为 QString 类型。不过,这个构造函数的转换将会使用 UTF-8 格式解码字符串。
这样的隐式转换可能会导致一些问题,特别是当你的文本文件不是 UTF-8 格式编码时:
![]()
两个文本文件内容一致,但 'GBK' 字符编码格式文件会显示乱码 为了避免这样的问题,我们可以尝试使用一些 Qt 中专门用于编码和解码文本的类,比如 QTextCodec(在 Qt 5.15 过后已经部分弃用)和 QStringConverter 类;或者使用流来读取文件(使用流的时候,默认情况下,QTextStream 假设文件以 UTF-8 编码;但这可以使用QTextStream::setEncoding() 来改变)。
2.2、QFile 写操作
除了读操作,我们还可以使用 QFileDialog 类配合 QFile 类打开并向文件中写入数据。下面是一个打开文本文件并向其中追加新的文本的示例,同样略微修改上面示例代码中的槽函数即可:
//点击“打开”按钮,弹出文件选择对话框
connect(ui->pushButton, &QPushButton::clicked, this, [=](){QString fileName = QFileDialog::getOpenFileName(this,tr("Open Text File"), "/home" , tr("Text Files (*.txt)"));//将路径放到 LineEdit 中ui->lineEdit->setText(fileName);//使用文件的绝对路径实例化 QFileQFile file(fileName);//以追加的模式打开文件file.open(QIODevice::Append);//写数据file.write("这是我写入的文本!\n");//关闭文件file.close();//重新以只读方式打开文件file.open(QIODevice::ReadOnly);QByteArray data;//当没有到达文件末尾时while(!file.atEnd()){//按行读取data += file.readLine();}ui->label->setText(data);//关闭文件file.close();
});
下面是运行效果:
3、QFileInfo 文件信息
QFileInfo 提供了文件在文件系统中的名称和位置(路径)、访问权限以及是目录还是符号链接等信息,还有文件的大小、最后修改/读取时间等信息。此外,QFileInfo 也可以用来获取关于 Qt 资源的信息。
QFileInfo 可以指向具有相对或绝对文件路径的文件。绝对文件路径以目录分隔符 "/" 开头(或在 Windows 上以驱动器规格开头)。相对文件名以目录名或文件名开头,并指定相对于当前工作目录的路径。绝对路径的一个例子是字符串 "/tmp/quartz"。相对路径可能看起来像 "src/fatlib"。可以使用函数 isRelative() 检查 QFileInfo 使用的是相对文件路径还是绝对文件路径。您可以调用 makeAbsolute() 函数将 QFileInfo 的相对路径转换为绝对路径。
⚠️ 注意:以冒号(:)开头的路径总是被认为是绝对路径,因为它们表示一个 QResource。
QFileInfo 处理的文件是在构造函数中设置的(或者后续使用 setFile() 设置)。使用 exists() 查看文件是否存在并使用 size() 获取其大小。
文件的类型通过 isFile()、isDir() 和 isSymLink() 获得。symLinkTarget() 函数提供了符号链接指向的文件的名称。
在 Unix(包括 macOS 和 iOS)上,该类中的属性获取器函数返回目标文件的时间和大小等属性,而不是符号链接的时间和大小等属性,这是因为 Unix 透明地处理符号链接。使用 QFile 打开符号链接可以有效地打开链接的目标。例如:
#ifdef Q_OS_UNIXQFileInfo info1("/home/bob/bin/untabify");
info1.isSymLink(); // returns true
info1.absoluteFilePath(); // returns "/home/bob/bin/untabify"
info1.size(); // returns 56201
info1.symLinkTarget(); // returns "/opt/pretty++/bin/untabify"QFileInfo info2(info1.symLinkTarget());
info2.isSymLink(); // returns false
info2.absoluteFilePath(); // returns "/opt/pretty++/bin/untabify"
info2.size(); // returns 56201#endif
在 Windows 上,快捷方式(.lnk 文件)目前被视为符号链接。与 Unix 系统一样,属性获取器返回目标文件的大小,而不是 .lnk 文件本身。此行为已被弃用,可能会在 Qt 的未来版本中删除,之后 .lnk 文件将被视为常规文件。
#ifdef Q_OS_WINQFileInfo info1("C:\\Users\\Bob\\untabify.lnk");
info1.isSymLink(); // returns true
info1.absoluteFilePath(); // returns "C:/Users/Bob/untabify.lnk"
info1.size(); // returns 63942
info1.symLinkTarget(); // returns "C:/Pretty++/untabify"QFileInfo info2(info1.symLinkTarget());
info2.isSymLink(); // returns false
info2.absoluteFilePath(); // returns "C:/Pretty++/untabify"
info2.size(); // returns 63942#endif
文件名称的元素可以使用 path() 和 fileName() 提取。fileName() 的部分可以用 baseName()、suffix() 或 completeSuffix() 提取。QFileInfo 对象到由 Qt 类创建的目录将不会有尾随文件分隔符。如果您希望在自己的文件信息对象中使用尾随分隔符,只需在构造函数或 setFile() 给出的文件名后附加一个。
文件的日期由 birthTime()、lastModified()、lastRead() 和 fileTime() 返回。通过 isReadable()、isWritable() 和 isExecutable() 获取文件的访问权限信息。文件的所有权可以从 owner()、ownerId()、group() 和 groupId() 中获得。您可以使用 permission() 函数在单个语句中检查文件的权限和所有权。
⚠️ 注意:在 NTFS 文件系统上,出于性能原因,默认情况下禁用所有权和权限检查。要启用它,包括以下行:
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
然后通过对 qt_ntfs_permission_lookup 加 1 和减 1 来打开和关闭权限检查。
qt_ntfs_permission_lookup++; //启用检查
qt_ntfs_permission_lookup--; //再次关闭检查
⚠️ 注意:由于这是一个非原子全局变量,所以只有在除主线程以外的任何线程启动之前或除主线程以外的每个线程结束之后,才可以对 qt_ntfs_permission_lookup 进行递增或递减操作。
下面是一个 QFileDialog 类配合 QFileInfo 类获取文件信息的代码示例,同样略微修改 2.1 小节示例代码中的槽函数即可:
//点击“打开”按钮,弹出文件选择对话框
connect(ui->pushButton, &QPushButton::clicked, this, [=](){QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"), "/home", tr("All Files (*)"));//将路径放到 LineEdit 中ui->lineEdit->setText(fileName);QFileInfo info(fileName);QString str = "path() = " + info.path() + "\n"+ "filePath() = " + info.filePath() + "\n"+ "fileName() = " + info.fileName() + "\n"+ "baseName() = " + info.baseName() + "\n"+ "suffix() = " + info.suffix() + "\n"+ "completeSuffix() = " + info.completeSuffix() + "\n"+ "birthTime() = " + info.birthTime().toString(); //toString()方法可指定日期输出格式ui->label->setText(str);
});
💬 在打印文件的日期信息时,可以指定输出的格式,比如:
info.birthTime().toString("yyyy/MM/dd hh:mm:ss"); // 2023/08/16 21:12:34
(参考 QDateTime 的 toString() 方法了解更多)
运行效果:
相关文章:

「Qt」文件读写操作
0、引言 我们知道 C 和 C 都提供了文件读写的类库,不过 Qt 也有一套自己的文件读写操作;本文主要介绍 Qt 中进行文件读写操作的类 —— QFile。 1、QFileDialog 文件对话框 一般的桌面应用程序,当我们想要打开一个文件时,通常会弹…...

0101前期准备-大数据学习
文章目录 1 前言2 配置VMware虚拟机2.1 设置主机名和固定IP2.2 本地系统与Linux系统配置主机名映射2.3 配置虚拟机之间用户的SSH免密互通2.4 安装JDK环境2.5 关闭防火墙和SELinux2.6 更新时区和同步时间2.7 保存虚拟机快照 结语 1 前言 我们从基础的hadoop开始学起,…...

TypeScript教程(四)基本运算符
一、运算符 TypeScript包含以下几种运算符: 1.算术运算符 2.逻辑运算符 3.关系运算符 4.按位运算符 5.赋值运算符 6.三元/条件运算符 7.字符串运算符 8.类型运算符 1.算术运算符 y5 运算符描述例子x 运算结果y 运算结果加法xy275-减法xy-235*乘法xy*2105…...

计算机网络的性能指标
计算机网络的性能指标 1. 速率 速率是指数据在网络中传送的速度,通常用比特率或数据率来表示,单位是b/s,或bit/s,即比特每秒,或者bps(bit per second)。 速率单位:1 Ybps 10^24 bps(尧), 1 Zbps 10^21…...

BBS项目day04 文章详情页、点赞点菜、评论功能
一、路由 from django.contrib import admin from django.urls import path, re_path from app01 import views from django.views.static import serve from django.conf import settingsurlpatterns [path(admin/, admin.site.urls),# 注册path(register/, views.register)…...

el-table分页后序号连续的两种方法
实现效果: 第一页排序到10,第二页的排序应从11开始 实现方法一: 在el-table的序号列中使用template定义 <el-table><el-table-columnmin-width"10%"label"序号"><template slot-scope"scope"…...

Nginx反向代理技巧
跨域 作为一个前端开发者来说不可避免的问题就是跨域,那什么是跨域呢? 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。浏览器的同源策略是指协议,域名…...

kafka--kafka的基本概念-副本概念replica
三、kafka的基本概念-副本概念replica Broker 表示实际的物理机器节点 Broker1中的绿色P1表示主分片Broker2中的蓝色P1表示副本分片,其余类似,就是主从的概念,如果一个Broker挂掉了,还有其它的节点来保证数据的完整性 P可以看做分…...

css伪元素实现li列表圆点相连+锚点跳转悬浮窗实现
实现效果: html代码: <div class"sidenav"><ul class"nav-text progressbar"><!-- data-target的值对应要跳转的模块的id --><li data-target"module1"><div class"text">锚点…...

IronPDF for .NET Crack
IronPDF for .NET Crack ronPDF现在将等待HTML元素加载后再进行渲染。 IronPDF现在将等待字体加载后再进行渲染。 添加了在绘制文本时指定旋转的功能。 添加了在保存为PDFA时指定自定义颜色配置文件的功能。 IronPDF for.NET允许开发人员在C#、F#和VB.NET for.NET Core和.NET F…...

【C++进阶】继承、多态的详解(多态篇)
【C进阶】继承、多态的详解(多态篇) 目录 【C进阶】继承、多态的详解(多态篇)多态的概念多态的定义及实现多态的构成条件(重点)虚函数虚函数的重写(覆盖、一种接口继承)C11 override…...

excel快速选择数据、选择性粘贴、冻结单元格
一、如何快速选择数据 在excel中,希望选择全部数据,通常使用鼠标选择数据然后往下拉,当数据很多时,也可单击单元格使用ctrl A选中全部数据,此外,具体介绍另一种方法。 操作:ctrl shift 方向…...

【数仓建设系列之一】什么是数据仓库?
一、什么是数据仓库? 数据仓库(Data Warehouse,简称DW)简单来讲,它是一个存储和管理大量结构化和非结构化数据的存储集合,它以主题为向导,通过整合来自不同数据源下的数据(比如各业务数据,日志文件数据等)…...

Vue2-配置脚手架、分析脚手架、render函数、ref属性、props配置项、mixin配置项、scoped样式、插件
🥔:总有一段付出了没有回报的日子 是在扎根 更多Vue知识请点击——Vue.js VUE2-Day6 配置脚手架脚手架结构render函数vue.js与vue.runtime.xxx.js的区别引入render函数为什么要引入残缺的vue呢? 脚手架默认配置ref属性props配置项传递数据接收数据注意点…...

VS2015项目中,MFC内存中调用DLL函数(VC6生成的示例DLL)
本例主要讲一下,用VC6如何生成DLL,用工具WinHex取得DLL全部内容,VC2015项目加载内存中的DLL函数,并调用函数的示例。 本例中的示例代码下载,点击可以下载 一、VC6.0生成示例DLL项目 1.新建项目,…...

人流目标跟踪pyqt界面_v5_deepsort
直接上效果图 代码仓库和视频演示b站视频006期: 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示: YOLOv5 DeepSORT介绍 YOLOv5 DeepSORT是一个结合了YOLOv5和DeepSORT算法的目标检测与多目标跟踪系统。让我为您详细解释一…...

angular 子组件ngOnChanges监听@input传入的输入属性
在进入主题之前,先了解一下angular的生命周期。 生命周期 钩子分类 指令与组件共有的钩子 ngOnChangesngOnInitngDoCheckngOnDestroy 组件特有的钩子 ngAfterContentInitngAfterContentCheckedngAfterViewInitngAfterViewChecked 生命周期钩子的作用及调用顺序 …...

移植PeerTalk开源库IOS的USB通信监听服务到QT生成的FFmpeg工程
1.添加生成的PeerTalk库 下图选中部分为FFmpeg依赖库 将USB通信服务的m与h文件添加到工程 因为OC文件使用了弱指针,所以要启用弱指针支持 因为FFmpeg拉流动用到本地网络,所以要在plist文件中启动本地网络使用 设置PeerTalk为嵌入模式 设置Runpath Search Paths为@executable_p…...

PHREEQC模型化学热力学理论和数据库.dat、各种模拟反应平衡反应模拟、化学动力模拟、反应迁移模拟
PHREEQC是一个用于计算多种低温水文地球化学反应的计算机软件,以离子缔合水模型为基础的PHREEQC能够(1)计算物质形成种类与饱和指数;(2)模拟地球化学反演过程;(3)计算批反…...

centos下使用jemalloc解决Mysql内存泄漏问题
参考: MySQL bug:https://bugs.mysql.com/bug.php?id83047&tdsourcetags_pcqq_aiomsg https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md (1)ptmalloc 是glibc的内存分配管理 (2)tcmalloc…...

【100天精通python】Day41:python网络爬虫开发_爬虫基础入门
目录 专栏导读 1网络爬虫概述 1.1 工作原理 1.2 应用场景 1.3 爬虫策略 1.4 爬虫的挑战 2 网络爬虫开发 2.1 通用的网络爬虫基本流程 2.2 网络爬虫的常用技术 2.3 网络爬虫常用的第三方库 3 简单爬虫示例 专栏导读 专栏订阅地址:https://blog.csdn.net/…...

开源和自研——机器人
双足机器人: MPC技术:封闭性非常高。没有开源方案可抄。 因为开源,不需要从0构建。 这也是前两年,国外一开源华为就遥遥领先。 射频芯片/射频天线:技术封闭。华为虽然做通信,但却没有攻破。 鸿蒙&#…...

【AIGC 讯飞星火 | 百度AI|ChatGPT| 】智能对比
AI智能对比 🍸 前言🍺 概念类对比🍵 讯飞🍵 百度AI🍵 chatGPT 🍹 功能类对比☕ 讯飞☕ 百度AI☕ chatGPT 🥃 可输入字数对比🥤 百度AI🥤 讯飞🥤 chatGPT &…...

Wazuh安装及使用
环境配置 官方网址Quickstart Wazuh documentation 可以选择Elastic Stack安装,也可以选择下载虚拟机(OVA)安装 这里展示虚拟机安装 下载好文档中提供的文件 虚拟机配置要求 在VM左上角 文件->打开->刚刚下载的.ova文件,…...

docker pull 设置代理 centos
On CentOS the configuration file for Docker is at: /etc/sysconfig/docker 用 root 权限打开 text editor sudo gedit 注意 加引号 Adding the below line helped me to get the Docker daemon working behind a proxy server: HTTP_PROXY“http://<proxy_host>:&…...

仪表板展示 | DataEase看中国:2023年中国电影市场分析
背景介绍 随着《消失的她》、《变形金刚:超能勇士崛起》、《蜘蛛侠:纵横宇宙》、《我爱你》等国内外影片的上映,2023年上半年的电影市场也接近尾声。据国家电影专资办初步统计,上半年全国城市院线票房达262亿元,已经超…...

在APP中如何嵌入小游戏?
APP内嵌游戏之所以能火爆,主要是因为互联网对流量的追求是无止境的,之前高速增长的红利期后,获取新的流量成为各大厂商的挑战,小游戏的引入,就是这个目的,为已有的产品赋能,抢占用户注意力和使用…...

神经网络基础-神经网络补充概念-02-逻辑回归
概念 逻辑回归是一种用于二分分类问题的统计学习方法,尽管名字中带有"回归"一词,但实际上它用于分类任务。逻辑回归的目标是根据输入特征来预测数据点属于某个类别的概率,然后将概率映射到一个离散的类别标签。 逻辑回归模型的核…...

DICOM图像的常用一些参数解析
医学图像DICOM医学影像文件格式详解 Dicom文件基本操作 DICOM图像参数? 像素:构成图片的小色点。图像每个维度的像素个数——该维度一共有多少个均匀分布的像素点。 分辨率(单位DPI):每英寸(Inch…...

Java虚拟机(JVM):虚拟机栈溢出
一、概念 Java虚拟机栈溢出(Java Virtual Machine Stack Overflow)是指在Java程序中,当线程调用的方法层级过深,导致栈空间溢出的情况。 Java虚拟机栈是每个线程私有的,用于存储方法的调用和局部变量的内存空间。每当…...