P7 QT项目----会学天气预报(完结)

7.8 QMap
在 Qt 中,如果你想要将 JSON 数据解析到一个 QMap 中,你可以遍历 JSON 对象的所有键值对,并将它们添加到 QMap 里。这个方法特别适合于当你的 JSON 对象是一个简单的键值对集合时。以下是一个如何实现这一点的示例。
示例:将 JSON 数据解析到 QMap
假设你有以下 JSON 数据:
json
{
"name" : "John Doe" ,
"age" : "30" ,
"email" : "john.doe@example.com"
}
以下是如何将这些数据解析到 QMap<QString, QString> 中的步骤:
#include <QJsonDocument>
#include <QJsonObject>
#include <QMap>
#include <QDebug>
void parseJsonToMap() {
// JSON字符串
QString jsonString = R"(
{
"name": "John Doe",
"age": "30",
"email": "john.doe@example.com"
}
)";
// 将JSON字符串转换为QJsonDocument
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
// 准备一个QMap来存储解析的数据
QMap<QString, QString> dataMap;
// 解析JSON对象并填充QMap
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
QJsonObject jsonObj = jsonDoc.object();
for (auto key : jsonObj.keys()) {
dataMapkey = jsonObj.value(key).toString();
}
} else {
qDebug() << "Invalid JSON...";
}
// 打印QMap内容
for (auto key : dataMap.keys()) {
qDebug() << key << ":" << dataMapkey;
}
}
int main() {
parseJsonToMap();
return 0;
}

  1. JSON 字符串创建 QJsonDocument :使用 QJsonDocument::fromJson 来解析 JSON 字符串。
  2. 创建 QMap :定义一个 QMap<QString, QString> 来存储键值对。
  3. 遍历 JSON 对象 :使用 keys() 方法获取所有键,然后遍历这些键,将对应的值添加到 QMap 中。
  4. 打印 QMap 内容 :遍历 QMap 并打印键值对。
    这个示例展示了如何将 JSON 对象的键值对解析到 QMap 中。这种方法适用于键值对类型的简单 JSON 对象。对于更复杂的JSON 结构,可能需要更详细的解析逻辑
复制代码
#include "widget.h"
复制代码
#include "ui_widget.h"
复制代码
复制代码
#include <QNetworkAccessManager>
复制代码
#include <QNetworkRequest>
复制代码
#include <QNetworkReply>
复制代码
#include <QDebug>
复制代码
#include <QMessageBox>
复制代码
#include <QJsonDocument>
复制代码
#include <QByteArray>
复制代码
#include <QFile>
复制代码
#include <QJsonObject>
复制代码
#include <QJsonArray>
复制代码
#include <QPainter>
复制代码
复制代码
Widget::Widget(QWidget *parent)
复制代码
    : QWidget(parent)
复制代码
    , ui(new Ui::Widget)
