qt - 文件
迪丽瓦拉
2025-05-28 06:00:13
0

qt - 文件

  • qt-文件操作
    • 文件对话框
    • 字体对话框
    • 输入对话框 -- 字符串\数字
    • QMessageBox 消息对话框
    • 进度对话框
    • 文本文件
    • 二进制文件
    • 文件操作实例
    • 文件监视/过滤
    • 文件操作进阶
      • QTextStream
      • QDataStream
        • 进阶思考
      • QBuffer

qt-文件操作

文件读写、创建、删除、重命名、拷贝
可操作:文本文件二进制文件

文件对话框

#include 
#include 
#include /*静态数据成员:类的一部分,为类的所有实例共享,处在静态区类名::静态成员访问非静态数据成员:实例的一部分,类的每个实例都有一份拷贝,处在动态区静态函数成员与非静态函数成员,都为类所有,实例对象不存在函数的拷贝静态函数成员:类名::方法 或者 实例对象.方法编译器不向函数传递this指针,不识别实例对象个体,经常用来操作静态数据成员(要访问类的非静态成员可以通过对象来实现)非静态函数成员:实例对象.方法 或者 实例对象->方法调用时编译器向函数传递this指针
*/// 使用静态成员函数的方法调用
QString filename=QFileDialog::getOpenFileName(this,"open file","f:\\",tr("images(*.png *.jpg)")); // tr是字体兼容性的问题
qDebug()<

字体对话框

#include 
#include 
#include bool ok; // 标志是否选择一个字体
QFont font=QFontDialog::getFont(&ok,this); // 返回一个字体if (ok)
{ui->FontButton->setFont(font);
}
else
{qDebug()<<"not font be choiced!";
}

输入对话框 – 字符串\数字

