/** * @file MainWindow.h * @brief SkyLink Qt 地面站 - 主窗口头文件 * * 用户界面入口,负责显示实时视频、GPS 位置、统计信息等。 * * @author flowzl * @date 2026-01-19 */ #pragma once #include #include #include #include #include #include #include #include #include #include "DeviceInfo.h" #include "DeviceInfoReceiver.h" #include 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 receiver_; ///< UDP 接收器 std::shared_ptr device_info_receiver_; ///< 设备信息接收器 std::shared_ptr 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); };