复制代码
{
复制代码
    ui->setupUi(this);
复制代码
复制代码
    //窗体无状态栏
复制代码
    //setWindowFlag(Qt::FramelessWindowHint);
复制代码
复制代码
    //界面跟随
复制代码
    this->setLayout(ui->verticalLayout);
复制代码
复制代码
    //QMenu菜单组件
复制代码
    menuQuit = new QMenu(this);
复制代码
    //设置菜单项文字颜色
复制代码
    menuQuit->setStyleSheet("QMenu::item{color : red}");
复制代码
    //用户点击菜单项并点击后回调函数,推出程序
复制代码
    connect(menuQuit,&QMenu::triggered,[=](){
复制代码
        this->close();
复制代码
    });
复制代码
复制代码
    //由QNetworkAccessManager发起get请求
复制代码
    mannager = new  QNetworkAccessManager(this);
复制代码
    //QNetworkReply * get(const QNetworkRequest &request)  QNetworkRequest(const QUrl &url = QUrl())
复制代码
    //strurl = "http://gfeljm.tianqiapi.com/api?unescape=1&version=v63&appid=76269866&appsecret=VRtxb7NZ";
复制代码
    strurl = "http://gfeljm.tianqiapi.com/api?unescape=1&version=v9&appid=76269866&appsecret=VRtxb7NZ";
复制代码
    QUrl urlNetId(strurl);
复制代码
    //指定请求url地址
复制代码
    QNetworkRequest request(urlNetId);
复制代码
    reply = mannager->get(request);
复制代码
    //QNetworkRequest网络请求后进行数据读取
复制代码
    connect(mannager,&QNetworkAccessManager::finished,this,&Widget::readHTTPSerial);
复制代码
复制代码
    mWeekList << ui->label_day0 << ui->label_day1
复制代码
              << ui->label_day2 << ui->label_day3
复制代码
              << ui->label_day4 << ui->label_day5;
复制代码
复制代码
    mDateList << ui->label_date0 << ui->label_date1
复制代码
              << ui->label_date2 << ui->label_date3
复制代码
              << ui->label_date4 << ui->label_date5;
复制代码
复制代码
    mIconList <<ui->label_weaIcon0 <<ui->label_weaIcon1
复制代码
             <<ui->label_weaIcon2 <<ui->label_weaIcon3
复制代码
            <<ui->label_weaIcon4 <<ui->label_weaIcon5;
复制代码
复制代码
    mWeaTypeList << ui->label_weaType0 << ui->label_weaType1
复制代码
                 << ui->label_weaType2 << ui->label_weaType3
复制代码
                 << ui->label_weaType4 << ui->label_weaType5;
复制代码
复制代码
    mAirqList << ui->label_Airq0 << ui->label_Airq1
复制代码
              << ui->label_Airq2 << ui->label_Airq3
复制代码
              << ui->label_Airq4 << ui->label_Airq5;
复制代码
复制代码
    mFxList << ui->label_Fx0 << ui->label_Fx1
复制代码
            << ui->label_Fx2 << ui->label_Fx3
复制代码
            << ui->label_Fx4 << ui->label_Fx5;
复制代码
复制代码
    mFlList << ui->label_Fl0 << ui->label_Fl1
复制代码
            << ui->label_Fl2 << ui->label_Fl3
复制代码
            << ui->label_Fl4 << ui->label_Fl5;
复制代码
复制代码
    //根据天气,设置icon的路径
复制代码
    mTypeMap.insert("暴雪",":/res/type/BaoXue.png");
复制代码
    mTypeMap.insert("暴雨",":/res/type/BaoYu. png");
复制代码
    mTypeMap.insert("暴雨到大暴雨",":/res/type/BaoYuDaoDaBaoYu.png");
复制代码
    mTypeMap.insert("大暴雨",":/res/type/DaBaoYu.png");
复制代码
    mTypeMap.insert("大暴雨到特大暴雨",":/res/type/DaBaoYuDaoTeDaBaoYu.png");
复制代码
    mTypeMap.insert("大到暴雪",":/res/type/DaDaoBaoXue.png");
复制代码
    mTypeMap.insert("大雪",":/res/type/DaXue.png");
复制代码
    mTypeMap.insert("大雨",":/res/type/DaYu.png");
复制代码
    mTypeMap.insert("冻雨",":/res/type/DongYu.png");
复制代码
    mTypeMap.insert("多云",":/res/type/DuoYun.png");
复制代码
    mTypeMap.insert("浮沉",":/res/type/FuChen.png");
复制代码
    mTypeMap.insert("雷阵雨",":/res/type/LeiZhenYu.png");
复制代码
    mTypeMap.insert("雷阵雨伴有冰雹",":/res/type/LeiZhenYuBanYouBingBao.png");
复制代码
    mTypeMap.insert("霾",":/res/type/Mai.png");
复制代码
    mTypeMap.insert("强沙尘暴",":/res/type/QiangShaChenBao.png");
复制代码
    mTypeMap.insert("晴",":/res/type/Qing.png");
复制代码
    mTypeMap.insert("沙尘暴",":/res/type/ShaChenBao.png");
复制代码
    mTypeMap.insert("特大暴雨",":/res/type/TeDaBaoYu.png");
复制代码
    mTypeMap.insert("undefined",":/res/type/undefined.png");
复制代码
    mTypeMap.insert("雾",":/res/type/Wu.png");
复制代码
    mTypeMap.insert("小到中雪",":/res/type/XiaoDaoZhongXue.png");
复制代码
    mTypeMap.insert("小到中雨",":/res/type/XiaoDaoZhongYu.png");
复制代码
    mTypeMap.insert("小雪",":/res/type/XiaoXue.png");
复制代码
    mTypeMap.insert("小雨",":/res/type/XiaoYu.png");
复制代码
    mTypeMap.insert("雪",":/res/type/Xue.png");
复制代码
    mTypeMap.insert("扬沙",":/res/type/YangSha.png");
复制代码
    mTypeMap.insert("阴",":/res/type/Yin.png");
复制代码
    mTypeMap.insert("雨",":/res/type/Yu.png");
复制代码
    mTypeMap.insert("雨夹雪",":/res/type/YuJiaXue.png");
复制代码
    mTypeMap.insert("阵雪",":/res/type/ZhenXue.png");
复制代码
    mTypeMap.insert("阵雨",":/res/type/ZhenYu.png");
复制代码
    mTypeMap.insert("中到大雪",":/res/type/ZhongDaoDaXue.png");
复制代码
    mTypeMap.insert("中到大雨",":/res/type/ZhongDaoDaYu.png");
复制代码
    mTypeMap.insert("中雪",":/res/type/ZhongXue.png");
复制代码
    mTypeMap.insert("中雨",":/res/type/ZhongYu.png");
复制代码
复制代码
    ui->widget_07->installEventFilter(this);
复制代码
    ui->widget_08->installEventFilter(this);
复制代码
}
复制代码
复制代码
Widget::~Widget()
复制代码
{
复制代码
    delete ui;
复制代码
}
复制代码
复制代码
/* 解析当天天气的Json文件 */
复制代码
//void Widget::PaserWeatherFromJson(QByteArray rawData)
复制代码
//{
复制代码
//    //获取天气,QByteArray转为QJsonDocument
复制代码
//    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
复制代码
//    //文本不为空且是键值表,QJsonDocument转为QJsonObject
复制代码
//    if(!jsonDoc.isNull() && jsonDoc.isObject()){
复制代码
//        QJsonObject jsonObj = jsonDoc.object();
复制代码
//        //日期
复制代码
//        ui->label_date0102->setText(jsonObj["date"].toString() +
复制代码
//                "  " + jsonObj["week"].toString());
复制代码
//        //城市
复制代码
//        ui->label_city02->setText(jsonObj["city"].toString());
复制代码
//        //温度
复制代码
//        ui->label_temp02->setText(jsonObj["tem"].toString() + "℃");
复制代码
//        //天气
复制代码
//        ui->label_weather02->setText(jsonObj["wea"].toString());
复制代码
//        //天气图标
复制代码
//        ui->label_icon02->setPixmap(mTypeMap[jsonObj["wea"].toString()]);
复制代码
//        //温度范围
复制代码
//        ui->label_weatherdata02->setText(jsonObj["tem2"].toString() +
复制代码
//                "~" + jsonObj["tem1"].toString() + "℃");
复制代码
//        //感冒指数
复制代码
//        ui->label_text0301->setText(jsonObj["air_tips"].toString());
复制代码
//        //风向
复制代码
//        ui->label_FX->setText(jsonObj["win"].toString());
复制代码
//        //风速
复制代码
//        ui->label_FXdata->setText(jsonObj["win_speed"].toString());
复制代码
//        //湿度
复制代码
//        ui->label_SDdata->setText(jsonObj["humidity"].toString());
复制代码
//        //PM值
复制代码
//        ui->label_PMdata->setText(jsonObj["air_pm25"].toString());
复制代码
//        //空气质量
复制代码
//        ui->label_airQdata->setText(jsonObj["air_level"].toString());
复制代码
//    }
复制代码
//}
复制代码
复制代码
/* 解析7天天气的Json文件 */
复制代码
void Widget::PaserWeatherFromJsonNew(QByteArray rawData)
复制代码
{
复制代码
    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
复制代码
    if(!jsonDoc.isNull() && jsonDoc.isObject()){
复制代码
        QJsonObject jsonRoot = jsonDoc.object();
复制代码
        days[0].mCity = jsonRoot["city"].toString();
复制代码
        days[0].mPM25 = jsonRoot["aqi"].toObject()["pm25"].toString();
复制代码
        qDebug() << days[0].mPM25;
复制代码
复制代码
        if(jsonRoot.contains("data") && jsonRoot["data"].isArray()){
复制代码
            QJsonArray dataArray = jsonRoot["data"].toArray();
复制代码
            for (int i = 0; i < dataArray.size(); i++) {
复制代码
                QJsonObject jsonObj = dataArray[i].toObject();
复制代码
                days[i].mDate = jsonObj["date"].toString();
复制代码
                days[i].mWeek = jsonObj["week"].toString();
复制代码
                days[i].mTem = jsonObj["tem"].toString();
复制代码
                days[i].mWea = jsonObj["wea"].toString();
复制代码
                days[i].mTemLow = jsonObj["tem2"].toString();
复制代码
                days[i].mTemHigh = jsonObj["tem1"].toString();
复制代码
                days[i].mTips = jsonObj["air_tips"].toString();
复制代码
                days[i].mFx = jsonObj["win"].toArray()[0].toString();
复制代码
                days[i].mFl = jsonObj["win_speed"].toString();
复制代码
                days[i].mHumidity = jsonObj["humidity"].toString();
复制代码
                days[i].mAirq = jsonObj["air_level"].toString();
复制代码
            }
复制代码
        }
复制代码
    }
复制代码
    updateUI();
复制代码
}
复制代码
复制代码
void Widget::updateUI()
复制代码
{
复制代码
    QPixmap pixmap;
复制代码
复制代码
    //日期
复制代码
    ui->label_date0102->setText(days[0].mDate + days[0].mWeek);
复制代码
    //城市
复制代码
    ui->label_city02->setText(days[0].mCity);
复制代码
    //温度
复制代码
    ui->label_temp02->setText(days[0].mTem + "℃");
复制代码
    //天气
复制代码
    ui->label_weather02->setText(days[0].mWea);
复制代码
    //天气图标
复制代码
    ui->label_icon02->setPixmap(mTypeMap[days[0].mWea]);
复制代码
    //温度范围
复制代码
    ui->label_weatherdata02->setText(days[0].mTemLow +
复制代码
            " ~ " + days[0].mTemHigh + "℃");
复制代码
    //感冒指数
复制代码
    ui->label_text0301->setText(days[0].mTips);
复制代码
    //风向
复制代码
    ui->label_FX->setText(days[0].mFx);
复制代码
    //风速
复制代码
    ui->label_FXdata->setText(days[0].mFl);
复制代码
    //湿度
复制代码
    ui->label_SDdata->setText(days[0].mHumidity);
复制代码
    //PM值
复制代码
    ui->label_PMdata->setText(days[0].mPM25);
复制代码
    //空气质量
复制代码
    ui->label_airQdata->setText(days[0].mAirq);
复制代码
复制代码
    //遍历ui界面的label
复制代码
    for (int i = 0; i < 6; i++) {
复制代码
        //设置日期
复制代码
        mWeekList[i]->setText(days[i].mWeek);
复制代码
        mWeekList[0]->setText("今天");
复制代码
        mWeekList[1]->setText("明天");
复制代码
        mWeekList[2]->setText("后天");
复制代码
复制代码
        //设置日期
复制代码
        QStringList dayList = days[i].mDate.split("-");
复制代码
        //只显示月日,不显示年,用-分隔开
复制代码
        mDateList[i]->setText(dayList.at(1)+"-"+dayList.at(2));
复制代码
复制代码
        //设置图像
复制代码
        int indexpixMAp = days[i].mWea.indexOf("转");
复制代码
        //显示转的左边相符天气的图片
复制代码
        if(indexpixMAp != -1){
复制代码
            pixmap = mTypeMap[days[i].mWea.left(indexpixMAp)];
复制代码
        }
复制代码
        else {
复制代码
            pixmap = mTypeMap[days[i].mWea];
复制代码
        }
复制代码
        //设置图片的样式scaled
复制代码
        pixmap = pixmap.scaled(mIconList[i]->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
复制代码
        //设置图片的宽度与高度
复制代码
        mIconList[i]->setMaximumWidth(ui->widget_05->width()/6.5);
复制代码
        mIconList[i]->setMaximumHeight(50);
复制代码
        mIconList[i]->setPixmap(pixmap);
复制代码
复制代码
        //设置天气类型
复制代码
        mWeaTypeList[i]->setText(days[i].mWea);
复制代码
复制代码
        //设置天气质量
复制代码
        QString daysAirq = days[i].mAirq;
复制代码
        mAirqList[i]->setText(daysAirq);
复制代码
        if(daysAirq == "优"){
复制代码
            //设置背景
复制代码
              mAirqList[i]->setStyleSheet("background-color: rgb(86, 223, 48);color: rgb(255, 255, 255);border-radius:7px;");
复制代码
        }
复制代码
        if(daysAirq == "良"){
复制代码
              mAirqList[i]->setStyleSheet("background-color: rgb(255, 184, 70);color: rgb(255, 255, 255);border-radius:7px;");
复制代码
        }
复制代码
        if(daysAirq == "轻度"){
复制代码
              mAirqList[i]->setStyleSheet("background-color: rgb(245, 223, 48);color: rgb(255, 255, 255);border-radius:7px;");
复制代码
        }
复制代码
        if(daysAirq == "中度"){
复制代码
              mAirqList[i]->setStyleSheet("background-color: rgb(245, 82, 84);color: rgb(255, 255, 255);border-radius:7px;");
复制代码
        }
复制代码
        if(daysAirq == "中度"){
复制代码
              mAirqList[i]->setStyleSheet("background-color: rgb(255, 0, 0);color: rgb(255, 255, 255);border-radius:7px;");
复制代码
        }
复制代码
复制代码
        //设置风向
复制代码
        mFxList[i]->setText(days[i].mFx);
复制代码
复制代码
        //设置风力
复制代码
        int indexFl = days[i].mFl.indexOf("转");
复制代码
        //显示转的左边相符天气的风力
复制代码
        if(indexFl != -1){
复制代码
            mFlList[i]->setText(days[i].mFl.left(indexFl));
复制代码
        }
复制代码
        else {
复制代码
            mFlList[i]->setText(days[i].mFl);
复制代码
        }
复制代码
    }
复制代码
复制代码
    //更新显示
复制代码
    update();
复制代码
}
复制代码
复制代码
复制代码
复制代码
/* 获取天气的Json文件 */
复制代码
void Widget::readHTTPSerial(QNetworkReply *reply)
复制代码
{
复制代码
    //http协议的状态码
复制代码
    int state_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
复制代码
    //无错误却状态码等于200,获取天气的数据
复制代码
    if(reply->error() == QNetworkReply::NoError && state_code == 200){
复制代码
        //大多数服务器返回的字符编码格式是utf-8
复制代码
        QByteArray data = reply->readAll();
复制代码
        //PaserWeatherFromJson(data);
复制代码
        PaserWeatherFromJsonNew(data);
复制代码
        //调试
复制代码
        //qDebug() << QString::fromUtf8( data);
复制代码
    }
复制代码
    else {
复制代码
        //生成一个提示窗口
复制代码
        QMessageBox msgBox;
复制代码
        msgBox.setWindowTitle("错误");
复制代码
        msgBox.setText("网络连接错误");
复制代码
        msgBox.setStandardButtons(QMessageBox::Ok);
复制代码
        msgBox.exec();
复制代码
        //调试
复制代码
        reply->errorString();
复制代码
    }
复制代码
}
复制代码
复制代码
/* 鼠标按下触发事件 */
复制代码
void Widget::mousePressEvent(QMouseEvent *event)
复制代码
{
复制代码
    //鼠标右键按下
复制代码
    if(event->button() == Qt::RightButton){
复制代码
        //qDebug() << "Rigght button clicked!";
复制代码
        //显示推出窗口
复制代码
        menuQuit->addAction(QIcon(":/res/close.png"),"退出");
复制代码
        //窗口出现在鼠标的位置
复制代码
        menuQuit->exec(QCursor::pos());
复制代码
    }
复制代码
复制代码
    //鼠标左键按下
复制代码
    if(event->button() == Qt::LeftButton){
复制代码
        //qDebug() << "Left button clicked!";
复制代码
        //获取鼠标的位置,界面左上角的位置
复制代码
        //qDebug() << event->globalPos() << this->pos();
复制代码
        //偏移量:鼠标位置与界面左上角的位置的差
复制代码
        mOffset = event->globalPos() - this->pos();
复制代码
    }
复制代码
}
复制代码
复制代码
/* 鼠标拖动移动界面 */
复制代码
void Widget::mouseMoveEvent(QMouseEvent *event)
复制代码
{
复制代码
    //减去偏移量会更湿滑,不然鼠标会跑到界面左上角的位置
复制代码
    this->move(event->globalPos() - mOffset);
复制代码
}
复制代码
复制代码
bool Widget::eventFilter(QObject *watched, QEvent *event)
复制代码
{
复制代码
    if(watched == ui->widget_07 && event->type() == QEvent::Paint){
复制代码
        drawTempHigh();
复制代码
    }
复制代码
复制代码
    if(watched == ui->widget_08 && event->type() == QEvent::Paint){
复制代码
        drawTempLow();
复制代码
    }
复制代码
    return QWidget::eventFilter(watched,event);
复制代码
}
复制代码
复制代码
void Widget::drawTempHigh()
复制代码
{
复制代码
    QPainter painter(ui->widget_07);
复制代码
    painter.setRenderHint(QPainter::Antialiasing,true);
复制代码
    painter.setBrush(QBrush(QColor(255, 126, 52)));
复制代码
    painter.setPen(QColor(255, 126, 52));
复制代码
复制代码
    int t_ave;
复制代码
    int sum = 0;
复制代码
    int offset = 0;
复制代码
    int middle = ui->widget_07->height()/2;
复制代码
    for (int i = 0; i < 6; i++) {
复制代码
         sum += days[i].mTemHigh.toUInt();
复制代码
    }
复制代码
    t_ave = sum / 6;
复制代码
复制代码
    //定义出6个点
复制代码
    QPoint points[6];
复制代码
    for (int i = 0; i < 6; i++) {
复制代码
        points[i].setX(mAirqList[i]->x() + mAirqList[i]->width()/2);
复制代码
        offset = (days[i].mTemHigh.toInt() - t_ave)*3;
复制代码
        points[i].setY(middle - offset);
复制代码
        //画点
复制代码
        painter.drawEllipse(QPoint(points[i]),3,3);
复制代码
        //画实际温度
复制代码
        painter.drawText(points[i].x()-5,points[i].y()+25,days[i].mTemHigh + "°");
复制代码
    }
复制代码
复制代码
    //画5根线
复制代码
    for (int i = 0; i < 5; i++) {
复制代码
        painter.drawLine(points[i],points[i+1]);
复制代码
    }
复制代码
}
复制代码
复制代码
void Widget::drawTempLow()
复制代码
{
复制代码
    QPainter painter(ui->widget_08);
复制代码
    painter.setRenderHint(QPainter::Antialiasing,true);
复制代码
    painter.setBrush(QBrush(QColor(53, 168, 193)));
复制代码
    painter.setPen(QColor(53, 168, 193));
复制代码
复制代码
    int t_ave;
复制代码
    int sum = 0;
复制代码
    int offset = 0;
复制代码
    int middle = ui->widget_08->height()/2;
复制代码
    for (int i = 0; i < 6; i++) {
复制代码
         sum += days[i].mTemLow.toUInt();
复制代码
    }
复制代码
    t_ave = sum / 6;
复制代码
复制代码
    //定义出6个点
复制代码
    QPoint points[6];
复制代码
    for (int i = 0; i < 6; i++) {
复制代码
        points[i].setX(mAirqList[i]->x() + mAirqList[i]->width()/2);
复制代码
        offset = (days[i].mTemLow.toInt() - t_ave)*3;
复制代码
        points[i].setY(middle - offset);
复制代码
        //画点
复制代码
        painter.drawEllipse(QPoint(points[i]),3,3);
复制代码
        //画实际温度
复制代码
        painter.drawText(points[i].x()-5,points[i].y()+25,days[i].mTemLow + "°");
复制代码
    }
复制代码
复制代码
    //画5根线
复制代码
    for (int i = 0; i < 5; i++) {
复制代码
        painter.drawLine(points[i],points[i+1]);
复制代码
    }
复制代码
}
复制代码
复制代码
/*
复制代码
解析:/citycode.json文件的cityid与cityname,获取不同城市的天气
复制代码
QString getCityCodeFromName(QString name)
复制代码
{
复制代码
    //打开文件,获取城市的名字,id
复制代码
    QFile file(":/citycode.json");
复制代码
    file.open(QIODevice::ReadOnly);
复制代码
    QByteArray rawData = file.readAll();
复制代码
    file.close();
复制代码
    //把文件QByteArray转成QJsonDocument
复制代码
    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
复制代码
    //判断是不是数组,QJsonDocument转为QJsonArray
复制代码
    if(jsonDoc.isArray()){
复制代码
        QJsonArray citys = jsonDoc.array();
复制代码
        //遍寻数组,用QJsonValue遍寻
复制代码
        for(QJsonValue value:citys){
复制代码
            //判断数组是不是QJsonObject,将QJsonArray转为QJsonObject
复制代码
            if(value.isObject()){
复制代码
                QJsonObject cityName = value.toObject();
复制代码
                //获取城市名字
复制代码
                QString cityname = cityName["city_name"].toString();
复制代码
                //判断该城市名是否与文本一致,是返回城市id
复制代码
                if(cityname == name){
复制代码
                    return cityName["city_code"].toString();
复制代码
                }
复制代码
            }
复制代码
        }
复制代码
        //遍寻未找到该城市,返回空字符
复制代码
        return "";
复制代码
    }
复制代码
}
复制代码
*/
复制代码
复制代码
/* 按键触发 */
复制代码
void Widget::on_pushButton_clicked()
复制代码
{
复制代码
    //读取文本的城市名称
复制代码
    QString cityName = ui->lineEdit_ReaserchCity->text();
复制代码
    //返回的值城市id
复制代码
    QString cityCode = citycodeutils.getCityCodeFromName(cityName);
复制代码
    //如果有返回值,重新获取该地区的天气
复制代码
    if(cityCode != NULL){
复制代码
        strurl += "&cityid=" + cityCode;
复制代码
        mannager->get(QNetworkRequest(QUrl(strurl)));
复制代码
    }
复制代码
    //如果返回空字符,显示一个错误提示
复制代码
    else{
复制代码
        QMessageBox msgBox;
复制代码
        msgBox.setWindowTitle("错误");
复制代码
        msgBox.setText("请输入正确的城市名称");
复制代码
        msgBox.setStandardButtons(QMessageBox::Ok);
复制代码
        msgBox.exec();
复制代码
    }
复制代码
}
复制代码
复制代码
复制代码
/* 回车确认按键 */
复制代码
void Widget::on_lineEdit_ReaserchCity_returnPressed()
复制代码
{
复制代码
    on_pushButton_clicked();
复制代码
}
相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00615 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术15 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript