《QT实用小工具·七十一》基于Qt+Qml开发的文件传输工具

1、概述
源码放在文章末尾

该项目基于QT+QML实现了文件传输的功能,可以在局域网环境下使用(热点),扫描使用UDP,传输使用TCP,每一个文件传输使用独立的线程进行处理,高效便捷。

开发环境
使用Qt/Qml开发
QT版本:Qt 5.13.0
基本未使用高版本特性,保证Qt Version >= 5.0即可,建议是Qt 5.5 ~ 5.7

项目demo演示如下:
在这里插入图片描述

项目部分代码如下所示:

#ifndef FILEMANAGER_H
#define FILEMANAGER_H

#include <QObject>
#include <QQmlListProperty>

class FileInfo : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged)
    Q_PROPERTY(int offset READ offset WRITE setOffset NOTIFY offsetChanged)
    Q_PROPERTY(int fileSize READ fileSize WRITE setFileSize NOTIFY fileSizeChanged)

public:
    FileInfo(QObject *parent = nullptr);
    FileInfo(const FileInfo &other, QObject *parent = nullptr);
    FileInfo(const QString &fileName, int offset, int fileSize, QObject *parent = nullptr);
    ~FileInfo();

    QString fileName() const;
    void setFileName(const QString &fileName);

    int offset() const;
    void setOffset(int offset);

    int fileSize() const;
    void setFileSize(int fileSize);

signals:
    void fileNameChanged();
    void offsetChanged();
    void fileSizeChanged();

private:
    QString m_fileName;
    int m_offset;
    int m_fileSize;
};

class FileManager : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QQmlListProperty<FileInfo> readFiles READ readFiles NOTIFY readFilesChanged)
    Q_PROPERTY(QQmlListProperty<FileInfo> writeFiles READ writeFiles NOTIFY writeFilesChanged)

public:
    static FileManager* instance();
    ~FileManager();

    QQmlListProperty<FileInfo> readFiles();
    QQmlListProperty<FileInfo> writeFiles();

public slots:
    void addReadFile(const QString &fileName, qint32 totalSize);
    void updateReadFile(const QString &fileName, qint32 offset);

    void addWriteFile(const QString &fileName, qint32 totalSize);
    void updateWriteFile(const QString &fileName, qint32 offset);

signals:
    void readFilesChanged();
    void writeFilesChanged();
    void readFileComplete(const QString &fileName);
    void writeFileComplete(const QString &fileName);

private:
    FileManager(QObject *parent = nullptr);

    QHash<QString, FileInfo*> m_filesTable;
    QList<FileInfo *> m_readFiles;
    QQmlListProperty<FileInfo> *m_readFilesProxy;
    QList<FileInfo *> m_writeFiles;
    QQmlListProperty<FileInfo> *m_writeFilesProxy;
};

#endif // FILEMANAGER_H

#include "filemanager.h"
#include <QDebug>

FileInfo::FileInfo(QObject *parent)
    : QObject (parent)
{

}

FileInfo::FileInfo(const FileInfo &other, QObject *parent)
    : QObject (parent),
      m_fileName(other.m_fileName),
      m_offset(other.m_offset),
      m_fileSize(other.m_fileSize)
{

}

FileInfo::FileInfo(const QString &fileName, int offset, int fileSize, QObject *parent)
    : QObject (parent),
      m_fileName(fileName),
      m_offset(offset),
      m_fileSize(fileSize)
{

}

FileInfo::~FileInfo()
{

}

QString FileInfo::fileName() const
{
    return m_fileName;
}

void FileInfo::setFileName(const QString &fileName)
{
    if (fileName != m_fileName) {
        m_fileName = fileName;
        emit fileNameChanged();
    }
}

int FileInfo::offset() const
{
    return m_offset;
}

void FileInfo::setOffset(int offset)
{
    if (offset != m_offset) {
        m_offset = offset;
        emit offsetChanged();
    }
}

int FileInfo::fileSize() const
{
    return m_fileSize;
}

void FileInfo::setFileSize(int fileSize)
{
    if (fileSize != m_fileSize) {
        m_fileSize = fileSize;
        emit fileSizeChanged();
    }
}


FileManager* FileManager::instance()
{
    static FileManager fileManager;
    return &fileManager;
}

FileManager::FileManager(QObject *parent)
    : QObject (parent)
{
    m_readFilesProxy = new QQmlListProperty<FileInfo>(this, m_readFiles);
    m_writeFilesProxy = new QQmlListProperty<FileInfo>(this, m_writeFiles);
}

FileManager::~FileManager()
{

}

QQmlListProperty<FileInfo> FileManager::readFiles()
{
    return *m_readFilesProxy;
}

QQmlListProperty<FileInfo> FileManager::writeFiles()
{
    return *m_writeFilesProxy;
}

void FileManager::addReadFile(const QString &fileName, qint32 totalSize)
{
    FileInfo *info = new FileInfo(fileName, 0, totalSize, this);
    m_readFiles.append(info);
    m_filesTable[fileName] = info;
    emit readFilesChanged();
}

void FileManager::updateReadFile(const QString &fileName, qint32 offset)
{
    FileInfo *info = m_filesTable[fileName];
    if (info) {
        info->setOffset(offset);
        if (offset == info->fileSize()) {
            m_filesTable.remove(fileName);
            emit writeFileComplete(fileName);
        }
    }
}

void FileManager::addWriteFile(const QString &fileName, qint32 totalSize)
{
    FileInfo *info = new FileInfo(fileName, 0, totalSize, this);
    m_writeFiles.append(info);
    m_filesTable[fileName] = info;
    emit writeFilesChanged();
}

void FileManager::updateWriteFile(const QString &fileName, qint32 offset)
{
    FileInfo *info = m_filesTable[fileName];
    if (info) {
        info->setOffset(offset);
        if (offset == info->fileSize()) {
            m_filesTable.remove(fileName);
            emit writeFileComplete(fileName);
        }
    }
}

源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/727423.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建开发模式下的以太坊私有链【Geth:1.14.5】

一、为什么用到私有链&#xff1f; 在以太坊的公有链上部署智能合约、发起交易需要花费以太币。而通过修改配置&#xff0c;可以在本机搭建一套以太坊私有链&#xff0c;因为与公有链没关系&#xff0c;既不用同步公有链庞大的数据&#xff0c;也不用花钱购买以太币&#xff0…

Mybatis中BaseEntity作用

新建各种对象的时候&#xff0c;一般来说&#xff0c;有几个属性是所有对象共有的&#xff0c;比如说id,is_del&#xff0c;is_enable这些&#xff0c;然后设置一个基础对象&#xff0c;以后新建所有对象的时候都继承它&#xff0c;就省的每次都要写这些共有的属性了

生育是家庭和个人的重要的选择

生育是个人和家庭的重要选择&#xff0c;而国家对于生育政策的制定应该综合考虑多种因素&#xff0c;包括人口结构、经济发展和社会稳定等。同时&#xff0c;我们也应该认识到&#xff0c;男女不应该成为决定一个人是否能够生育的因素。男女在生育中扮演着不同的角色&#xff0…

在Maven工程中手动配置并测试SpringBoot(巨详)

本篇博客承继自博客&#xff1a; 在IDEA 2024.1.3 (Community Edition)中创建Maven项目_idea2024.1.3如何创建maven项目-CSDN博客 配置POM文件 打开工程中的pom.xml文件&#xff0c;先向其中写入 <parent><groupId>org.springframework.boot</groupId><…

【总线】AXI4第三课时:握手机制

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

Java面向对象的三大特性之一——继承

目录 一、继承概念 二、为什么要继承 三、继承语法&#xff08;关键字extends&#xff09; 四、父类成员访问 1、子类中访问父类的成员变量 &#xff08;1&#xff09;子类和父类不存在同名的成员变量 &#xff08;2&#xff09;子类和父类中存在同名的成员变量 2、子类中访…

Transformer学习理解

1.前言 本文介绍当下人工智能领域的基石与核心结构模型——Transformer&#xff0c;为什么说它是基石&#xff0c;因为以ChatGPT为代表的聊 天机器人以及各种有望通向AGI&#xff08;通用人工智能&#xff09;的道路上均在采用的Transformer。 Transformer也是当下NLP任…

基于PCL实现多边形框选点云并进行裁剪(附C++源码)

