跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

Qt 6 C++ 桌面天气预报应用开发指南

介绍如何使用 Qt 6 和 C++ 开发一个简单的桌面天气预报应用。项目基于 Open-Meteo 和 OpenWeatherMap 免费 API,实现了城市名称查询、经纬度获取、当前天气及未来 7 天预报展示功能。内容涵盖 API 接口说明、核心代码逻辑(网络请求与 JSON 解析)、构建环境配置及项目结构,适合学习 Qt 网络编程与跨平台 UI 开发。

深海蔚蓝发布于 2026/3/21更新于 2026/10/2496 浏览
Qt 6 C++ 桌面天气预报应用开发指南

Qt 6 C++ 桌面天气预报应用开发指南

一个使用 Qt 6 + C++ 开发的桌面天气预报应用。从零开始实现,支持输入城市名称查询当前天气和未来 7 天预报。

前提条件

第一步

我们使用 Open-Meteo 免费天气 API(无需 API Key,非商业免费使用,数据准确):

https://api.open-meteo.com/v1/forecast?latitude=纬度&longitude=经度&current=temperature_2m,weather_code&daily=temperature_2m_max,temperature_2m_min,weather_code&timezone=auto

第二步

注册 OpenWeatherMap 获取免费 API Key:https://openweathermap.org/api (只需邮箱注册,立即可用)

首先需要通过城市名获取经纬度,我们使用另一个免费 API:OpenWeatherMap 的 Geocoding API(免费注册后获取 API Key,支持每天 1000 次调用):

http://api.openweathermap.org/geo/1.0/direct?q=城市名&limit=1&appid=你的KEY

大体思路

通过城市名获取地理坐标,再利用经纬度坐标输入来获取天气输出。

功能特点

  • 输入城市名称(支持中文或英文,如 "Beijing" 或 "Shanghai,CN")
  • 以下为获取地理数据返回 经纬度
void MainWindow::onGeoReplyFinished(QNetworkReply *reply) {
    if (reply->error() != QNetworkReply::NoError) {
        QMessageBox::critical(this, "错误", "位置查询失败:" + reply->errorString());
        reply->deleteLater();
        return;
    }
    QByteArray data = reply->readAll();
    QJsonDocument doc = QJsonDocument::fromJson(data);
    QJsonArray array = doc.array();
    if (array.isEmpty()) {
        QMessageBox::warning(this, "错误", "未找到该城市!");
        reply->deleteLater();
        return;
    }
    QJsonObject obj = array.first().toObject();
    double lat = obj["lat"].toDouble();
    double lon = obj["lon"].toDouble();
    QString cityName = obj["name"].toString() + ", " + obj["country"].toString();
    reply->deleteLater();
    QString weatherUrl = QString("https://api.open-meteo.com/v1/forecast?"
        "latitude=%1&longitude=%2"
        "&current=temperature_2m,weather_code"
        "&daily=temperature_2m_max,temperature_2m_min,weather_code"
        "&timezone=auto").arg(lat).arg(lon);
    weatherManager->get(QNetworkRequest(QUrl(weatherUrl)));
    ui->currentWeatherLabel->setText(QString("正在加载 %1 的天气...").arg(cityName));
}
  • 以下为通过经纬度获取该地天气 (会有误差,上面的城市搜索智能返回一个经纬度,而下面的天气查询是通过上面的一个坐标来获取温度,所以会有误差)
  • 有点全球所有城市都能查询天气
