QT天气预报

 json

理论

什么是JSON?

规则

被大括号包括的是JSON对象,被中括号包括的是JSON数组.


JSON数组JSON对象

实验

构建JSON

用代码实现如下json内容:

//构建JSON
void WirteJson()
{QJsonObject rootObject;//1.插入name字段rootObject.insert("name","china");//2.插入info字段QJsonObject infoObj;infoObj.insert("capital","beijing");infoObj.insert("asian",true);infoObj.insert("founded",1949);rootObject.insert("info",infoObj);//3.插入省份字段QJsonObject provinsSD;provinsSD.insert("name","shandong");provinsSD.insert("capital","jinan");QJsonObject provinsZJ;provinsZJ.insert("name","zhejiang");provinsZJ.insert("capital","hangzhou");QJsonArray provinArray;provinArray.append(provinsSD);provinArray.append(provinsZJ);rootObject.insert("provinces",provinArray);//4.将rootObj转换为json字符串QJsonDocument doc(rootObject);QByteArray json=doc.toJson();//5.打印输出qDebug()<<QString(json).toUtf8().data();//6.将json字符串写入到文件QFile file("D:\\QTproject\\JSON.json");file.open(QFile::WriteOnly);file.write(json);file.close();
}

解析JSON

//解析json字符串
void JsonFrom()
{//1.读取文件QFile file("D:\\QTproject\\JSON.json");file.open(QFile::ReadOnly);QByteArray json=file.readAll();file.close();//获取一下json源QJsonDocument doc=QJsonDocument::fromJson(json);if(!doc.isObject()){qDebug()<<"not is a JSONObject!";return;}//name字段QJsonObject obj=doc.object();QStringList Keys=obj.keys();for(int i=0;i<Keys.size();i++){//获取key-valueQString key=Keys[i];QJsonValue value=obj.value(key);if(value.isBool()){qDebug()<<key<<":"<<value.toBool();}else if(value.isString()){qDebug()<<key<<":"<<value.toString();}else if(value.isDouble()){qDebug()<<key<<":"<<value.toInt();}//info字段else if(value.isObject()){qDebug()<<key<<":";QJsonObject infoObj=value.toObject();QString capital=infoObj["capital"].toString();bool asian=infoObj["asian"].toBool();int founded=infoObj["founded"].toInt();qDebug()<<"capital"<<" : "<<capital;qDebug()<<"asian"<<" : "<<asian;qDebug()<<"founded"<<" : "<<founded;}//省份字段else if(value.isArray()){qDebug()<<key<<":";QJsonArray provinceArray=value.toArray();for(int i=0;i<provinceArray.size();i++){QJsonObject provinceObj=provinceArray[i].toObject();QString name=provinceObj["name"].toString();QString capital=provinceObj["capital"].toString();qDebug()<<"name"<<" : "<<name;qDebug()<<"capital"<< " : "<<capital;}}}
}

HTTP

HTTP理论

布局

代码实现

取消主界面自带边框

    setWindowFlag(Qt::FramelessWindowHint);  //设置窗口无边框setFixedSize(width(),height());  //设置窗口固定大小

 设置右键弹出退出按钮

    mExitAct->setText("退出");mExitAct->setIcon(QIcon(":/res/close.ico"));mExitMenu->addAction(mExitAct);  //将我们的行为添加到出菜单里

响应鼠标事件

 //弹出右键菜单
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{mExitMenu->exec(QCursor::pos());  //传送鼠标位置
}

 绑定信号槽

    connect(mExitAct,QAction::triggered,this,[=]{qApp->exit(0);});

去掉了系统自带的标题栏就无法拖动窗口了,我们需要自己实现通过鼠标拖动窗口的功能.

实现自定义拖动窗体功能

定义一个变量

    QPoint mOffset;  //鼠标离左上角的距离

定义两个方法

   //处理鼠标点击事件   void mousePressEvent(QMouseEvent *event);//处理鼠标移动事件void mouseMoveEvent(QMouseEvent *event);

方法实现

//处理鼠标点击事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{mOffset = event->globalPos() - this->pos();
}//处理鼠标移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{this->move(event->globalPos() - mOffset);
}当鼠标点击时会调

用mousePressEvent()函数,获取鼠标点击的位置,当鼠标按住移动的时候会调用 mouseMoveEvent()函数,会用鼠标当前位置减去左上角位置就是移动的位置.从而实现拖动窗体的效果.

利用网络获取天气

声明一个 QNetworkAccessManager类型的对象:

 QNetworkAccessManager *mNetAccessManager;

把 mNetAccessManager对象创建出来:

 mNetAccessManager =new QNetworkAccessManager(this);

关联信号槽

