由于组内人员调动原因,组长找了一个可以实现web、小程序、Android、ios的跨平台运行的框架uni-app,考虑到便利性,移动端的制作很重要,且该框架可以实现较多运行方式,考虑到时间因素和经验因素,故我和组长一起进行移动端的开发。PC端的制作内容会在本章内简单讲述,细节部分不再详谈,并暂停PC端开发,视后续情况再考虑是否继续。

目录

一、界面设计基础完善

1、聊天界面

2、注册界面

二、功能实现

1、登陆后拉取并展示所需数据

(1)拉取数据

(2)展示数据


一、界面设计基础完善

1、聊天界面

布置了一个QTextEdit作为输入框,QListWidget作为输出框;

2、注册界面

新增了错误提示文字;(使用时,默认状态下全不可见,根据错误原因显示相应文字)

二、功能实现

1、登陆后拉取并展示所需数据

(1)拉取数据

登陆成功后,需要调用所给的可以拉取相应信息的接口,拉取最近会话列表、好友列表、群列表等并保存回调函数所传递的JSON文件,再将之展示出来;

//好友
void MainWindow::init_friendlist(){int ret=TIMFriendshipGetFriendProfileList([](int32_t code, const char* desc, const char* json_params, const void* user_data){if (ERR_SUCC != code){//失败friendlist_success=false;qDebug()<<"失败";}else{QJsonParseError json_error;QJsonDocument doucment = QJsonDocument::fromJson(json_params, &json_error);if (json_error.error == QJsonParseError::NoError){//qDebug()<<doucment;if(doucment.isNull()){friendlist_success=false;}else {friendlist_success=true;}friendlist=doucment;}else{qDebug()<<"error";}}
},nullptr);QtConcurrent::run(this,&MainWindow::emit_getfrilist);}

由于回调函数内无法直接调用函数,显示无法捕获this,而在[]中添加this则显示无对应函数可调用,找不到解决办法,最后发现可以使用全局变量保存数据,故后来使用全局变量保存,并再调用接口后另开线程(QtConcurrent)监听存储数据的全局变量是否非空(即传递过来的数据是否已保存),若非空则根据数据内容进行相应的后续处理。

此处由于多线程里只有主线程能对ui进行操作,故还需要其他线程发送信号让主线程接受并调用相应函数。

(其他回调函数带有数据的接口处理方法同上,后期不再提及)

//绑定相关信号与槽函数
connect(this,SIGNAL(getfrilist()),this,SLOT(set_friendlist()));//发送已获取好友列表信号
void MainWindow::emit_getfrilist(){while(friendlist.isNull()&&friendlist_success){if(!windowIsOpen) return;};emit getfrilist();
}//设置好友列表
void MainWindow::set_friendlist(){QJsonDocument friend_list=friendlist;//令重新为空QJsonDocument theNUll;friendlist=theNUll;if(friend_list.isArray()){const QJsonArray arr=friend_list.array();//增加初始分组“我的好友”;addNewFriGroup("我的好友");for(int i=0;i<arr.size();i++){QJsonObject oneOfFriend=arr[i].toObject();addNewFriGroupBuddy(oneOfFriend);}}}

(2)展示数据

各种列表使用QListWidget作为容器,在其中添加item后用自定义的不同的类(皆继承QWidget),将相应的内容放置于该类的变量中并调用setItemWidget替换;

ui->friend_list->setItemWidget(newItem,thefri);

聊天框消息内容从网上找了一个较为合适的聊天气泡与文字适配的相关代码,

void MessageFrame::adjustContent()
{QTextDocument *document=qobject_cast<QTextDocument*>(sender());document->adjustSize();if(document){document->setDocumentMargin(8);QTextEdit *editor = qobject_cast<QTextEdit*>(document->parent()->parent());if (editor) {QString text = editor->toPlainText().trimmed();if (text.isEmpty()) {return;}QFontMetrics mert  = editor->viewport()->fontMetrics();int nCount = text.count("\n");int width = mert.width(text);int height = mert.height();if (width > editor->maximumWidth() || (width < editor->maximumWidth() && nCount > 0)) {float fheight = (width / (300*1.0)) + nCount;int nheight = (width / (300*1.0)) + nCount;float d = fheight - nheight;if (fheight - nheight > 0 ) {nheight ++;}if (d < 0.5) {editor->setFixedSize(300, nheight * height + 28 );} else {editor->setFixedSize(300, nheight * height + 30 );}} else{editor->setFixedSize(width + 28, 36);}}}
}

并且点击列表相应对象可以呈现其相关信息;

在聊天框处点击气泡旁边的头像也可以呈现相应用户信息。

 

(3)图片下载

从网上搜寻了有关使用QT通过url下载图片的方法并保存到指定文件夹(文件夹已在使用该程序时,即登陆界面初始化时便已判断是否存在并创建);

    QString runPath = QCoreApplication::applicationDirPath();//获取当前运行程序所在目录QString dirName=runPath+"/SdkFile";QDir dir(dirName);if(!dir.exists()){dir.mkdir(dirName);qDebug()<<"文件夹创建成功";}dirName=runPath+"/PicSave";QDir dirpic(dirName);//创建图片文件夹if(!dir.exists()){dirpic.mkdir(dirName);qDebug()<<"文件夹创建成功";}
//判断图片是否存在QString runPath= QCoreApplication::applicationDirPath();//获取当前运行程序所在目录QString picid=m_pCurMessage.photo_large_id;QString picpath=runPath+"/PicSave/"+picid;QFileInfo fileinfo_tem(picpath);if(fileinfo_tem.isFile()){qDebug()<<"已存在";}else{qDebug()<<"图片不存在";downloadPicByUrl(m_pCurMessage.photo_large_url,picpath);}
//图片下载 url
bool MessageFrame::downloadPicByUrl(const QString &url, const QString &fileName){QNetworkAccessManager manager;QNetworkRequest request;request.setUrl(url);// 发送请求QNetworkReply *reply = manager.get(request);//开启一个局部的事件循环,等待响应结束,退出QEventLoop loop;QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));loop.exec();//判断是否出错,出错则结束qDebug()<<reply->error();if (reply->error() != QNetworkReply::NoError){return false;}//保存文件QFile file(fileName);if(!file.open(QIODevice::ReadWrite)){return false;}file.write(reply->readAll());file.close();delete reply;return true;
}

创新实训——飞讯(四)相关推荐

  1. 山东大学软件学院创新实训——飞讯(四)

    目录 一.目标概述 二.腾讯云im第三方回调 二.回调分类 三.回调示例 1.请求url 2.请求包示例 3.应答包示例 四.回调的保存 1.分析 2.实体类 3.controller层 4.serv ...

  2. 山东大学软件学院创新实训——飞讯(一)

    目录 一.项目介绍 二.docker的安装 1.服务器的配置 2.安装需要的包 3.添加GPG密匙,并添加Docker-ce软件源 4.安装Docker-ce 5.测试运行 6.添加当前用户到 doc ...

  3. 山东大学软件学院创新实训——飞讯(六)

    目录 一.突如起来的变化及内部调整 二.uni-app的学习 三.uni-app的搭建 登录界面 (1)界面设计 (2)核心代码 注册界面 (1)界面设计 (2)核心代码 四.总结 一.突如起来的变化 ...

  4. 创新实训——飞讯(一)

    一.项目简介 飞讯是一款为使小型团队作业更加便捷而设计的软件,包括单聊.群聊等功能.本人负责Windows端的开发. 二.第一周工作 采用QT开发,故第一周学习QT相关UI知识,包括可视化UI设计.代 ...

  5. 山东大学软件学院创新实训——飞讯(八)

    目录 一.目标概述 二.功能设计与实现 搜索好友 (1)界面设计 (2)功能实现 消息发送组件 (1)发送消息界面概览 (2)功能实现 三.总结 一.目标概述 经过前面对uniapp的学习和飞讯项目的 ...

  6. 山东大学软件学院创新实训——飞讯(十二)

    目录 一.目标概述 二.功能设计与实现 问卷首页 (1)界面设计 (2)功能实现 问卷详情页 (1)界面设计 (2)功能实现 问卷二维码 (1)界面设计 (2)功能实现 回答详情 (1)界面设计 (2 ...

  7. 创新实训——飞讯(二)

    因计划调整缘故,可直接从(五)看起. 目录 一.设计登录.注册界面 二.实现登录注册功能 一.设计登录.注册界面 利用所学的QT知识,利用可视化设计了一个基础的界面: 由于QT窗口自带一个较为丑陋的边 ...

  8. 山东大学软件学院创新实训——飞讯(二)

    目录 一.后端框架-springboot 二.springboot项目的创建 1.启动idea,依次选择File -->> New -->> project,弹出下框 ​编辑2 ...

  9. 山东大学软件学院创新实训——飞讯(十三)

    目录 一.目标概述 二.功能代码 1.问卷的创建 2.问题的回答 三.界面展示 四.总结 一.目标概述 这次项目完成的功能是问卷的创建和回答部分,我负责后端的编写,另外一位同学负责前端的编写,从而完成 ...

最新文章

  1. 自己写的Treeview控件绑定数据源
  2. 从「王师傅一共损失了多少钱」说开去
  3. Spring Cloud Gateway中异常处理
  4. 【C 语言】指针间接赋值 ( 间接赋值三要素 | 间接赋值 使用的三种场景 )
  5. boost::safe_numerics模块检查外部产生的价值可以被忽略的测试程序
  6. 好程序员分享Java开发常用规范技巧二
  7. yapi 接口文档_1分钟docker部署顶尖 API 文档管理系统
  8. TabActivity中子Activity相互跳转,及某个Tab需弹出窗的解决方案
  9. 机器学习--线性回归(LinearRegression)
  10. 实现2个整形变量的交换
  11. react-native-router-flux 使用详解(三)
  12. 修改统计信息自动收集时间窗口
  13. 数学常用特殊符号读音
  14. 三星服务器锁微信,三星手机微信支付设置指纹锁步骤
  15. [Ynoi2015]此时此刻的光辉
  16. php做个抽签人名,基于JS实现的随机数字抽签实例
  17. 春运火车上的这10种人,有一个就是你!
  18. 面试中可以谎报薪资嘛?
  19. 华为云“云上先锋”·AI主题赛(垃圾分类)-Top7复盘
  20. 关于mavon-editor中iframe 的使用 和插入视频、音频的记录

热门文章

  1. c语言父子进程,C语言无名管道实现父子进程间通信
  2. 匠心、坚守、机遇,80后量子通信研发团队的“量子梦”
  3. Linux_环境变量(PATH)
  4. 百度地图开发(五)之公交信息检索 + 路线规划
  5. Springboot整合springsession实现session共享
  6. 揭秘日本5G智慧杆案例!附国外多杆合一、智慧路灯杆体设计造型方案
  7. 定义一个数组,求数组所有元素之和
  8. 【JanusGraph】第七章:JanusGraph服务
  9. 商品分类 mysql表结构_商品多级分类,数据库设计
  10. Business collocations