栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

QT解决qt.network.ssl问题,最详细的版本(外加解析json数据)

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

QT解决qt.network.ssl问题,最详细的版本(外加解析json数据)

qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
在qt上用QJson解析数据,遇到上面的错误,困扰了几天,最开始时上面的错误报好多类似的问题,反正后来随便捣鼓就变成了上面一个错误了。

  1. 首先说下我遇到错误后,也差了很多资料,很多人也只是说说将C:QTToolsQtCreatorbin(前面的根据自己的qt安装路径, tools后不变的)文件下的libeay32.dll和ssleay32.dll 复制到…QT5.12.3mingw73_64bin中去就行了,但是事实并不是万能的,我想也不是我的问题,也不是你的问题,也是你碰巧你的程序可以运行了。到这里我就各种排除错误,这里写下我的解决方案。
  2. 首先吧上面的做法先做一遍。不管有没有用,万一有用你就不用看下面了,直接开始你的解析数据就行了。
  3. 万一没用,这里我就推荐先查一下自己qt自带的ssl 的版本是多少。用下面的代码即可。
#include 
#include "qdebug.h"
// 这个函数也要用对,我有次还用错了函数,弄了半天
qDebug()<< QSslSocket::sslLibraryBuildVersionString();

// 这里我的版本是这个 记住这个版本号
// "OpenSSL 1.0.2p  14 Aug 2018"
  1. 这里就用这个网站上下载对应的版本。这里千万不要追求使用最新版,我之前下载的就是最新版最上面的一个,然后我又没有查询上面的版本,所以苦恼了我一段时间。直接下载1.0.2版本即可。注意安装的时候点击bin目录下。
  2. 然后将C:Program FilesOpenSSL-Win64bin目录下的两个文件libcrypto-1_1-x64.dll 和libssl-1_1-x64.dll(1.0.2 版本对应下面的两个文件) 直接拷到E:QT5.12.3mingw73_64bin这里下,如果你用的mvsc的拷到对应的目录,这个应该懂的。
  3. 最后直接运行你的程序,你会发现没有烦恼了。
  4. 接下来就考试你的解析数据之旅了。解决问题了内心很快落~~~

总结:

  1. 有些方法可能通过其他人的示例,找到类似的解决方案,上面的解决方法差不多都是将两个文件拷贝到指定的文件夹下,但是可能由于版本的问题,一直折磨你,这时就要有前人之鉴,来解决自己的实际问题,毕竟不是每个人遇到的问题都是一样的,你自己总会要有一定的解决问题的能力。
  2. 我这里也是将我的实际遇到的问题记录下来,因为我遇到这个问题的同时,好像很多人没有版本问题,可能我的运气不好,安装的版本就是兼容,但是每条路都有解决方案的,要相信自己。

解析json数据

  1. 由于上面的代码是我在解析天气预报时遇到的,现在就拿这里做示例。
/// 原始的信息是这样子的。 下面的格式化,可以就到json在线解析
{"results":[{"location":{"id":"WT3Q0FW9ZJ3Q","name":"武汉","country":"CN","path":"武汉,武汉,湖北,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"多云","code":"4","temperature":"28"},"last_update":"2020-05-31T18:09:00+08:00"}]}
/// 解析好的格式清晰明了
{
    "results":[
        {
            "location":{
                "id":"WT3Q0FW9ZJ3Q",
                "name":"武汉",
                "country":"CN",
                "path":"武汉,武汉,湖北,中国",
                "timezone":"Asia/Shanghai",
                "timezone_offset":"+08:00"
            },
            "now":{
                "text":"多云",
                "code":"4",
                "temperature":"28"
            },
            "last_update":"2020-05-31T18:09:00+08:00"
        }
    ]
}
  1. 写函数进行解析
void Widget::replyFinished(QNetworkReply *reply)
{
    // qDebug() <<"recv weather data !!";
    QString all = reply->readAll();
    qDebug() << all;
	ui->textBrowser->setText(all);

//{
//"results":[
//   {
//       "location":{
//           "id":"WT3Q0FW9ZJ3Q",
//           "name":"武汉",
//           "country":"CN",
//           "path":"武汉,武汉,湖北,中国",
//           "timezone":"Asia/Shanghai",
//           "timezone_offset":"+08:00"
//       },
//       "now":{
//           "text":"多云",
//           "code":"4",
//           "temperature":"28"
//       },
//       "last_update":"2020-05-31T18:09:00+08:00"
//   }
//]
//}
    QJsonParseError err;
    /// @brief  解析json对象
    /// @param  all是json信息
    QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);
    qDebug() << err.error;   
	if (!json_recv.isNull())
	{
        // qDebug() << "json obj success!";
        QJsonObject root_obj = json_recv.object();
        QJsonValue res_val = root_obj.value("results");
        if(res_val.isArray())
        {
            QJsonObject res_obj = res_val.toArray().at(0).toObject();

            /// @brief 解析location键的值
            QJsonObject loc_obj = res_obj.value("location").toObject();
            QString id = loc_obj.value("id").toString();
            QString name = loc_obj.value("name").toString();
            QString country = loc_obj.value("country").toString();
            QString timezone = loc_obj.value("timezone").toString();
            QString  path = loc_obj.value("path").toString();
            qDebug () << "location end!";

            /// @brief 解析now
            QJsonObject now_obj = res_obj.value("now").toObject();
            QString text = now_obj.value("text").toString();
            QString temperature = now_obj.value("temperature").toString();
            qDebug() << "now end!";

            QString last_update = res_obj.value("last_update").toString();
            qDebug() << "update end!";

        }
	}
	else
	{
		qDebug() << "json obj failed !";
	}
	reply->deleteLater();
}
  1. 解析信息如下

    在这里就差不多已经好了!!!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/910397.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号