增加上传可视化进度
之前我们传输图片的时候,只能通过服务器查看上传进度。客户端无法感知上传进度,所以考虑在图片传输基础上,显示上传进度。
封装可点击标签
1 |
|
具体实现
1 |
|
图片设置可点击和进度条

在图片中添加可点击的标签,并且添加进度条
1 |
|
构造函数里添加进度条和样式。
1 | PictureBubble::PictureBubble(const QPixmap &picture, ChatRole role, int total, QWidget *parent) |
设置传输状态为None,进度条初始值为0
调整界面设置,将图片拉伸包括进度条
1 | void PictureBubble::adjustSize() |
封装设置进度函数
1 | void PictureBubble::setProgress(int value) |
展示进度条
1 | void PictureBubble::showProgress(bool show) |
当传输停止后,点击后会恢复,恢复传输或者下载状态,逻辑如下
1 | void PictureBubble::resumeState() { |
设置状态逻辑如下, 状态分为None,下载,上传,暂停,传输完成,传输失败等。
1 | void PictureBubble::setState(TransferState state) |
为了更好的控制传输逻辑,将std::shared_ptr<MsgInfo>作为成员变量设置给PictureBubble
这样在点击图片后,可以发送图片关联的消息id和unique_name
点击图片触发槽函数
1 | void PictureBubble::onPictureClicked() |
根据状态发送不同的信号,如果是下载或者暂停状态,则发送暂停信号。
如果是暂停状态,则发送继续下载或者继续上传状态。
1 | void PictureBubble::updateIconOverlay() |
链接状态信号
在ChatPage的构造函数中添加信号和槽函数链接
1 | //链接暂停信号 |
槽函数中设置文件为暂停状态
1 | void ChatPage::on_clicked_paused(QString unique_name, TransferType transfer_type) |
槽函数中设置为续传或者下载状态,并且调用FileMgr续传之前未传递完成的内容
1 | void ChatPage::on_clicked_resume(QString unique_name, TransferType transfer_type) |
续传逻辑
FileTcpMgr发送信号sig_continue_upload_file, 这么做的好处是,发送信号的线程和接收信号的线程不一致,也可以跨线程调用。
1 | void FileTcpMgr::ContinueUploadFile(QString unique_name) { |
在FileTcpMgr中链接了这个信号
1 | //链接续传信号 |
槽函数slot_continue_upload_file
1 | void FileTcpMgr::slot_continue_upload_file(QString unique_name) { |
ID_IMG_CHAT_CONTINUE_UPLOAD_REQ为断点续传请求
1 | ID_IMG_CHAT_CONTINUE_UPLOAD_REQ = 1043, //续传聊天图片资源请求 |
响应续传回复
1 | _handlers.insert(ID_IMG_CHAT_CONTINUE_UPLOAD_RSP, [this](ReqId id, int len, QByteArray data) { |
sig_update_upload_progress信号为更新进度,因为在接收到服务器回包前,文件状态可能被设置为暂停,所以要判断一下文件状态是否为暂停,如果为暂停,则不发送后续内容。否则直接发送后续内容。
sig_update_upload_progress信号,也会在正常上传服务器,服务器回复给客户端时,客户端发送
比如上传图片信息回复逻辑里
1 | _handlers.insert(ID_IMG_CHAT_UPLOAD_RSP, [this](ReqId id, int len, QByteArray data) { |
同步信息回复也会发送进度上传信号
1 | _handlers.insert(ID_FILE_INFO_SYNC_RSP, [this](ReqId id, int len, QByteArray data) { |
在ChatPage中链接进度上传信号和槽函数
1 | //接收tcp返回的上传进度信息 |
接收进度上传信号
1 | void ChatDialog::slot_update_upload_progress(std::shared_ptr<MsgInfo> msg_info) { |
调用ChatPage的UpdateFileProgress函数
1 | void ChatPage::UpdateFileProgress(std::shared_ptr<MsgInfo> msg_info) { |
根据消息类型为图片,则调用PictureBubble更新图片进度
服务器
ResoureServer服务器要响应断点续传请求
LogicWorker注册消息处理
1 | _fun_callbacks[ID_IMG_CHAT_CONTINUE_UPLOAD_REQ] = [this](shared_ptr<CSession> session, const short& msg_id, |
在FileWorker响应图片上传逻辑
1 | //处理续传图片请求 |
效果展示

