第一题、使用qss,通过线程,使进度条自己动起来
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QObject>
#include <QThread>
#include <QDebug>class mythread : public QThread
{Q_OBJECT
public:mythread(QObject* parent=nullptr);
private:QThread* thread;int i;
protected:void run() override;signals:void send(int i);
};#endif // MYTHREAD_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <mythread.h>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();protected slots:void rcv(int i);private:Ui::Widget *ui;mythread* thread;
};
#endif // WIDGET_H
mythread.cpp
#include "mythread.h"mythread::mythread(QObject *parent):i(0)
{
}void mythread::run()
{while(1){emit send(i);i++;//qDebug()<<"hhh";if(i>=99){i=0;}this->usleep(1000);}
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(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 {background-color: #ffffff; /* 滑块手柄的背景色 */width: 24px; /* 滑块手柄的宽度增大 */height: 24px; /* 滑块手柄的高度增大 */margin: -7px 0; /* 滑块手柄的垂直居中调整 */border-radius: 12px; /* 滑块手柄的圆角增大 */border: 2px solid #cccccc; /* 滑块手柄的边框 */})";ui->horizontalSlider->setStyleSheet(qss);thread=new mythread(this);thread->start();QObject::connect(thread,&mythread::send,this,&Widget::rcv);
}Widget::~Widget()
{delete ui;
}void Widget::rcv(int i)
{ui->horizontalSlider->setValue(i);
}
运行截图;
第二题;实现大文件的拷贝
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QObject>
#include <QThread>
#include <QDebug>
#include <QFile>
#include <QMouseEvent>
#include <QFileDialog>
#include <QDropEvent>class mythread : public QThread
{Q_OBJECT
public:mythread(QObject* parent=nullptr);void run() override;void fileio();public slots:void rcv(QString filename);private:QString filename;// QFile file;};#endif // MYTHREAD_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMoveEvent>
#include <QDragMoveEvent>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QFileDialog>
#include <QDebug>
#include <mythread.h>
#include <QDropEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();protected:void dragEnterEvent(QDragEnterEvent *event);void dropEvent(QDropEvent *event) override;private:Ui::Widget *ui;QString filename;mythread* thread;signals:void send(QString filename);
};
#endif // WIDGET_H
mythread.cpp
#include "mythread.h"mythread::mythread(QObject* parent)
{}void mythread::run()
{QFile file1;file1.setFileName(filename);file1.open(QIODevice::ReadOnly);QFile file2;QFileInfo fileInfo(filename);QString file_end = fileInfo.fileName();//获取文件名QString path="D:/QTproject/"+file_end;//拼接文件路径+文件名file2.setFileName(path);file2.open(QIODevice::WriteOnly);double size=0;while(1){char arr[1024]="";int res=file1.read(arr,1024);if(res==0){qDebug()<<"传输数据大小: "<<size;return;}file2.write(arr,1024);size+=res;// qDebug()<<"传输数据大小: "<<size;}file1.close();file2.close();
}void mythread::fileio()
{}void mythread::rcv(QString filename)
{qDebug()<<filename;this->filename=filename;
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setAcceptDrops(1);thread=new mythread(this);QObject::connect(this,&Widget::send,thread,&mythread::rcv);}Widget::~Widget()
{delete ui;
}void Widget::dragEnterEvent(QDragEnterEvent *event)
{event->acceptProposedAction();}void Widget::dropEvent(QDropEvent *event)
{const QMimeData* mimedata=event->mimeData();//获取文件路径QList<QUrl> list=mimedata->urls();//获取所有的文件地址QUrl url=list[0];//获取第几个文件具体地址filename=url.toLocalFile();//转化成字符串类型emit send(filename);thread->start();
}