将mNetworkAccessManager的finish信号,与自定义的onReplied槽函数进行关联: 

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{    
mNetAccessManager =new QNetworkAccessManager(this);
connect(mNetAccessManager,&QNetworkAccessManager::finished,this,&MainWindow::onReplied);
getWeatherInfo("101010100");
}

发送http请求

在mainwindow.h文件里声明一个getWeatherInfo()函数用来发送http的成员函数:

class MainWindow : public QMainWindow
{ 
protected:void getWeatherInfo(QString citycode);
}

调用getWeatherInfo()函数来从网络中获取天气:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{    
//请求北京的天气
getWeatherInfo("101010100");  //北京的城市码
}
//通过输入一个城市的代码获取这个城市的天气
void MainWindow::getWeatherInfo(QString citycode)
{QUrl url("http://t.weather.itboy.net/api/weather/city/101010100"+citycode);mNetAccessManager->get(QNetworkRequest(url));
}

接收服务端数据

当http请求完毕,返回数据的时候,mNetAccessManager就会发射一个finished信号, 进而调用onReplied()槽函数.

定义onReplied()函数:

void MainWindow::onReplied(QNetworkReply *reply)
{qDebug()<<"onReplied success";int status_code=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
}

此时响应头,状态码,响应体,城市码,这些都在reply里存着.我们可以将这些信息打印出来看看:

void MainWindow::onReplied(QNetworkReply *reply)
{qDebug()<<"onReplied success";int status_code=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();qDebug()<<"operation: "<<reply->operation();qDebug()<<"status code: "<<status_code;qDebug()<<"url: "<<reply->url();qDebug()<<"raw header: "<<reply->rawHeaderList();
}

增强代码健壮性:

void MainWindow::onReplied(QNetworkReply *reply)
{qDebug()<<"onReplied success";int status_code=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();if(reply->error()!=QNetworkReply::NoError||status_code!=200){qDebug()<<reply->errorString().toLatin1().data();QMessageBox::warning(this,"天气","请求数据失败",QMessageBox::Ok);}else{QByteArray byteArray = reply->readAll();qDebug()<<"read all: "<<byteArray.data();}reply->deleteLater();
}

 至此我们已经可以获取出北京市的天气了:

我们把这些数据放到json解析器就可以看的比较清楚: 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

威胁建模STRIDE框架

威胁建模STRIDE框架 1.威胁建模框架概述2.STRIDE威胁建模框架欺骗 - 冒充某人或某物篡改 - 未经授权更改数据否认性 - 不宣称对执行的操作负责信息泄露 - 查看不应查看的数据拒绝服务 - 系统繁忙权限提升 - 拥有本不应该拥有的权限 3.后续的威胁发现 1.威胁建模框架概述 威胁建…

vxe-table之复选框 设置父子节点不互相关联

通过 checkStrictly 设置父子节点不互相关联&#xff0c;默认不显示头部复选框&#xff0c;可以通过 checkbox-config{showHeader} 设置 <template><div><vxe-table:column-config"{resizable: true}":data"tableData":tree-config"{…

sharding-jdbc metadata load优化(4.1.1版本)

背景 系统启动时&#xff0c;会注意sharding-jdbc提示加载metadata 于是想看看里面做了什么事情 问题追踪 debug后可以观察走到了该类 org.apache.shardingsphere.shardingjdbc.jdbc.core.context.ShardingRuntimeContext#loadSchemaMetaData 先看这个shardingRuntimeConte…

嵌入式-QT学习-小练习

1. 实现多窗口 2. 给按键增加图标 3. 动图展示 结果演示&#xff1a; Mul_Con main.cpp #include "widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }一、第一个窗口展示 …

Android 测试机

要测手机应用&#xff0c;直接挂电脑上跑虚拟机的话&#xff0c;怀疑电脑都要起火了。 eBay 上买了个新的机器&#xff0c;也才 100 美元多点&#xff0c;机器都没有拆过&#xff0c;电池是完全无电的状态。 操作系统是 Android 12 的版本&#xff0c;升级到 Android 14 后&am…

苹果CMS vs. 海洋CMS:哪个系统更易于百度收录?

在选择网站内容管理系统&#xff08;影视网站选择那个CMS&#xff1f;&#xff09;时&#xff0c;收录效率和优化能力是关键考量因素。苹果CMS和海洋CMS都是受欢迎的选项&#xff0c;但在百度收录效果上&#xff0c;苹果CMS表现得更为出色。以下将详细探讨苹果CMS为何在百度收录…

uni-app生命周期(三)

文章目录 一、uni-app的生命周期二、应用生命周期三、页面的生命周期函数1.简介2.页面加载时序介绍3.页面加载常见问题4.页面加载顺序4.部分生命周期介绍 四、组件的生命周期函数 一、uni-app的生命周期 应用生命周期&#xff08;整个App的生命周期&#xff09; 在app.vue里面…

是德keysight N7552A 9G电子校准件2端口

