目录
界面实现效果
代码思路:
1.基于按钮或者菜单栏的槽里去写逻辑函数(我这边用的是菜单栏),ui实现的进度条
2.创建两个对象,一个是源文件,一个是目标文件分别用getopenfileName、getsavefileName函数即可。
3.利用QFile类去实现对两个文件的创建,因为QFile中可以获取文件的属性已经读写等。
4.循环的去读取源文件中的数据,然后写入目标文件
主要使用类:
在Qt框架中,QFile
类是一个用于读取和写入文件的高级IO类。它提供了读、写文件,以及文件操作(如移动、复制、删除)等功能的接口,支持文本和二进制模式。下面是一些基本使用方法和概念:
打开和关闭文件
-
打开文件:使用
Cppopen(OpenMode mode)
方法打开文件,其中OpenMode
是一个枚举类型,定义了多种打开模式,如QIODevice::ReadOnly
、QIODevice::WriteOnly
、QIODevice::ReadWrite
等。1QFile file("example.txt"); 2if(file.open(QIODevice::ReadWrite | QIODevice::Text)) { 3 // 文件打开成功 4} else { 5 // 处理错误 6}
-
关闭文件:通常情况下,
QFile
会在析构函数中自动关闭,但也可以显式调用close()
方法。
读取文件
-
读取文本:可以使用
CppQTextStream
来读取文本文件。1QTextStream in(&file); 2QString line; 3while(!in.atEnd()) { 4 line = in.readLine(); 5 qDebug() << line; 6}
-
读取二进制数据:直接使用
CppQFile
的读取方法,如readAll()
、read(qint64 maxSize)
等。1QByteArray data = file.readAll();
写入文件
-
写入文本:同样使用
CppQTextStream
。1QTextStream out(&file); 2out << "Hello, Qt!" << endl;
-
写入二进制数据:使用
Cppwrite(const char *data, qint64 maxSize)
。1QByteArray byteArray = "Binary Data"; 2file.write(byteArray);
代码:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtWidgets>
#include <QString>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_action_triggered();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#define KB 1024
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//功能实现
void MainWindow::on_action_triggered()
{
QByteArray buf;//接收读取的数据,因为QByteArray可以自动开辟需要的空间
int num = 0;//进度条的赋值
ui->progressBar->setValue(num);
//打开文件
QString fileName1 = QFileDialog::getOpenFileName(this, tr("打开文件"),".",
tr("all (*.*)"));
//判错
if(fileName1.isEmpty())
{
ui->statusBar->showMessage("打开文件失败",0);
return;
}
//构造一个QFile对象
QFile file1(fileName1);
if(!file1.open(QIODevice::ReadOnly))
{
ui->statusBar->showMessage("打开文件失败",0);
return;
}
//接受打开文件大小
qint64 count = file1.size();
qint64 cursize = 0;
//保存文件接口
QString fileName2 = QFileDialog::getSaveFileName(this, tr("复制文件"),
"./test",
tr("all (*.*)"));
if(fileName2 == "")
{
return;
}
//构造第二个QFile对象
QFile file2(fileName2);
if(!file2.open(QIODevice::WriteOnly | QIODevice::Text))
{
ui->statusBar->showMessage("保存文件失败",0);
return;
}
else
{
//开始拷贝
while(!file1.atEnd())//判尾函数
{
buf = file1.read(KB);//接收
file2.write(buf);
cursize += buf.size();
num = 100*cursize/count;
ui->progressBar->setValue(num);
}
ui->statusBar->showMessage("复制为文件成功",0);
}
}