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

7.8 QMap
在 Qt 中,如果你想要将 JSON 数据解析到一个 QMap 中,你可以遍历 JSON 对象的所有键值对,并将它们添加到 QMap 里。这个方法特别适合于当你的 JSON 对象是一个简单的键值对集合时。以下是一个如何实现这一点的示例。
示例:将 JSON 数据解析到 QMap
假设你有以下 JSON 数据:
json
{
"name" : "John Doe" ,
"age" : "30" ,
"email" : "[email protected]"
}
以下是如何将这些数据解析到 QMap<QString, QString> 中的步骤:
#include <QJsonDocument>
#include <QJsonObject>
#include <QMap>
#include <QDebug>
void parseJsonToMap() {
// JSON字符串
QString jsonString = R"(
{
"name": "John Doe",
"age": "30",
"email": "[email protected]"
}
)";
// 将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()) {
dataMap[key] = jsonObj.value(key).toString();
}
} else {
qDebug() << "Invalid JSON...";
}
// 打印QMap内容
for (auto key : dataMap.keys()) {
qDebug() << key << ":" << dataMap[key];
}
}
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();
复制代码
}
相关推荐
范纹杉想快点毕业28 分钟前
Qt实现文本编辑器光标高亮技术
java·开发语言·c++·算法·系统架构
LBJ辉37 分钟前
9. CSS 引入方式
开发语言·前端·css
C语言小火车44 分钟前
C语言酒店管理系统:完整源码与深度解析
c语言·开发语言
伊成1 小时前
Java面试高频面试题【2025最新版】
java·开发语言·面试
~贝母~1 小时前
猿人学js逆向比赛第一届第九题
开发语言·javascript·爬虫·ecmascript
编程乐趣2 小时前
推荐一个基于C#开发的跨平台构建自动化系统!
开发语言·c#·自动化
好奇的菜鸟3 小时前
如何重新安装 Rust
开发语言·后端·rust
mzhan0173 小时前
Python: file: encode: ‘gbk‘ codec can‘t encode character ‘\xe5‘ in position
开发语言·python
上课耽误学习3 小时前
一生一芯 PA2 RTFSC
开发语言·一生一芯
Smartdaili China3 小时前
使用 Python 抓取亚马逊产品数据: 分步指南
开发语言·爬虫·python·网络爬虫·亚马逊·抓取·爬取