文章目录 一.算法效果二.算法原理PNPoly算法直线相交性判断三.代码实现一.算法效果 通过在PCL可视化界面上绘制2D封闭多边形来提取位于该封闭多边形内部或者外部的 的点,算法效果如下: 图1多边形裁剪点云效果图 二.算法原理 PNPoly算法 2D多边形框选裁剪点云,实际上可以简…

SSRF学习,刷题

[HNCTF 2022 WEEK2]ez_ssrf 给了一个Apache2的界面&#xff0c;翻译一下 就是一个默认的界面,目录扫描 可以看到flag.php,肯定是不能直接访问得到的&#xff0c;还有index.php&#xff0c;访问这个 可以看到三个参数data,host,port 还有fsockopen() 函数是 PHP 中用于打开一个…

代码随想录训练营Day 64|卡码网98. 所有可达路径(深搜)

1.所有可达路径 98. 所有可达路径 | 代码随想录 代码&#xff1a; &#xff08;深搜&#xff09;邻接矩阵表示 #include <iostream> #include <vector> using namespace std; vector<int> path; vector<vector<int>> result; void dfs(const ve…

LeetCode 算法:两两交换链表中的节点 c++

原题链接&#x1f517;&#xff1a;两两交换链表中的节点 难度&#xff1a;中等⭐️⭐️ 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交…

QT中利用动画弄一个侧边栏窗口,以及贴条效果

1、效果 2、关键代码 void Widget::on_sliderBtn_clicked() {m_sliderWidget->show();QPropertyAnimation* animation = new QPropertyAnimation(m

政策更新记录:敏感信息访问权限与API使用变更

我们将更新“健康数据共享”政策,简化“健康数据共享”申请流程,并与“健康类应用”政策保持一致。此外,我们将于今年晚些时候在 Play 管理中心推出一项新的声明,取代当前使用表单进行申请的方式。 公布日期:2024-04-03 Health Connect 政策要求及常见问题解答 初步认识对…

[AIGC] 使用Google的Guava库中的Lists工具类:常见用法详解

在Java程序设计中&#xff0c;集合是我们最常用的数据结构之一。为了方便我们操作集合&#xff0c;Google的Guava库提供了一个名为Lists的工具类&#xff0c;它封装了许多用于操作List对象的实用方法。在本文中&#xff0c;我们将详细介绍其常见的用法&#xff0c;以帮助您更好…

volatile关键字(juc编程)

volatile关键字 3.1 看程序说结果 分析如下程序&#xff0c;说出在控制台的输出结果。 Thread的子类 public class VolatileThread extends Thread {// 定义成员变量private boolean flag false ;public boolean isFlag() { return flag;}Overridepublic void run() {// 线…

钡铼BL101网关助力智慧城市路灯远程智能管控

在迈向智慧城市的征途中&#xff0c;基础设施的智能化改造是关键一环&#xff0c;而路灯作为城市脉络的照明灯塔&#xff0c;其智能化升级对于节能减排、提升城市管理效率具有重要意义。钡铼BL101网关&#xff0c;作为Modbus转MQTT的专业桥梁&#xff0c;正以其卓越的性能和广泛…

数据仓库与数据库的区别

在数据管理和分析的过程中&#xff0c;我们常常会听到“数据库”和“数据仓库”这两个术语。 虽然它们看起来相似&#xff0c;但实际上它们在设计目的、结构和使用场景上都有显著的区别。 数据库是什么&#xff1f; 数据库&#xff08;Database&#xff09;是一个用于存储和管…

[创业之路-120] :全程图解:软件研发人员如何从企业的顶层看软件产品研发?

目录 一、企业全局 二、供应链 三、团队管理 四、研发流程IPD 五、软件开发流程 六、项目管理 七、研发管理者的自我修炼 一、企业全局 二、供应链 三、团队管理 四、研发流程IPD 五、软件开发流程 六、项目管理 七、研发管理者的自我修炼

时空预测 | 基于深度学习的碳排放时空预测模型

时空预测 模型描述 数据收集和准备&#xff1a;收集与碳排放相关的数据&#xff0c;包括历史碳排放数据、气象数据、人口密度数据等。确保数据的质量和完整性&#xff0c;并进行必要的数据清洗和预处理。 特征工程&#xff1a;根据问题的需求和领域知识&#xff0c;对数据进行…

【C++】基础知识--inline(内联)关键字以及与宏的区别

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…