文件读写、创建、删除、重命名、拷贝
可操作:文本文件、二进制文件
#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()<
// 问题对话框
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 类 提供了很多读写文件相关方法
*/
#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;
}
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()<
https://blog.csdn.net/qq_40206060/article/details/111614662
借助QDataStream 实现数据与QByteArray的关联,输入与输出
伪代码
/* 数据流操作音视频 */
// 伪代码
QImage image("path");
QByteArray imageArray; // 相当于内存区域,内存块
// 通过流的方式,对内存块进行读写操作
QDataStream imageStream(&imageArray,QIODevice::ReadWrite); // 将数据流绑定到内存块
// 通过数据流的方式,将数据保存到内存块中
imageStream<
QString
转QDataStream
后会增加一些头数据,比如文本的长度
QFile file("./7.信号和槽.wmv");
QFileInfo info(file.fileName());
qDebug()<>filename;
qDebug()<>filename2;
qDebug()<
QBuffer 是操作QByteArray的接口类
QDataStream 是一个操作QBuffer的接口类
上一篇:STL初识