是德keysight N7552A 9G电子校准件2端口 频率范围为直流到 9 GHz 支持 N 型和 3.5 mm 连接器 更小、更轻巧的 2 端口电子校准件 零等待时间&#xff0c;实现更快校准 兼具电子校准件的便利性与经济型机械套件的性能 N7552A 支持是德科技的 PNA-X、PNA、ENA、PXI 矢量网络分…

四、滑动窗口-算法总结

文章目录 四、滑动窗口4.1 模板4.2 示例4.2.1 最小覆盖子串4.2.2 字符串的排列4.2.3 找到字符串中所有字母异位词4.2.4 无重复字符的最长子串 四、滑动窗口 4.1 模板 /* 滑动窗口算法框架 */ void slidingWindow(string s, string t) {unordered_map<char, int> need, …

QT::QComboBox自定义左击事件信号

因为QComboBox没有自定义的clink信号&#xff0c;所以自己新建一个MyComBox类继承QComboBox&#xff0c;并且添加自定义的左击信号&#xff0c;以及使用该信号连接一个槽函数 mycombobox.h #ifndef MYCOMBOBOX_H #define MYCOMBOBOX_H#include <QComboBox> #include &l…

在 Mac 上安装虚拟机怎么样,安装虚拟机与直接安装 Windows 系统有区别吗?

随着跨系统操作的不断发展&#xff0c;虚拟机技术在生产力领域扮演着越来越重要的角色。Mac作为一款主流的操作系统&#xff0c;也有着运行虚拟机的能力。接下来给大家介绍Mac装虚拟机好不好&#xff0c;Mac装虚拟机和装Windows系统一样吗的具体内容。 Mac装虚拟机好不好 Mac…

通信工程学习:什么是FDMA频分多址

FDMA&#xff1a;频分多址 FDMA&#xff08;Frequency Division Multiple Access&#xff0c;频分多址&#xff09;是一种在无线通信领域广泛应用的多址技术。该技术通过将可用的频谱资源按频率划分&#xff0c;把传输频带划分为若干较窄且互不重叠的子频带&#xff08;或称信道…

SprinBoot+Vue爱老助老服务平台的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

c/c++面试100道

1.一道笔试题解析_哔哩哔哩_bilibili P20&#xff1a;#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER) 1、 offsetof 宏是 C 语言中用于计算结构体成员相对于结构体起始地址的偏移量的宏定义。这个宏的定义如下&#xff1a; #define offsetof(TYPE, …

JavaScript模块化——ES6模块化规范

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;vscode Chrome浏览器 1.ES6 1.1ES6介绍 ES6的全称是ECMAScript 6&#xff0c;也称为ES2015&#xff0c;是JavaScript的一个重要版本&#xff0c;它引入了许多新特性和改进&#xf…

Linux搭建邮箱服务器(简易版)

本章是上一文档的简易版本搭建方式更为快速简洁&#xff08;只需要两条命令即可搭建&#xff09;&#xff0c;如果想了解更详细一些可以看我上一文档 Linux接发邮件mailx_linux mailx o365-CSDN博客文章浏览阅读857次&#xff0c;点赞25次&#xff0c;收藏19次。本文详细描述了…

独立站内容营销SOP 1.0 丨出海笔记

提到内容营销&#xff0c;可能很多朋友都听过但没深入做&#xff0c;国内跨境独立站通过内容营销做的大流量的目前不多&#xff0c;哪怕大如 Shein, Anker&#xff0c;大部分时候还是在买量获客的阶段。 但大家只要明白一点即可&#xff1a;内容做得好不好&#xff0c;直接影响…

文档智能:OCR+Rocketqa+layoutxlm

此次先记录LayoutLMv2&#xff0c;梳理相关论文&#xff0c;记录如下&#xff1a; 首先认识一下 visually-rich document understanding tasks → \to → VrDU 其次&#xff0c;the text fields of interest&#xff0c;与图像识别的感兴趣区域 region of Interest 类似&…

【脑机接口】脑机接口性能的电压波形的尖峰分类和阈值比较

Comparison of spike sorting and thresholding of voltage waveforms for intracortical brain–machine interface performance 脑机接口性能的电压波形的尖峰分类和阈值比较论文下载&#xff1a;摘要1 介绍2 方法2.1数据获取2.2spike sorting 技术2.3神经数据分析 3结果3.1神…

社交媒体的未来:Facebook如何通过AI技术引领潮流

在数字化时代的浪潮中&#xff0c;社交媒体平台不断演变&#xff0c;以适应用户需求和技术发展的变化。作为全球领先的社交媒体平台&#xff0c;Facebook在这一进程中扮演了重要角色。尤其是人工智能&#xff08;AI&#xff09;技术的应用&#xff0c;正在深刻地改变Facebook的…