重庆做网站优化,怎么建设免费小说网站,有什么免费建站网站,wordpress 出错一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位#xff08;自适应#xff09; 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类#xff0c;直接使用静态…一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位自适应 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类直接使用静态成员函数弹窗弹窗的结果选择文件的路径通过函数的返回值获取。 // 获得一个打开或保存的文件路径
// 参数1 父对象
// 参数2 即windowTitle属性界面标题
// 参数3 在哪个目录下打开默认值表示项目的工作目录
// 参数4 文件格式过滤器
// 返回值 选择的文件路径如果选择失败返回空字符
QString QFileDialog::getSaveFileName|getOpenFileName(QWidget * parent 0, const QString caption QString(), const QString dir QString(), const QString filter QString())[static]需要注意的是QFileDialog只是一个窗口类本身不具备任何IO能力。 2.QFileInfo 文件信息类 只需要创建出对象后通过各种成员函数直接获取文件信息。 // 构造函数
// 参数为文件路径如果文件非法仍然可以创建出QFileInfo
QFileInfo::QFileInfo(const QString file)// 判断文件或文件夹是否存在
// 如果存在返回true否则返回false
bool QFileInfo::exists() const// 返回文件大小单位是字节
qint64 QFileInfo::size() const// 返回基础文件名
QString QFileInfo::baseName() const// 返回最近修改日期和时间
QDateTime QFileInfo::lastModified() const// 返回可读性
bool QFileInfo::isReadable() const3.QFile文件读写类 在Qt中所有IO都都继承自QIODevice类QIODevice类中规定了最基础的IO相关接口这些接口虽然在不同的派生类中可能是实现有区别但调用方式一致。 // 构造函数
// 参数为文件路径如果是非法路径也能创建出对象但是不能正常IO
QFile::QFile(const QString name)// 判断QFile对应的文件是否存在
bool QFile::exists() const// 打开数据流
// 参数为打开的模式
// 返回值为打开的结果
bool QIODevice::open(OpenMode mode)[virtual]// 读取最大长度为maxSize个字节到返回值中
QByteArray QIODevice::read(qint64 maxSize)// 写出数据
// 参数为写出的内容
// 返回值为实际的数据写出字节数出错返回-1
qint64 QIODevice::write(const QByteArray byteArray)// 判断是否读到文件尾部
bool QIODevice::atEnd() const[virtual]// 关闭文件流
void QIODevice::close()[virtual]// 清空缓存区
bool QFileDevice::flush()// 返回输入流的大小单位是字节
qint64 QIODevice::size() const 4.ui界面 三、代码 //dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include QDialog
#include QFileDialog
#include QMessageBox
#include QDateTime
#include QFileInfo
#include QFile
#include mythread.h
namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent 0);~Dialog();private:Ui::Dialog *ui;QString readPath;QString writePath;void prinFileInfo();void copy();MyThread *ct;
private slots:void btnsClickedSlot();void valueSlot(int);
};#endif // DIALOG_H//mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H#include QThread
#include QDebug
#include QFileclass MyThread : public QThread
{Q_OBJECT
public:explicit MyThread(QObject *parent 0);~MyThread();bool getRunningState() const;void setRunningState(bool value);void Pathget(QString, QString);signals:void valueSignal(int);
public slots:private:QString treadPath;QString twritePath;bool runningState;// 状态标记
protected:void run();
};#endif // MYTHREAD_H//dialog.c
#include dialog.h
#include ui_dialog.hDialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui-setupUi(this);connect(ui-pushButtonOpen,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));
connect(ui-pushButtonSave,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));
connect(ui-pushButtonCopy,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));}Dialog::~Dialog()
{delete ui;
}void Dialog::prinFileInfo()
{QFileInfo info(readPath);if(!info.exists())return;qint64 sizeinfo.size();qreal size2;QString text;if(size1024){size2size;QString textQString ::number(size2);text.prepend(文件大小:).append(字节);ui-textBrowserOpen-append(text);}else if(size1024 size1048576){size2size/1024;QString textQString ::number(size2);text.prepend(文件大小:).append(K字节);ui-textBrowserOpen-append(text);}else if(size1048576size1073741824){size2size/1048576;QString textQString ::number(size2);text.prepend(文件大小:).append(M字节);ui-textBrowserOpen-append(text);}else if(size1073741824size1099511627776){size2size/1073741824;QString textQString ::number(size2);text.prepend(文件大小:).append(G字节);ui-textBrowserOpen-append(text);}textinfo.baseName();text.prepend(文件名称:);ui-textBrowserOpen-append(text);textinfo.lastModified().toString(修改时间yyyy-MM-dd hh:mm:ss);ui-textBrowserOpen-append(text);bool resultinfo.isReadable();if(result)ui-textBrowserOpen-append(文件可读);elseui-textBrowserOpen-append(文件不可读);}void Dialog::copy()
{if(readPath){QMessageBox::warning(this,提示,请选择要读取的文件);return;}else if(writePath){QMessageBox::warning(this,提示,请选择要保存的文件);return;}QFile readFile(readPath);QFile writeFile(writePath);readFile.open(QIODevice::ReadOnly);writeFile.open(QIODevice::WriteOnly);writeFile.flush();readFile.close();writeFile.close();
}void Dialog::btnsClickedSlot()
{if(ui-pushButtonOpensender()){QString filter所有文件(*.*);;Qt(*.cpp *.pro *.h *.ui);//符号都是英语符号用于检索QString pathQFileDialog::getOpenFileName(this,打开,C:/,filter);if(path ! ){ui-textBrowserOpen-append(path);readPathpath;prinFileInfo();}else if (readPath ){QMessageBox::warning(this,提示,请选择要打开的文件!);return;}}else if(ui-pushButtonSavesender()){QString filter所有文件(*.*);;Qt(*.cpp *.pro *.h *.ui);QString pathQFileDialog::getSaveFileName(this,保存,C:/,filter);if(path ! )
{ui-textBrowserSave-append(path);writePathpath;
}else if (writePath ){QMessageBox::warning(this,提示,请选择要保存的文件!);return;}}else if(ui-pushButtonCopysender()){// 创建子线程对象并启动if(ui-pushButtonCopy-text() 开始拷贝){copy();ct new MyThread(this);connect(ct,SIGNAL(valueSignal(int)),this,SLOT(valueSlot(int)));ct-start();ui-pushButtonCopy-setText(停止拷贝);}else if (ui-pushButtonCopy-text() 停止拷贝){ui-pushButtonCopy-setText(开始拷贝);ct-setRunningState(false);}}
}
void Dialog::valueSlot(int value)
{ui-progressBar-setValue(value);if(value 100){// 释放按钮ui-pushButtonCopy-setEnabled(true);this-hide();// 隐藏主窗口只是看不到this-show();// 显示主窗口QMessageBox::information(this,通知,文件拷贝完毕);}
}//mythread.c
#include mythread.hMyThread::MyThread(QObject *parent) : QThread(parent)
{setRunningState(true);
}MyThread::~MyThread()
{}bool MyThread::getRunningState() const
{return runningState;
}void MyThread::setRunningState(bool value)
{runningState value;
}void MyThread::run()
{for(int i 0 ;i 100 runningState;i){QThread::msleep(100);emit valueSignal(i);}qDebug() 资源已释放;}四、实验结果