1:是进度条通过线程自己动起来
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>class mythread : public QThread
{Q_OBJECT
public:mythread(QObject* parent = nullptr);
protected:virtual void run() override;
private:
signals:virtual void sndSignal(int value);
};#endif // MYTHREAD_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSlider>
#include "mythread.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void rcvSig(int value);
private:Ui::Widget *ui;mythread* thread;QSlider* slider;
};
#endif // WIDGET_H
mythread.cpp
#include "mythread.h"mythread::mythread(QObject *parent):QThread(parent)
{}void mythread::run()
{int value = 0;while(1){this->msleep(100);emit sndSignal(value);value++;if(value == 100){value = 0;}}
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);thread = new mythread(this);QString qss = R"(QSlider::groove:horizontal {background-color: #f0f0f0; /* 滑轨的背景色为灰白色 */height: 10px; /* 滑轨的高度增大 */border-radius: 5px; /* 滑轨的圆角 */}QSlider::sub-page:horizontal {background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #6a11cb, stop:1 #2575fc); /* 滑块左侧的渐变背景色 */height: 10px; /* 滑块左侧的高度增大 */border-radius: 5px; /* 滑块左侧的圆角 */}QSlider::handle:horizontal {width: 24px; /* 滑块手柄的宽度增大 */height: 24px; /* 滑块手柄的高度增大 */margin: -7px 0; /* 滑块手柄的垂直居中调整 */border-radius: 12px; /* 滑块手柄的圆角增大 */})";ui->horizontalSlider->setStyleSheet(qss);QObject::connect(thread,&mythread::sndSignal,this,&Widget::rcvSig);thread->start();
}Widget::~Widget()
{thread->terminate();delete ui;
}void Widget::rcvSig(int value)
{ui->horizontalSlider->setValue(value);
}
2:使用QFileDialog或者拖放事件+QT文件IO+QT线程
实现一个文件复制功能,要求能够复制大小超过800mb的文件
额外要求:可以在文件拷贝的时候,追加一个进度条显示拷贝了多少文件内容
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QFile>class myThread : public QThread
{Q_OBJECT
private:QFile file1;QFile file2;QString filename;QString newfilename;
public:myThread(QObject* parent);void setFile(const QString& filename);void setNewFile(const QString& newfilename);
protected:virtual void run() override;
};#endif // MYTHREAD_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QFileDialog>
#include "mythread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();private:Ui::Widget *ui;QString filename;QString newfilename;myThread* thread;
};
#endif // WIDGET_H
mythread.cpp
#include "mythread.h"myThread::myThread(QObject* parent):QThread(parent)
{}void myThread::setFile(const QString &filename)
{this->filename = filename;
}void myThread::setNewFile(const QString &newfilename)
{this->newfilename = newfilename;
}void myThread::run()
{file1.setFileName(filename);file1.open(QIODevice::ReadOnly);file2.setFileName(newfilename);file2.open(QIODevice::WriteOnly);while(1){QByteArray arr = file1.read(1);if(arr.isEmpty()){break;}file2.write(arr);}}
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);thread = new myThread(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{filename = QFileDialog::getOpenFileName(this,"选择文件");ui->lineEdit->setText(filename);thread->setFile(filename);
}void Widget::on_pushButton_2_clicked()
{newfilename = QFileDialog::getSaveFileName(this,"选择保存的地址");ui->lineEdit_2->setText(newfilename);thread->setNewFile(newfilename);
}void Widget::on_pushButton_3_clicked()
{thread->start();
}