Files
flyLink/skylink_qt_station/src/MainWindow.h
2026-02-02 17:06:20 +08:00

156 lines
4.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file MainWindow.h
* @brief SkyLink Qt 地面站 - 主窗口头文件
*
* 用户界面入口负责显示实时视频、GPS 位置、统计信息等。
*
* @author flowzl
* @date 2026-01-19
*/
#pragma once
#include <QMainWindow>
#include <QLabel>
#include <QPushButton>
#include <QTcpSocket>
#include <QUdpSocket>
#include <QTimer>
#include <QImage>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include "DeviceInfo.h"
#include "DeviceInfoReceiver.h"
#include <memory>
class GroundReceiver;
class DataLogger;
/**
* @class MainWindow
* @brief 主窗口类
*/
class MainWindow : public QMainWindow {
Q_OBJECT
public:
/**
* @brief 构造函数
* @param parent 父窗口指针
*/
explicit MainWindow(QWidget* parent = nullptr);
/**
* @brief 析构函数
*/
~MainWindow();
private slots:
/**
* @brief 处理接收到的完整帧
*/
void on_frame_received(const QImage& img, double lat, double lon, double alt, uint32_t photo_number);
/**
* @brief 处理统计信息更新
*/
void on_stats_updated(int fps, int kbs);
/**
* @brief 保存当前帧按钮点击
*/
void on_save_frame_clicked();
/**
* @brief 启动/停止录制按钮点击
*/
void on_record_toggled(bool checked);
/**
* @brief 设置按钮点击
*/
void on_settings_clicked();
/**
* @brief 触发拍照按钮点击
*/
void on_trigger_capture_clicked();
/**
* @brief 收到设备信息
*/
void on_device_info_received(const DeviceInfo& info);
private:
// ========================================================================
// UI 组件
// ========================================================================
QLabel* video_label_; ///< 视频显示标签
QLabel* stats_label_; ///< 统计信息标签
QLabel* gps_label_; ///< GPS 信息标签
QLabel* device_info_label_; ///< 设备信息标签
QPushButton* save_frame_btn_; ///< 保存帧按钮
QPushButton* record_btn_; ///< 录制按钮
QPushButton* settings_btn_; ///< 设置按钮
QPushButton* trigger_capture_btn_; ///< 触发拍照按钮
// ========================================================================
// 业务逻辑对象
// ========================================================================
std::shared_ptr<GroundReceiver> receiver_; ///< UDP 接收器
std::shared_ptr<DeviceInfoReceiver> device_info_receiver_; ///< 设备信息接收器
std::shared_ptr<DataLogger> logger_; ///< 数据记录器
QNetworkAccessManager* network_manager_; ///< HTTP 网络管理器
// ========================================================================
// 状态变量
// ========================================================================
QImage current_image_; ///< 当前显示的图像
double current_lat_ = 0.0; ///< 当前纬度
double current_lon_ = 0.0; ///< 当前经度
double current_alt_ = 0.0; ///< 当前海拔
bool is_recording_ = false; ///< 是否正在录制
uint32_t total_photos_received_ = 0; ///< 接收到的总照片数
uint32_t current_photo_number_ = 0; ///< 当前照片编号
QString ros2_node_ip_ = "localhost"; ///< ROS2 节点 IP 地址
int ros2_http_port_ = 8080; ///< ROS2 HTTP API 端口
// ========================================================================
// 初始化函数
// ========================================================================
/**
* @brief 初始化 UI
*/
void init_ui();
/**
* @brief 初始化连接
*/
void init_connections();
/**
* @brief 创建菜单栏
*/
void create_menus();
/**
* @brief 通过 HTTP 触发拍照
* @param duration 总时间(秒)
* @param count 拍照数量
* @param interval 时间间隔(秒)
* @param mode 传输模式0=原图1=缩略图)
*/
void triggerCaptureViaHttp(double duration, int count, double interval, int mode);
/**
* @brief HTTP 请求响应处理
* @param reply 网络响应
*/
void onHttpReply(QNetworkReply* reply);
};