【QT 网络云盘客户端】——获取用户文件列表信息
目录
1.获取用户文件列表信息分析
2.设置图标属性
3.向服务器获取文件的数量
4.向服务器获取文件信息列表
4.显示图标
1.获取用户文件列表信息分析
1.将QListWidget设置为图标模式
2. 当我们点击"按下载量升序","按下载量降序",“更新” 菜单选项 都会调用 getFileCount 接口获取文件数量,如果文件数量大于0,则会getFileList获取所有文件的信息。
3.将获取的所有的文件信息保存到 QList<FileInfo*> m_fileInfoList;(FileInfo是一个自定义文件结构体)
3.调用 refreshFileList 接口 将 m_fileInfoList中 中的所有文件信息以 图标形式 显示到 QWidgetList窗口上。( 图标 包含 图片和文件名)
//设置菜单选项的槽函数connect(m_downloadAscAction,&QAction::triggered,this,[=]{// qDebug()<<"按下载量降序";getFileCount(Desc);});connect(m_downloadDescAction,&QAction::triggered,this,[=]{// qDebug()<<"按下载量升序";getFileCount(Asc);});connect(m_refreshAction,&QAction::triggered,this,[=]{getFileCount(Normal);qDebug()<<"更新";});getFileCount(MyFileDisplay cmd);//获取文件的数量getFileList(MyFileDisplay cmd);//获取用户的文件信息列表refreshFileList();//显示图标
2.设置图标属性
//设置图标模式ui->listWidget->setViewMode(QListView::IconMode);//设置在图标的图片的大小ui->listWidget->setIconSize(QSize(80,80));//设置图标的 布局的大小ui->listWidget->setGridSize(QSize(120,200));//自适应布局,需要将窗口进行布局才能生效ui->listWidget->setResizeMode(QListView::Adjust);//设置图标拖动状态,QListView::Static表示不可以拖动ui->listWidget->setMovement(QListView::Static);
3.向服务器获取文件的数量
客户端 会先调用 getFileCount 发送一个http请求 向服务器获取用户的文件数量 ,http请求如下:
POST http://119.23.41.13:80/myfiles?cmd=count HTTP/1.1
Content-Type: application/json{"token": "7e4b94f141b8bc7680fac2fa7dcdddf3","user": "zhangsan"
}
服务器返回的 http响应:
HTTP/1.1 200 OK{"num": "7", //文件的数量"code": "110" //获取失败为 111
}
请求流程:
代码实现:
//Normal正常显示,Asc 按下载量升序显示,Desc按下载量降序显示
enum MyFileDisplay { Normal, Asc, Desc};//获取文件的数量
void myfile::getFileCount(MyFileDisplay cmd)
{/*1.设置http请求并发送http请求2.获取响应的正文数据,并解析"code",和"num"3.如果code为"110","num"不为0,则调用getFileList获取文件信息列表 *///封装http请求QNetworkRequest request;//从配置文件中获取到ip地址和port端口号QString ip=Common::getInstant()->getConfValue("web_server","ip");QString port=Common::getInstant()->getConfValue("web_server","port");QString url = QString("http://%1:%2/myfiles?cmd=count").arg(ip).arg(port);request.setUrl(QUrl(url));//设置文件类型request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));//将data数据以QJson的格式发送给服务器QJsonObject object;object.insert("user", m_logininfo->user());object.insert("token", m_logininfo->token());QJsonDocument doc(object);QByteArray data=doc.toJson();//发送请求// qDebug()<<data;QNetworkReply* rely=m_manager->post(request,data);connect(rely,&QNetworkReply::readyRead,this,[=]{//响应到达,读取所有的数据QByteArray s=rely->readAll();qDebug() << "服务器返回数据:" << QString(s);//将s数据转换为Json对象QJsonParseError err;QJsonDocument document=QJsonDocument::fromJson(s,&err);if(err.error!=QJsonParseError::NoError){qDebug()<<"QJson格式错误";return;}//将QJson字符串转换为QJson对象QJsonObject object1;object1=document.object();//获取状态码QString value1=object1["code"].toString();if(value1=="110"){//获取列表成功,获取文件列表myfileCount=object1["num"].toString().toInt();if(myfileCount>0){//文件列表数量大于0getFileList(cmd);//请求文件列表}}if(value1=="111"){//获取失败qDebug()<<"获取文件失败";}});
}
4.向服务器获取文件信息列表
当文件数量大于0的时候,则会调用 getFileList 接口 发送一个http请求 向服务器请求 用户的 文件信息列表,http请求如下:
POST http://119.23.41.13:80/myfiles?cmd=normal HTTP/1.1
Content-Type: application/json
Content-Length: 108{"count": 7, //请求的文件数量"start": 0, //从哪个文件信息开始获取"token": "7e4b94f141b8bc7680fac2fa7dcdddf3","user": "zhangsan"
}
服务器发送回来的响应:
HTTP/1.1 200 OK{"files": [{"user": "zhangsan","md5": "b6bb728a0016b6327a6b549ea1f719d1","create_time": "2023-07-27 20:55:15","file_name": "test1.json","share_status": 1,"pv": 0,"url": "http://172.31.39.20:80/group1/M00/00/00/rB8nFGTCaTOAdjiBAAABBfJuwvA57.json","size": 261,"type": "json"}, {"user": "zhangsan","md5": "05aee6833498afae803c103488838616","create_time": "2023-07-28 01:27:56","file_name": "2023包装印刷工艺实验_ 综合性实验1.doc","share_status": 1,"pv": 0,"url": "http://172.31.39.20:80/group1/M00/00/00/rB8nFGTCafaAGABwAAm0Qrbrn4w371.doc","size": 638464,"type": "doc"}, {"user": "zhangsan","md5": "e9f32a97b8bde8cdbda5c2481dc77e6f","create_time": "2023-07-28 04:45:31","file_name": "沈家鹏+202022210218+包装工艺实验报告.doc","share_status": 1,"pv": 0,"url": "http://172.31.39.20:80/group1/M00/00/00/rB8nFGTC12uAQEQVAFojXojlUxs887.doc","size": 5929984,"type": "doc"}, {"user": "zhangsan","md5": "0a4194984ac702483c500d7e216ef655","create_time": "2023-07-28 18:36:42","file_name": "沈家鹏+202022210218+包装工艺实验.pdf","share_status": 0,"pv": 0,"url": "http://172.31.39.20:80/group1/M00/00/00/rB8nFGTDmjqAfVaIAAtEPBMxG-A084.pdf","size": 742876,"type": "pdf"}, {"user": "zhangsan","md5": "697bed673b8061471b3d04144fa4050e","create_time": "2023-07-28 18:36:51","file_name": "沈家鹏+202022210218+包装机械工厂参观实验报告.doc","share_status": 0,"pv": 0,"url": "http://172.31.39.20:80/group1/M00/00/00/rB8nFGTDmkOAN2_EADNSzTgsyJg890.doc","size": 3376128,"type": "doc"}, {"user": "zhangsan","md5": "2a96c1401c1409dd24f8cc6996462a1e","create_time": "2023-07-28 18:36:52","file_name": "沈家鹏+202022210218+综合实验1.doc","share_status": 0,"pv": 0,"url": "http://172.31.39.20:80/group1/M00/00/00/rB8nFGTDmkSANiWXAACtJYuY4UE605.doc","size": 44544,"type": "doc"}, {"user": "zhangsan","md5": "6f9e42afb2db2f92e7ba53b4c58d45b1","create_time": "2023-07-28 18:36:52","file_name": "沈家鹏+202022210218+综合性实验2.doc","share_status": 0,"pv": 0,"url": "http://172.31.39.20:80/group1/M00/00/00/rB8nFGTDmkSAXQw4AAFJKPLgCM4027.doc","size": 84480,"type": "doc"}]
}
文件信息列表Json包是一个Json对象。它只包含一个key-value结构,其中key是 “files”,Value是一个Json数组,数组中包含多个Json对象,每一个Json对象中包含着每一个文件的信息,包括:
"user": "sjp", //文件的上传的用户
"md5": "8274425de767b30b2fff1124ab54abb5", //用来唯一标识文件
"create_time": "2023-07-18 18:13:43", //上传时间
"file_name": "111.rtf", //文件名
"share_status": 0, //分享状态
"pv": 1, //下载量
"url": "http://172.31.39.20:80/group1/M00/00/00/rB8nFGS2ZdeAHmamAAAAB8uzquY970.rtf",
"size": 7, //文件大小
"type": "rtf" //文件类型
代码实现:
struct FileInfo
{QString user; //用户名QString md5; //md5QString createTime; //上传时间QString fileName; //文件名称int shareStatus; //共享状态, 0为没有共享, 1为共享int pv; //文件下载量,下载一次加1QString url; //文件urlint size; //文件大小QString type; //文件类型
};QList<FileInfo*> m_fileInfoList;//存储着所有的文件列表的信息//获取文件信息列表
void myfile::getFileList(MyFileDisplay cmd)
{/*1.发送http请求获取文件信息列表2.获取成功,需要先清除QListWidget中的item和 m_fileInfoList3.将新的文件信息列表添加到m_fileInfoList 和QListWidget中。*/QString strCmd;if (cmd == MyFileDisplay::Normal) {strCmd = "normal";} else if (cmd == MyFileDisplay::Asc) {strCmd = "pvasc";} else if (cmd == MyFileDisplay::Desc) {strCmd = "pvdesc";}//封装http请求QNetworkRequest request;//从配置文件中获取到ip地址和port端口号QString ip=Common::getInstant()->getConfValue("web_server","ip");QString port=Common::getInstant()->getConfValue("web_server","port");//http://192.168.52.139/myfiles?cmd=normal//http://192.168.52.139/myfiles?cmd=asc//http://192.168.52.139/myfiles?cmd=pvascQString url = QString("http://%1:%2/myfiles?cmd=%3").arg(ip).arg(port).arg(strCmd);request.setUrl(QUrl(url));//设置数据类型request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));//将data数据以QJson的格式发送给服务器QJsonObject object;object.insert("user", m_logininfo->user());object.insert("token", m_logininfo->token());object.insert("start", 0);object.insert("count", myfileCount);QJsonDocument doc(object);QByteArray data=doc.toJson();//发送请求QNetworkReply* rely=m_manager->post(request,data);connect(rely,&QNetworkReply::readyRead,this,[=]{//响应到达,读取所有的数据QByteArray s=rely->readAll();clearFileList();//清空文件列表clearFileItem();////将文件列表信息解析到m_fileInfoList中AnalyJsonData::getFileList(s,m_fileInfoList);refreshFileList();rely->deleteLater();});
}//AnalyJsonData::getFileList(s,m_fileInfoList)接口
//是将响应正文的数据解析到m_fileInfoList中
4.显示图标
获取到所有的文件信息后,就需要将 m_fileInfoList 中的文件以图标的形式显示到 QListWidget 上.
//显示文件列表到QListWidget
void myfile::refreshFileList()
{/*1.获取每一个文件信息2.根据文件类型显示不同的图标3.将QListWidgetItem添加到QWidget中*/for(int i=0;i<m_fileInfoList.count();i++){FileInfo* info= m_fileInfoList[i];//将图标设置进QListWidget中QIcon icon(":/res/txt.png");if(info->type=="jpg"||info->type=="png"){icon.addFile(":/res/jpg.png");}else if(info->type=="pdf"){icon.addFile(":/res/pdf.png");}QListWidgetItem* item1=new QListWidgetItem(icon,info->fileName);item1->setTextAlignment(Qt::AlignLeft);ui->listWidget->addItem(item1);} //最后在添加一个上传文件的item到QListWidgetItemQIcon icon(":/res/111111.png");QListWidgetItem* item1=new QListWidgetItem(icon,"上传文件");ui->listWidget->addItem(item1);
}
相关文章:

【QT 网络云盘客户端】——获取用户文件列表信息
目录 1.获取用户文件列表信息分析 2.设置图标属性 3.向服务器获取文件的数量 4.向服务器获取文件信息列表 4.显示图标 1.获取用户文件列表信息分析 1.将QListWidget设置为图标模式 2. 当我们点击"按下载量升序","按下载量降序",“更新” 菜单选项 都会…...

从0到1,无代码开发如何简化产品创新流程
在当今竞争激烈的市场环境中,产品创新已经成为企业成功的关键因素之一。为了在市场上保持竞争力,企业需要不断地推出新产品或改进现有产品。然而,传统的开发流程往往耗时费力,且成本高昂。因此,简化产品创新流程成为了…...

select、epoll 的快速核心理解
一、 select 最low的就是在用户代码中自旋实现所有阻塞socket的监听。但是每次判断socket是否产生数据,都涉及到用户态到内核态的切换。 于是select改进:将fd_set传入内核态,由内核判断是否有数据返回; 然后最low的只能使用自旋…...

HTTP和HTTPS的区别
一、两者概念 1.1 HTTP概念 HTTP 的全称是超文本传输协议(HyperText Transfer Protocol) 是一种用于分布式、协作式和超媒体信息系统的应用协议,简单来说就是一种分布和接收HTML页面的方法,被用于在Web浏览器和网站服务器之间传递…...

分布式异步任务处理组件(二)
一些关键点的设计脑暴记录----very important!!! 首先,任务存储交给kafka,由节点负责写入kafka,acks1;失败重试;透传kafka的提交可靠性,保证任务提交成功;后…...

Jenkins 拉取 GitHub 私有仓库失败问题
添加仓库的时候提示 stderr: fatal: Cannot prompt because user interactivity has been disabled. 把在 GitHub账户设置中生成的个人访问令牌填到地址里...

小程序 多层次对象数组的赋值、动态赋值
1、给对象赋值 data: {form: {Name: ,IDCard: ,Sex: ,}},对单个属性赋值 this.setData({form.Name:章三,[form.Sex]:女,}) 动态赋值 onChangeDate(e) {let field e.currentTarget.dataset.field;this.setData({[form.${field}]: e.detail.data})}, field 是wxml上通过dat…...

angular踩坑
1 新版路由守卫由于canActivate已被废弃,采用函数函数,但其参数中无法像类一样进行路由对象注入,如何实现路由首位中的页面跳转? import { CanActivateFn,Router,ActivatedRouteSnapshot, RouterStateSnapshot,} from angular/ro…...

C#时间轴曲线图形编辑器开发1-基本功能
目录 一、前言 1、简介 2、开发过程 3、工程下载链接 二、基本功能实现 1、绘图面板创建 (1)界面布置 (2)显示面板代码 (3) 面板水平方向、竖直方向移动功能实现 (4)面板放…...

elasticsearch查询操作(DSL语句方式)
说明:本文介绍在kibana,es的可视化界面上对文档的查询操作; 添加数据 先使用API,创建索引库,并且把数据从MySQL中查出来,传到ES上,参考(http://t.csdn.cn/NaTHg) 索引库…...

JavaScript详解
目录 一、JavaScript是什么? 1.1、JavaScript 和 HTML 和 CSS 之间的关系 1.2、JavaScript 运行过程 1.3、JavaScript 的组成 二、JavaScript 的书写形式 1. 行内式 2. 内嵌式 3、外部式 注释 三、输入输出 输入: prompt 输出: alert 输出: …...

电缆振荡波局部放电检测定位技术
电缆振荡波检测技术主要用于交联聚乙烯电力电缆检测,是属于离线检测的一种有效形式 。该技术基于LCR阻尼振荡原理,在完成电缆直流充电的基础上,通过内置的高压电抗器、高压实时固态开关与试品电缆形成阻尼振荡电压波,在试品电缆上…...

AI Chat 设计模式:10. 组合模式
本文是该系列的第八篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 给我介绍一下组合模式A.1Q.2 好的,给我举一个组合模式的例子,使…...

【Nginx12】Nginx学习:HTTP核心模块(九)浏览器缓存与try_files
Nginx学习:HTTP核心模块(九)浏览器缓存与try_files 浏览器缓存在 Nginx 的 HTTP 核心模块中其实只有两个简单的配置,这一块也是 HTTP 的基础知识。之前我们就一直在强调,学习 Nginx 需要的就是各种网络相关的基础知识&…...

【1】-Locust性能测试工具介绍与安装
Locust介绍 locust是一个开源的压测工具,其官网地址是Locust - A modern load testing framework,通过编写Python代码,可以轻松实现百万级的并发,相对于我们熟悉的Jmeter来说,其对压测机的要求更低,而且使…...

基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)
目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量(解析法) 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…...

【已解决】jupyter notebook里已经安装了第三方库,还是提示导入失败
在jupyter notebook中运行Python代码,明明已经安装了第三方库,还是提示导入失败。 以导入pandas库为例,其他库同理: 报错代码: import pandas报错原因: 电脑上存在多个python运行环境(比如&a…...

Mybatis使用collection映射一对多查询分页问题
场景:页面展示列表,需要查询多的字段,和一的字段。并且还要分页。 这时候直接想到的是手写sql。 /*** 标签*/private List<BasicResidentTags> tags;Data TableName("basic_resident_tags") public class BasicResidentTag…...

Linux/Windows路由管理
本文主要介绍如果通过linux/Windows命令添加IPV6地址,查看添加IPV6默认路由,查看IPV6邻居缓存 一、Linux 1、查看地址 IPV4: route netstat -route ip route IPV6: ip -6 route show route -A inet6 route -62、添加IPV6地址 ip -6 addr add <…...

openpnp - 设备矫正的零碎记录
文章目录 openpnp - 设备矫正的零碎记录概述笔记设备内部不能有任何强干扰源相机就选100W像素的就行, 没有特殊要求openpnp软件的选择视觉归位必须禁止轴的赤隙矫正不用做运行openpnp软件的计算机, 必须是台式机校验完成后, 数据占用的体积END openpnp - 设备矫正的零碎记录 概…...

Linux内核中的链表、红黑树和KFIFO
lLinux内核代码中广泛使用了链表、红黑树和KFIFO。 一、 链表 linux内核代码大量使用了链表这种数据结构。链表是在解决数组不能动态扩展这个缺陷而产生的一种数据结构。链表所包含的元素可以动态创建并插入和删除。链表的每个元素都是离散存放的,因此不需要占用连…...

【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动
[导读]本系列博文内容链接如下: 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动 在【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值一文中介绍了如何利用…...

Android 设备兼容性使用(详细版)
经典好文推荐,通过阅读本文,您将收获以下知识点: 一、设备兼容性分类 二、硬件设备兼容 三、软件 APP 兼容 四、兼容不同语言 五、兼容不同分辨率 六、兼容不同屏幕方向布局 七、兼容不同硬件 Feature 八、兼容不同SDK平台 一、设备兼容性分类 Android设计用于运行在许多不同…...

React 中的常见 API 和生命周期函数
目录 useStateuseEffectuseRefdangerouslySetInnerHTML生命周期函数 constructorcomponentDidMountstatic getDerivedStateFromPropsshouldComponentUpdatecomponentDidUpdatecomponentWillUnmount useState useState 是 React 的一个 Hook,用于在函数组件中添加…...

神经网络中遇到的 python 函数(Pytorch)
1.getattr() 函数用于返回一个对象属性值。 def getattr(object, name, defaultNone): # known special case of getattr"""getattr(object, name[, default]) -> valueGet a named attribute from an object; getattr(x, y) is equivalent to x.y.When a …...

分布式事务及解决方案
1、分布式事务 分布式事务就是在一个交易中各个服务之间的相互调用必须要同时成功或者同时失败,保持一致性和可靠性。在单体项目架构中,在多数据源的情况下也会发生 分布式事务问题。本质上来说,分布式事务就是为了保证不同数据库的数据一致性…...

【宏定义】——编译时校验
文章目录 编译时校验功能描述代码实现示例代码正常编译示例编译错误示例预处理之后的结果 代码解析!!estruct {int:-!!(e); }sizeof(struct {int:-!!(e); }) 参考代码 编译时校验 功能描述 用于在编译时检查一个条件是否为真,如果条件为真则会编译失败,…...

C#学习系列之System.Windows.Data Error: 40报错
C#学习系列之System.Windows.Data Error: 40报错 前言报错内容解决总结 前言 在用户界面使用上,代码运行没有问题,但是后台报错,仔细研究了报错内容,解决问题,所以记录一下。 报错内容 System.Windows.Data Error: 4…...

【java安全】RMI
文章目录 【java安全】RMI前言RMI的组成RMI实现Server0x01 编写一个远程接口0x02 实现该远程接口0x03 Registry注册远程对象 Client 小疑问RMI攻击 【java安全】RMI 前言 RMI全称为:Remote Method Invocation 远程方法调用,是java独立的一种机制。 RM…...

rcu链表综合实践
基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员,要先学会使用,再探究其内部原理。 链表的数据结构: struct list_head {struct list_head *next, *prev; };还有一种:struct h…...