void MainWindow::on_InputButton_clicked()
{bool flag; // 是否有输入// QLineEdit:: 显示的模式 // 关键参数是LineEdit::Normal lineEidt::password// password 默认提示字符QString input=QInputDialog::getText(this,"输入对话框","请输入用户名",QLineEdit::Normal,"password",&flag);if (flag){qDebug()<qDebug()<

QMessageBox 消息对话框

// 问题对话框
int ret=QMessageBox::question(this,"question", // 对话框的标题"ues Qt T or F", // 对话框的内容QMessageBox::Yes, // 可选择的模式QMessageBox::No);
if (ret==QMessageBox::yes)
{qDebug()<<"yes";
}// 提示对话框
QMessageBox::information(this,"notice","best to ues qt",QMessageBox::Ok);//警告对话框
QMessageBox::warning(this,"warning","warning...",QMessageBox::Ok);// 关于对话框...

进度对话框

#include // 静态成员函数 可以利用 类名::静态成员函数
// 非静态成员函数 可以利用 类名 对象的方式创建
/*静态数据成员:类的一部分,为类的所有实例共享,处在静态区类名::静态成员访问非静态数据成员:实例的一部分,类的每个实例都有一份拷贝,处在动态区静态函数成员与非静态函数成员,都为类所有,实例对象不存在函数的拷贝静态函数成员:类名::方法 或者 实例对象.方法编译器不向函数传递this指针,不识别实例对象个体,经常用来操作静态数据成员(要访问类的非静态成员可以通过对象来实现)非静态函数成员:实例对象.方法 或者 实例对象->方法调用时编译器向函数传递this指针
*/// 该类没有静态成员函数,所以只能通过创建对象来实现// 堆中 全局,不释放
// 由于没有delete 加上对象树的概念,会一直消耗内存
//    QProgressDialog *prodlg=new QProgressDialog(this);// 栈中 局部,释放
QProgressDialog prodlg("copy progress","stop",0,50000,this);// 设置模态
prodlg.setWindowModality(Qt::WindowModal);
prodlg.setWindowTitle("copy file");
prodlg.show();for (int i=0;i<50000;i++)
{prodlg.setValue(i);// 类似并发 多线程 强制每隔一段时间还有没有其他时间没做完// copy的同时 检测还有没有其他的事情要做QCoreApplication::processEvents();if (prodlg.wasCanceled()) // 当点击取消的时候{qDebug()<<"stop copy...";
//            break;return ;}prodlg.setValue(50000);}
qDebug()<<"copy done...";

文本文件

#include 
#include 
#include int main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建QFile对象,同时指定要操作的文件// 注意这个文件(在使用相对路径的时候)会与可执行文件exe处于同一个路径文件夹下QFile file("./demo.txt");if (!file.open(QIODevice::WriteOnly|QIODevice::Text)){qDebug()<<"文件打开失败"; // 相当于cout,qDebug还有更高级的用法}// 向文件中写入字符串file.write("ex\n");file.write("ex2\n");//关闭文件file.close();//重新打开文件,对文件进行读操作if (!file.open(QIODevice::ReadOnly|QIODevice::Text)){qDebug()<<"文件打开失败";}// 每次都读取一行// 创建一个字符串(字符串数组)char* str=new char[100];// 每次从文件中读取一行数据或读取最多maxSize-1个字节,存储到data中// 返回读取到的字节数qint64 readNum=file.readLine(str,100);// 当读取出现错误 (返回为-1)或者读取到字符数为0时,结束读取while ((readNum!=0)&&(readNum!=-1)){qDebug()<

二进制文件

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 指定要写入文件的数据qint32 nums[5]={1,2,3,4,5};// 写入文件之前,将数据转换成字节数组QByteArray byteArr;byteArr .resize(sizeof(nums));for (int i=0;i<5;i++){// 借助指针,将每个整数拷贝到字节数组中memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32));}// 将byteArr 字节数组存储到文件中QFile file("./demo_byte.dat");file.open(QIODevice::WriteOnly);file.write(byteArr);file.close();// 再次打开文件,读取二进制数据file.open(QIODevice::ReadOnly);QByteArray resArr=file.readAll();qDebug()<<"resArr:"<qDebug()<<*(qint32*)data;data+=sizeof(qint32);}return 0;
}

文件操作实例

#include 
#include 
#include 
#include /* 文件读写  */
QString fileName=QFileDialog::getOpenFileName(this,"打开文件","./"); // 可以是相对路径// 显示文件名
ui->lineEdit->setText(fileName);//打开文件
QFile file(fileName);
file.open(QIODevice::ReadOnly); // 只读方式// 读取全部内容
QByteArray array=file.readAll(); // read(size)读取指定个字节大小
ui->textEdit->setText(array); // QByteArray -> QString 隐式转换// 判断是否到文件末尾
ui->textEdit->clear();
file.seek(0);
while (!file.atEnd())
{QByteArray lineArray=file.readLine();ui->textEdit->append(lineArray);
}file.close();file.open(QIODevice::Append);
file.write("\nhello vs\n"); // 这种才是正确的写法
file.write("hello vs code\n");
file.close();/* 文件属性 */
QFile file2("./test.txt");
QFileInfo file2_info(file2); // 文件信息
qDebug()<0x060000qDebug()<

文件监视/过滤

private slots:void showDirMessage(const QString &path); // 传递一个路径,引用方式,且不希望被修改private:Ui::Widget *ui;QFileSystemWatcher monitor;#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include  // 文件监视器Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QDir mydir(QDir::currentPath());qDebug()<listWidget->addItem(mydir2.absolutePath());ui->listWidget->addItems(mydir2.entryList());// 设置文件类型过滤器mydir2.setNameFilters(QStringList("*.cpp"));// 文件监视器 判断是否有改动:删除、改动、增加mydir2.mkdir("monitorDir");connect(&monitor,&QFileSystemWatcher::directoryChanged,this,&Widget::showDirMessage); // 监视文件夹变化connect(&monitor,&QFileSystemWatcher::fileChanged,this,&Widget::showDirMessage); // 监视文件变化monitor.addPath("f:/qt-learning/exp10/monitorDir"); // 监视文件夹monitor.addPath("f:/qt-learning/exp10/monitorDir/test.txt"); // 监视文件}Widget::~Widget()
{delete ui;
}void Widget::showDirMessage(const QString &path)
{if (path=="f:/qt-learning/exp10/monitorDir"){ui->listWidget->addItem("f:/qt-learning/exp10/monitorDir 目录发生改变");}else if (path=="f:/qt-learning/exp10/monitorDir/test.txt"){ui->listWidget->addItem("f:/qt-learning/exp10/monitorDir/test.txt 文件发生改变");}
}

文件操作进阶

QTextStream

/*QTextStream 类 提供了很多读写文件相关方法
*/
#include 
#include 
#include 
#include int main(int argc,char* argv[]){// 创建QFile对象QFile file("./demo2.txt");// 对文件进行写操作if (!file.open(QIODevice::WriteOnly|QIODevice::Text)){qDebug()<<"文件打开失败";}QTextStream out(&file); // 将文件转换为文本流的方式进行存储//QTextStream类重载了运算符<< >>out<<(QString)"ex1\n"<<(QString)"ex2";file.close();// 读文本if (!file.open(QIODevice::ReadOnly|QIODevice::Text)){qDebug()<<"文件打开失败";}QTextStream in(&file);while (!in.atEnd()){QString str;// 从文件中读取一个字符串in>>str;qDebug()<

例子2

注意readline \n 的问题没有解决???

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 
#include 
#include Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QString fileName=QFileDialog::getOpenFileName(this,"打开文件","./");ui->lineEdit->setText(fileName);QFile file(fileName);file.open(QIODevice::ReadOnly);// 创建文本流// 将一个文件关联一个流,将文件转换为流// 操作这个流 等于 操作这个文件QTextStream textStream(&file);textStream.setEncoding(QStringConverter::Utf8); // 设置流的编码方式QByteArray streamArray;while (!textStream.atEnd()){streamArray+=textStream.readLine().toUtf8();}ui->textEdit->setText(streamArray);file.close();
}Widget::~Widget()
{delete ui;
}

QDataStream

https://blog.csdn.net/qq_38832450/article/details/102587454

例子1

QFile file2("./test2.dat");
file2.open(QIODevice::WriteOnly);// 将文件绑定到数据流上
QDataStream dataInStream(&file2);
dataInStream<>str1>>str2>>num;
qDebug()<>str1>>num; // ERROR
//    qDebug()<
  • QDataStream 与QByteArray

https://blog.csdn.net/qq_40206060/article/details/111614662
借助QDataStream 实现数据与QByteArray的关联,输入与输出

伪代码

/* 数据流操作音视频 */
// 伪代码
QImage image("path");
QByteArray imageArray; // 相当于内存区域,内存块
// 通过流的方式,对内存块进行读写操作
QDataStream imageStream(&imageArray,QIODevice::ReadWrite); // 将数据流绑定到内存块
// 通过数据流的方式,将数据保存到内存块中
imageStream<
  • QDataStream 与QBuffer
    https://blog.csdn.net/qq_44519484/article/details/108010891

进阶思考

QStringQDataStream 后会增加一些头数据,比如文本的长度

QFile file("./7.信号和槽.wmv");
QFileInfo info(file.fileName());
qDebug()<>filename;
qDebug()<>filename2;
qDebug()<

QBuffer

  • QBuffer与QByteArray
    https://blog.csdn.net/qq_44519484/article/details/108010891

QBuffer 是操作QByteArray的接口类
QDataStream 是一个操作QBuffer的接口类

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...