void MainWindow::onWeatherReplyFinished(QNetworkReply *reply) {
    if (reply->error() != QNetworkReply::NoError) {
        QMessageBox::critical(this, "错误", "天气查询失败:" + reply->errorString());
        reply->deleteLater();
        return;
    }
    QByteArray data = reply->readAll();
    QJsonDocument doc = QJsonDocument::fromJson(data);
    QJsonObject root = doc.object();
    // 当前天气
    QJsonObject current = root["current"].toObject();
    double temp = current["temperature_2m"].toDouble();
    int code = current["weather_code"].toInt();
    ui->currentWeatherLabel->setText(QString("当前天气:%1°C,%2").arg(temp, 0, 'f', 1).arg(weatherDescription(code)));
    // 预报
    ui->forecastList->clear();
    QJsonObject daily = root["daily"].toObject();
    QJsonArray dates = daily["time"].toArray();
    QJsonArray maxT = daily["temperature_2m_max"].toArray();
    QJsonArray minT = daily["temperature_2m_min"].toArray();
    QJsonArray codes = daily["weather_code"].toArray();
    for (int i = 0; i < dates.size(); ++i) {
        QString date = dates[i].toString();
        double max = maxT[i].toDouble();
        double min = minT[i].toDouble();
        int c = codes[i].toInt();
        ui->forecastList->addItem(QString("%1: 最高 %2°C,最低 %3°C,%4").arg(date).arg(max, 0, 'f', 1).arg(min, 0, 'f', 1).arg(weatherDescription(c)));
    }
    reply->deleteLater();
}
  • 显示当前温度和天气描述
  • 显示未来 7 天每日最高/最低温度及天气描述
  • 使用免费天气 API,无广告
  • 纯 C++ 实现,学习 Qt 网络请求、JSON 解析的优秀示例

技术栈

  • Qt 6.x (Widgets 模块 + Network 模块)
  • C++17
  • 天气数据来源:
    • 经纬度查询:OpenWeatherMap Geocoding API(需免费 API Key)
    • 天气预报:Open-Meteo API(完全免费,无需 Key)

环境要求

  • Qt 6.x(推荐使用 Qt Creator)
  • 支持 Windows / macOS / Linux

构建与运行

  1. 打开 Qt Creator,加载项目(WeatherApp.pro)
  2. 编译并运行(Ctrl + R)

在 mainwindow.cpp 中替换 API Key:

QString apiKey = "你的 OpenWeatherMap_API_Key"; // 替换成你的 Key

(注册地址:https://home.openweathermap.org/api_keys)

使用方法

  1. 启动程序
  2. 在输入框中输入城市名称(如 Beijing)
  3. 点击'查询天气'按钮
  4. 查看当前天气和未来预报列表

项目结构

WeatherApp/
 ├── main.cpp
 ├── mainwindow.h
 ├── mainwindow.cpp
 └── mainwindow.ui

扩展建议

  • 添加天气图标显示(下载 WMO 天气代码对应图标)
  • 支持自动定位(集成 Qt Positioning 模块)
  • 添加缓存机制,避免重复请求
  • 美化界面(使用样式表或 QSS)

目录

  1. Qt 6 C++ 桌面天气预报应用开发指南
  2. 前提条件
  3. 第一步
  4. 第二步
  5. 大体思路
  6. 功能特点
  7. 技术栈
  8. 环境要求
  9. 构建与运行
  10. 使用方法
  11. 项目结构
  12. 扩展建议

更多推荐文章

查看全部
  • Java 并发编程:Volatile 关键字底层原理与最佳实践
  • OpenClaw 新手入门:环境搭建、模型配置与 WebUI 远程访问
  • Google 推出医学治疗通用大模型 Tx-LLM,多项任务超越 SOTA
  • 豆包手机遭厂商屏蔽:GUI Agent 是通向 AGI 的必经之路吗?
  • 嫦娥四号 PDS4 数据读取与可视化
  • Git Windows 版下载安装与配置教程
  • 大数据场景下的时序数据库选型:Apache IoTDB 核心优势解析
  • AI 技术综述与产品经理角色重塑
  • 用两个栈模拟队列:LIFO 到 FIFO 的转换实现与复杂度分析
  • 手写 C++ TCP 服务器:自定义协议与粘包处理
  • 使用 LLM 将白雪公主故事转换为 Neo4j 图数据
  • 二叉树深度优先搜索算法与经典例题解析
  • Java 环境搭建与首个 Hello World 实战指南
  • 移动前端与 Web 前端开发的核心差异解析
  • AI 工具核心概念解析:Slash Command、Skill 与 Agent 的关系
  • Trae 高峰期模型排队优化:接入无问芯穹配置实战
  • 互联网大厂 Java 与 Android 开发核心面试题整理
  • Python 实现中秋月相计算、月饼切分与可视化
  • C++ STL list 容器详解:使用与模拟实现
  • 利用 Ollama + RAGFlow 部署千问大模型构建个人知识库 AI 智能体

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online