QT天气预报

QT-天气预报

  •  1.界面设计
  •  2.开发
    • [  2.1 重写鼠标右键退出功能](#  2.1 重写鼠标右键退出功能)
    • [  2.2 重写鼠标左键移动窗口](#  2.2 重写鼠标左键移动窗口)
    • [  2.3 QtHttp编程获取天气原始数据](#  2.3 QtHttp编程获取天气原始数据)
      • [    2.3.1 发送HTTP请求](#    2.3.1 发送HTTP请求)
      • [    2.3.2 读取数据](#    2.3.2 读取数据)
      • [    2.3.3 处理网络失败请求](#    2.3.3 处理网络失败请求)
    • [  2.4 JSON数据](#  2.4 JSON数据)
      • [    2.4.1 QT生成JSON数据](#    2.4.1 QT生成JSON数据)
      • [    2.4.2 QT解析JSON数据](#    2.4.2 QT解析JSON数据)
    • [  2.5 获取当前城市天气数据](#  2.5 获取当前城市天气数据)
    • [  2.6 获取不同城市数据信息](#  2.6 获取不同城市数据信息)
    • [  2.7 QMap](#  2.7 QMap)
      • [    2.7.1 将CityName与CityCode产生联系](#    2.7.1 将CityName与CityCode产生联系)
      • [    2.7.1 将天气图标与天气类型产生联系](#    2.7.1 将天气图标与天气类型产生联系)
    • [  2.8 获得最近七天的数据](#  2.8 获得最近七天的数据)
    • [  2.9 事件过滤器在子控件上画线](#  2.9 事件过滤器在子控件上画线)
    • [  2.10 LineEdit的returnPressed()](#  2.10 LineEdit的returnPressed())
  •  3.最终效果

1.界面设计

2.开发

2.1 重写鼠标右键退出功能

c 复制代码
	重写鼠标右键点击事件 + QMenu:
	/*
 QMenu menu;
 QAction *at = actions[0]; // Assumes actions is not empty
 foreach (QAction *a, actions)
     menu.addAction(a);
 menu.exec(pos, at);

*/
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton){
       menuQuit->exec(QCursor::pos());  //光标点击的当前位置执行
    }
    QWidget::mousePressEvent(event);
}

void Widget::rightMouseClicked()
{
    menuQuit = new QMenu(this);
    QAction *closeAct = new QAction(QIcon(":/res/close.png"), tr("退出"), this);
    menuQuit->addAction(closeAct);

    //[signal] void QMenu::triggered(QAction *action)
    connect(menuQuit,&QMenu::triggered,this,[=](){
        this->close();
    });
}

2.2 重写鼠标左键移动窗口

c 复制代码
	如下图所示:
	鼠标右键点击窗口有鼠标的点击坐标:event->globalPos();
	窗口有窗口的坐标:this->Pos();
	在鼠标点击窗口移动的时候,鼠标的坐标A与窗口坐标B相对的偏移量moffset不会变
	QPoint moffset = event->globalPos() - this->Pos();
	窗口移动到图中黑框的位置时,鼠标的坐标处在一个新的A点上,
	但是A点相较于新窗口点C的偏移量与原来的A点相较于B点的偏移量没有改变
	因此,在已知新坐标点A与固定偏移量的情况下C点可求
	新窗口的坐标点位为:event->globalPos() - moffset 
	然后再对鼠标移动事件进行重写
c 复制代码
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton){
       menuQuit->exec(QCursor::pos());  //光标点击的当前位置执行
    }

    //鼠标当前位置:event->globalPos()
    //窗口当前位置:this->pos()
    //窗口新位置: event->globalPos()-moffset
    if(event->button() == Qt::LeftButton){
        qDebug() << event->globalPos()<< this->pos();
        moffset = event->globalPos() - this->pos();
    }

    QWidget::mousePressEvent(event);
}

//重写鼠标左键移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos()-moffset);
    QWidget::mouseMoveEvent(event);
}

2.3 QtHttp编程获取天气原始数据

2.3.1 发送HTTP请求

c 复制代码
类:
	QNetworkAccessManager
	QNetworkRequest
    
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QNetworkRequest res(QUrl("http://t.weather.itboy.net/api/weather/city/101010100"));

2.3.2 读取数据

c 复制代码
	QNetworkReply *reply = manager->get(res);
	//网络请求后进行数据读取
    connect(reply,SIGNAL(finished()),this,SLOT(readHttpReply()));

	void Widget::readHttpReply()
	{
    	QByteArray data = reply->readAll();
    	qDebug() << QString::fromUtf8(data);
	}

2.3.3 处理网络失败请求

c 复制代码
	http请求返回200请求成功
void Widget::readHttpReply()
{
    int resCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qDebug() <<resCode;
    if(reply->error() == QNetworkReply::NoError && resCode == 200){
        //大多数返回utf-8
        QByteArray data = reply->readAll();
        qDebug() << QString::fromUtf8(data);
    }else{
        QMessageBox msgBox;
        msgBox.setWindowTitle("错误");
        msgBox.setText("网络请求失败");
        msgBox.setStandardButtons(QMessageBox::Ok);
        qDebug() << reply->errorString();
        msgBox.exec();
    }
}

2.4 JSON数据

2.4.1 QT生成JSON数据

c 复制代码
	键值对-- 对象[键] = "值";
类:
	QJsonDocument
	QJsonObject
	QJsonArray
方法:
	1. 创建JSON对象:使用 QJsonObject 来构建JSON对象,并使用键值对填充数据。
	2. 创建JSON数组:使用 QJsonArray 来创建一个数组,并添加元素。
	3. 组合JSON结构:将JSON数组添加到JSON对象中。
	4. 生成JSON文档:通过 QJsonDocument 来处理JSON数据,可以选择格式化(缩进)或压缩形式。
	5. 保存到文件:创建 QFile 对象,打开文件,写入JSON数据,并关闭文件。
c 复制代码
    QJsonObject rootObj;
    //添加键值对
    rootObj["cityid"] = "1010100";
    rootObj["date"] = "2024-4-6";
    rootObj["weather"] = "雨夹雪";
    rootObj["tmp"] = 3;

    //添加数组
    QJsonArray jsonArr;
    jsonArr.append("data1");
    jsonArr.append("data2");
    jsonArr.append("data3");
    jsonArr.append(100);
    rootObj["testArr"] = jsonArr;

    //添加对象
    QJsonObject jsonObject;
    jsonObject = rootObj;
    rootObj["jsonObject"] = jsonObject;

    //数组中添加对象
    QJsonArray jsObArr;
    jsObArr.append(jsonObject);
    jsObArr.append(jsonObject);
    rootObj["jsObArr"] = jsObArr;

    //生成JSON文件
    QJsonDocument jsonDoc(rootObj);
    //转成数组
    QByteArray jsonArray = jsonDoc.toJson();
    //写入文件
    QFile file("C:/Users/qzh/Desktop/test.json");
    file.open(QIODevice::WriteOnly);
    file.write(jsonArray);
    file.close();

2.4.2 QT解析JSON数据

c 复制代码
	1.读取JSON数据
	2.生成JSON文件
	3.转成JSON对象
c 复制代码
	QFile file("C:/Users/qzh/Desktop/test.json");
    file.open(QIODevice::ReadOnly);
    QByteArray rawData = file.readAll();
    file.close();

    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
    if(!jsonDoc.isNull() && jsonDoc.isObject()){    //不是json对象转成json对象
        QJsonObject jsonRoot = jsonDoc.object();
        QString strW = jsonRoot["weather"].toString();
        QString strCityId = jsonRoot["cityid"].toString();
        qDebug() << strW;
        qDebug() << strCityId;

        //JSON数组处理
        if(jsonRoot.contains("testArr") && jsonRoot["testArr"].isArray()){
            //1.先转成数组
            QJsonArray testArray = jsonRoot["testArr"].toArray();
            for(QJsonValue val : testArray){
                QJsonValue::Type t = val.type();
                switch(t){
                case QJsonValue::Double:
                    qDebug() << QString::number(val.toDouble());
                    break;
                case QJsonValue::String:
                    qDebug() << val.toString();
                    break;
                case QJsonValue::Object:
                    break;

                }
            }

        }
        //处理json对象
        if(jsonRoot.contains("jsonObject") && jsonRoot["jsonObject"].isObject()){
            //转成Json对象
            QJsonObject jsonObject = jsonRoot["jsonObject"].toObject();
            qDebug() << "jsonObject"<<jsonObject["cityid"].toString();
        }

        //处理JSON数组中的对象
        if(jsonRoot.contains("testArr") && jsonRoot["testArr"].isArray()){
            QJsonArray jsObArr = jsonRoot["jsObArr"].toArray();
            for(QJsonValue val : jsObArr){
                if(val.isObject()){
                    QJsonObject obj = val.toObject();
                    qDebug() << obj["weather"].toString();
                    qDebug() << obj["cityid"].toString();
                }
            }
        }
    }

2.5 获取当前城市天气数据

c 复制代码
全局变量
    QNetworkReply *reply;
    QString strUrl;
    QNetworkAccessManager *manager;
	1.创建一个QNetworkAccessManager对象manager
	manager = new QNetworkAccessManager(this);
	2.发送请求
	strUrl = "http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=87767798&appsecret=7Ujk853M";
    QUrl urlTianQi(strUrl);
    QNetworkRequest res(urlTianQi);
    manager->get(res);
    3.QNetworkReply获得相应,并将相关数据存储在replay中
    4.绑定信号与槽,manager响应完成后触发数据处理
    void Widget::readHttpReply(QNetworkReply *reply)
{
    int resCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    if(reply->error() == QNetworkReply::NoError && resCode == 200){
        //大多数返回utf-8
        QByteArray data = reply->readAll();
        parseWeatherJsonData(data);//解析数据并刷新控件
        qDebug() << QString::fromUtf8(data);
    }else{
        QMessageBox msgBox;
        msgBox.setWindowTitle("错误");
        msgBox.setText("网络请求失败");
        msgBox.setStandardButtons(QMessageBox::Ok);
        qDebug() << reply->errorString();
        msgBox.exec();
    }
}

//解析数据并刷新控件
void Widget::parseWeatherJsonData(QByteArray rawData)
{
    QJsonDocument jsonObj = QJsonDocument::fromJson(rawData);
    if(!jsonObj.isNull() && jsonObj.isObject()){
        QJsonObject objRoot = jsonObj.object();
        //解析日期
        QString date = objRoot["date"].toString();
        QString week = objRoot["week"].toString();
        ui->labelCurrentDate->setText(date+"  "+ week);
        //解析城市名称
        QString cityName = objRoot["city"].toString();
        ui->labelCity->setText(cityName);
        //解析当前温度
        QString currentTmp = objRoot["tem"].toString();
        ui->labelWendu->setText(currentTmp+"℃");
        ui->labelWeatherRange->setText(objRoot["tem2"].toString()+"~"+objRoot["tem1"].toString());
        //解析天气类型
        ui->labelWeatherType->setText(objRoot["wea"].toString());

        //感冒指数
        ui->labelGanmao->setText(objRoot["air_tips"].toString());
        //风向
        ui->labelFXtype->setText(objRoot["win"].toString());
        //风力
        ui->labelFXtype_2->setText(objRoot["win_speed"].toString());
        //PM2.5
        ui->labelPMData->setText(objRoot["air_pm25"].toString());
        //湿度
        ui->labelShiduData->setText(objRoot["humidity"].toString());
        //空气质量
        ui->labelAirData->setText(objRoot["air_level"].toString());
    }
}

2.6 获取不同城市数据信息

c 复制代码
	1.当搜查按钮点击后触发信号与槽
	2.读取当前ui->lineEdit控件的内容
	3.解析json格式的城市编码并与当前控件内容进行匹配
	4.刷新控件-
	由于数据的读取绑定的信号是QNetworkAccessManager::finished,
	所当在点击按钮后重对新的url发送请求完成后会触发槽函数进行数据解析
	和刷新相关控件操作
	void Widget::on_pushButton_clicked()
{
    QString cityNameFromUser = ui->lineEditCity->text();
    QString cityCode = getCityCodeFromJson(cityNameFromUser);
    if(cityCode != NULL){
        strUrl += "&cityid=" + cityCode;                 //拼接url
        manager->get(QNetworkRequest(QUrl(strUrl)));    //发送请求
    }else{
        QMessageBox msgBox;
        msgBox.setWindowTitle("错误");
        msgBox.setText("请输入正确城市名");
        msgBox.setStandardButtons(QMessageBox::Ok);
        qDebug() << reply->errorString();
        msgBox.exec();
    }
}

QString getCityCodeFromJson(QString name)
{
    QFile file(":/citycode.json");
    file.open(QIODevice::ReadOnly);
    QByteArray rawData = file.readAll();
    file.close();

    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
    if(jsonDoc.isArray()){
        QJsonArray citys = jsonDoc.array();
        for(QJsonValue val : citys){
            if(val.isObject()){
                QString cityName = val["city_name"].toString();
                if(cityName == name){
                    return val["city_code"].toString();
                }
            }
        }
        return "";
    }
}

2.7 QMap

2.7.1 将CityName与CityCode产生联系

c 复制代码
	由于每次打开之前都需要打开文件,会很麻烦,所以引入Map容器
	在打开的时候检查Map容器是否为空,为空则打开文件将文件内容存储在Map容器中,后续只需要检查Map容器是否为空即可

QMap<QString,int> myMap; //创建一个存储QString类型的键和int型的值的map容器
QMap<QString,QString> cityMap;  //创建存储一个QString类型的键和QString类型的值的map容器

QString CityCodeUtils::getCityCodeFromName(QString cityName)
{
    if(cityMap.isEmpty()){
        initCityMap();
    }
     QMap<QString, QString>::iterator it =   cityMap.find(cityName);  //查找cityName
     if(it == cityMap.end()){   //未找到
        it =   cityMap.find(cityName+"市");
        if(it == cityMap.end()){   //未找到
           it =   cityMap.find(cityName+"县");
        }
        if(it == cityMap.end()){   //未找到
           it =   cityMap.find(cityName+"区");
        }
        if(it == cityMap.end()){   //未找到
           return "";
        }
     }
     return it.value(); //获得cityCode
}

void CityCodeUtils::initCityMap()
{
    QFile file(":/citycode.json");
    file.open(QIODevice::ReadOnly);
    QByteArray rawData = file.readAll();
    file.close();

    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
    if(jsonDoc.isArray()){
        QJsonArray citys = jsonDoc.array();
        for(QJsonValue val : citys){
            if(val.isObject()){
                QString cityName = val["city_name"].toString();
                QString cityCode = val["city_code"].toString();
                cityMap.insert(cityName,cityCode);  //将cityName和cityCode以键值对的方式插入到map容器中
            }
        }
    }
}

2.7.1 将天气图标与天气类型产生联系

c 复制代码
void Widget::initWeatherIcon()
{
    //根据keys,设置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->labelWeatherIcon->setPixmap(mTypeMap[objRoot["wea"].toString()]);

2.8 获得最近七天的数据

c 复制代码
	strUrl = "http://v1.yiketianqi.com/api?unescape=1&version=v91&appid=87767798&appsecret=7Ujk853M&ext=";
	1.定义一个新的类Day用于存储一天的全部信息
	class Day
{
public:
    Day();
    QString mDate;
    QString mWeek;
    QString mCity;
    QString mTemp;
    QString mWeathType;
    QString mTempLow;
    QString mTempHigh;

    QString mTips;
    QString mFx;
    QString mFl;
    QString mPm25;
    QString mHu;
    QString mAirq;
};

	2.解析新的url获取的json数据-并将数据存储在数组中
	Day days[7];
	
	void Widget::parseWeatherJsonDataNew(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();
        if( jsonRoot.contains("data") && jsonRoot["data"].isArray()){
            QJsonArray weaArray = jsonRoot["data"].toArray();
            for(int i = 0; i < weaArray.size(); i++){
                QJsonObject obj = weaArray[i].toObject();
                //qDebug() << obj["date"].toString() << obj["wea"].toString();
                days[i].mDate = obj["date"].toString();
                days[i].mWeek = obj["week"].toString();
                days[i].mWeathType = obj["wea"].toString();
                days[i].mTemp = obj["tem"].toString();
                days[i].mTempLow = obj["tem2"].toString();
                days[i].mTempHigh = obj["tem1"].toString();
                days[i].mFx = obj["win"].toArray()[0].toString();
                days[i].mFl = obj["win_speed"].toString();
                days[i].mAirq = obj["air_level"].toString();
                days[i].mTips = obj["air_tips"].toString();
                days[i].mHu = obj["humidity"].toString();

            }
        }
    }
    updateUI();
}

	3.设置QList泛型并初始化
	QList<QLabel *> mDateList;
    QList<QLabel *> mWeekList;
    QList<QLabel *> mIconList;
    QList<QLabel *> mWeaTypeList;
    QList<QLabel *> mAirqList;
    QList<QLabel *> mFxList;
    QList<QLabel *> mFlList;
    void Widget::initDaysElement()
{
    mWeekList << ui->labelday0 << ui->labelday1
              << ui->labelday2 << ui->labelday3
              << ui->labelday4 << ui->labelday5;
    mDateList << ui->labelDate0 << ui->labelDate1
              << ui->labelDate2 << ui->labelDate3
              << ui->labelDate4 << ui->labelDate5;
    mIconList << ui->labelWeatherIcon0 << ui->labelWeatherIcon1
              << ui->labelWeatherIcon2 << ui->labelWeatherIcon3
              << ui->labelWeatherIcon4 << ui->labelWeatherIcon5;
    mWeaTypeList << ui->lbweatherType0 << ui->lbweatherType1
                 << ui->lbweatherType2 << ui->lbweatherType3
                 << ui->lbweatherType4 << ui->lbweatherType5;
    mAirqList << ui->labelq0 << ui->labelq1
              << ui->labelq2 << ui->labelq3
              << ui->labelq4 << ui->labelq5;
    mFxList << ui->labelFX0 << ui->labelFX1
            << ui->labelFX2 << ui->labelFX3
            << ui->labelFX4 << ui->labelFX5;
    mFlList << ui->labelFL0 << ui->labelFL1
            << ui->labelFL2 << ui->labelFL3
            << ui->labelFL4 << ui->labelFL5;
}
	4.通过泛型设置对应控件
	void Widget::updateUI()
{
    QPixmap pixMap;
    //解析日期
    ui->labelCurrentDate->setText(days[0].mDate+"  "+days[0].mWeek);
    //解析城市名称
    ui->labelCity->setText(days[0].mCity+"市");
    //解析当前温度
    ui->labelWendu->setText(days[0].mTemp+"℃");
    ui->labelWeatherRange->setText(days[0].mTempLow+"~"
            +days[0].mTempHigh);
    //解析天气类型
    ui->labelWeatherType->setText(days[0].mWeathType);
    ui->labelWeatherIcon->setPixmap(mTypeMap[days[0].mWeathType]);
    //感冒指数
    ui->labelGanmao->setText(days[0].mTips);
    //风向
    ui->labelFXtype->setText(days[0].mFx);
    //风力
    ui->labelFXtype_2->setText(days[0].mFl);
    //PM2.5
    ui->labelPMData->setText(days[0].mPm25);
    //湿度
    ui->labelShiduData->setText(days[0].mHu);
    //空气质量
    ui->labelAirData->setText(days[0].mAirq);


    for(int i = 0; i < 6; i++){
        mWeekList[0]->setText("今天");
        mWeekList[1]->setText("明天");
        mWeekList[2]->setText("后天");
        mWeekList[i]->setText(days[i].mWeek);
        QStringList dayList = days[i].mDate.split("-"); //2024-4-7 通过-分割成三部分 0:2024, 1:4, 2:7
        mDateList[i]->setText(dayList[1] + "-" +dayList[2]);

        //缩放图片大小与label大小能匹配
        int index = days[i].mWeathType.indexOf("转");    //找不到 "转" 返回-1
        if(index != -1){
            pixMap = mTypeMap[days[i].mWeathType.left(index)];  //找到了字符转的位置,将左边取出
        }else{
            pixMap = mTypeMap[days[i].mWeathType];
        }
        pixMap = pixMap.scaled(mIconList[i]->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
        mIconList[i]->setMaximumHeight(50);
        mIconList[i]->setMinimumWidth(ui->widget0402->width()/6.5);
        mIconList[i]->setPixmap(pixMap);
        mWeaTypeList[i]->setText(days[i].mWeathType);

        QString airQ = days[i].mAirq;

        mAirqList[i]->setText(days[i].mAirq);
        if( airQ == "优"){
            mAirqList[i]->setStyleSheet("background-color:rgb(150,213,32);border-radius: 10px;");
        }else if(airQ == "良"){
            mAirqList[i]->setStyleSheet("background-color:rgb(241,224,103);border-radius: 10px;");
        }else if(airQ == "轻度"){
            mAirqList[i]->setStyleSheet("background-color:rgb(255,199,199);border-radius: 10px;");
        }else if(airQ == "中度"){
            mAirqList[i]->setStyleSheet("background-color:rgb(255,17,17);border-radius: 10px;");
        }else if(airQ == "重度"){
            mAirqList[i]->setStyleSheet("background-color:rgb(153,0,0);border-radius: 10px;");
        }


        mFlList[i]->setText(days[i].mFl);
        index = days[i].mFl.indexOf("转");
        if(index != -1){
            mFlList[i]->setText(days[i].mFl.left(index));
        }else{
            mFlList[i]->setText(days[i].mFl);
        }
        mFxList[i]->setText(days[i].mFx);
    }
}

2.9 事件过滤器在子控件上画线

c 复制代码
	若直接通过重写paintEvent事件,则会被layout遮挡
	因此通过事件过滤对事件过滤在子控件上画线
c 复制代码
    ui->widget0404->installEventFilter(this);
    ui->widget0405->installEventFilter(this);

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->widget0404 && event->type() == QEvent::Paint){
        drawTempLineHight();
        return true; //事件被处理返回true
    }
    if(watched == ui->widget0405 && event->type() == QEvent::Paint){
        drawTempLineLow();
        return true; //事件被处理返回true
    }
    return QWidget::eventFilter(watched,event);
}

void Widget::drawTempLineHight()
{
    QPainter painter(ui->widget0404);   //在0404子控件上画画
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setBrush(Qt::yellow);
    painter.setPen(Qt::yellow);

    //算出平均温度,以平均值为中线进行偏移
    int ave;
    int sum = 0;
    int offset;
    int middle = ui->widget0404->height()/2;
    for(int i=0 ; i < 6 ;i++){
        sum += days[i].mTempHigh.toInt();
        qDebug() << days[i].mTempHigh;
    }
    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].mTempHigh.toInt() - ave;
        points[i].setY(middle - offset*3);

        painter.drawEllipse(QPoint(points[i]),3,3); //画点
        painter.drawText(points[i].x()-15,points[i].y()-15,days[i].mTempHigh + "℃");
    }
    painter.setBrush(Qt::NoBrush);
    for(int i=0;i<5;i++){
        painter.drawLine(points[i],points[i+1]);    //画线

    }
}

void Widget::drawTempLineLow()
{
    QPainter painter(ui->widget0405);   //在0404子控件上画画
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setBrush(Qt::blue);
    painter.setPen(Qt::blue);

    //算出平均温度,以平均值为中线进行偏移
    int ave;
    int sum = 0;
    int offset;
    int middle = ui->widget0405->height()/2;
    for(int i=0 ; i < 6 ;i++){
        sum += days[i].mTempLow.toInt();
        qDebug() << days[i].mTempLow;
    }
    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].mTempLow.toInt() - ave;
        points[i].setY(middle - offset*3);

        painter.drawEllipse(QPoint(points[i]),3,3); //画点
        painter.drawText(points[i].x()-15,points[i].y()-15,days[i].mTempLow + "℃");
    }
    for(int i=0;i<5;i++){
        painter.drawLine(points[i],points[i+1]);    //画线
    }
}

2.10 LineEdit的returnPressed()

c 复制代码
//相当于添加enter快捷键enter按下后进行搜索
void Widget::on_lineEditCity_returnPressed()
{
    on_pushButton_clicked();
}

3.最终效果

c 复制代码
链接:https://pan.baidu.com/s/1m9eJfvXX7RXK3_ksb7U4hA 
提取码:sw2n 
--来自百度网盘超级会员V5的分享
相关推荐
奔波儿灞爱霸波尔奔4 分钟前
杂七杂八之Swagger环境搭建(Java版本)
java·开发语言
chusheng184015 分钟前
Python 三维图表绘制指南
开发语言·python
细心的莽夫28 分钟前
JavaWeb学习笔记
java·开发语言·笔记·学习·java-ee·web
爱写代码的小朋友33 分钟前
使用 Python 和 OpenCV 实现实时人脸识别
开发语言·python·opencv
Matlab程序猿小助手40 分钟前
【MATLAB源码-第208期】基于matlab的改进A*算法和传统A*算法对比仿真;改进点:1.无斜穿障碍物顶点2.删除中间多余节点,减少转折。
开发语言·嵌入式硬件·算法·matlab·机器人
martian66543 分钟前
QT开发:掌握现代UI动画技术:深入解析QML和Qt Quick中的动画效果
开发语言·c++·qt·ui
萧鼎2 小时前
【Python】强大的正则表达式工具:re模块详解与应用
开发语言·python·正则表达式
煎饼果子呀2 小时前
css-flex布局属性
开发语言·前端·css·html5
Liquor14192 小时前
vim 编辑器
java·linux·c语言·开发语言·python·编辑器·vim
kevin_tech2 小时前
Go API 多种响应的规范化处理和简化策略
开发语言·后端·golang·状态模式