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

进阶思考

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

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的接口类

相关内容

热门资讯

通讯|布哈拉全城都知道中国放长...   新华社塔什干10月6日电 通讯|布哈拉全城都知道中国放长假了——探访中亚跨境旅游热  新华社记者...
奔县游|美食好物:小城烟火藏文...   眼下,以沉浸式、慢体验、近短途为特点的“奔县游”持续升温。地处江淮分水岭的安徽省来安县,立足半山...
专访丨约旦多措并举吸引中国游客... 新华社安曼10月6日电 专访|约旦多措并举吸引中国游客——访约旦旅游和文物大臣希贾津新华社记者何奕萍...
国庆别去外滩了,长宁才是隐藏款 国庆的上海,外滩是人山人海。但真正好逛的地方,不仅仅在最热闹的地界。长宁区延安西路1262号,上生·...
大渡河畔红色地标引游客 标题:赓续长征精神 奋进复兴征程|大渡河畔红色地标引游客国庆假期,各地游客来到位于四川省雅安市石棉县...
滇池东岸美食风物季丨10月6日... 秋日湖畔,音浪不息2026滇池东岸美食风物季持续火热10月6日滇池东岸将带来旷野歌者王金永的昆明专场...
从茶马古道到动车飞驰 松州古城... 四川在线记者王攀 川观新闻阿坝观察 刘文佳松潘县融媒体中心陈孙舟扬王小兰侯明磊10月5日早上8点,松...
从“面朝黄土”到奔赴“诗与远方... 新华社西安10月5日电(记者邹竞一、蔡馨逸)“等忙完这一阵,我就去北京,看天安门!”国庆假期,陕西西...
家国同框 | 佳节乡村游,我在... 朱明 摄家国同框 | 佳节乡村游,我在记录家国同框 | 佳节乡村游,我在记录家国同框 | 佳节乡村游...
双节无障碍文旅升温,多地景区探... 本报(chinatimes.net.cn)记者李氏琼 北京报道“您好,我们这里有免费提供的轮椅,请问...