当前位置: 首页 > news >正文

使用QT + 文件IO + 鼠标拖拽事件 + 线程 ,实现大文件的传输

第一题、使用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();
}

 运行截图:


http://www.mrgr.cn/news/93392.html

相关文章:

  • 运动控制卡--固高实用
  • LLM-初识AI
  • 关于sqlalchemy的使用
  • 浏览器WEB播放RTSP
  • 深度学习PyTorch之13种模型精度评估公式及调用方法
  • 为AI聊天工具添加一个知识系统 之138 设计重审 之2 文章学 引言之2 附加符号学和附属诠释学
  • 前端基础入门-高级
  • WLAN无线组网 WI-FI
  • 如何改变怂怂懦弱的气质(2)
  • 从零构建企业级财务分析数仓 | Hive建模实战
  • Spring(四)先注册后注入
  • 为AI聊天工具添加一个知识系统 之138 设计重审 2 文章学 之2 结合诠释学的重组
  • Gazebo11 与 Protobuf 版本管理
  • Python:简单的爬虫程序,从web页面爬取图片与标题并保存MySQL
  • K8s 1.27.1 实战系列(五)Namespace
  • aws(学习笔记第三十一课) aws cdk深入学习(batch-arm64-instance-type)
  • MacOS Big Sur 11 新机安装brew wget python3.12 exo
  • ubuntu20.04已安装 11.6版本 cuda,现需要通过源码编译方式安装使用 cuda 加速的 ffmpeg 步骤
  • AI绘画软件Stable Diffusion详解教程(7):图生图基础篇
  • 【JAVA架构师成长之路】【JVM实战】第2集:生产环境内存飙高排查实战