2026-01-19 17:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @file MainWindow.h
|
|
|
|
|
|
* @brief SkyLink Qt 地面站 - 主窗口头文件
|
|
|
|
|
|
*
|
|
|
|
|
|
* 用户界面入口,负责显示实时视频、GPS 位置、统计信息等。
|
|
|
|
|
|
*
|
2026-01-20 10:41:22 +08:00
|
|
|
|
* @author flowzl
|
2026-01-19 17:08:49 +08:00
|
|
|
|
* @date 2026-01-19
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <QMainWindow>
|
|
|
|
|
|
#include <QLabel>
|
|
|
|
|
|
#include <QPushButton>
|
|
|
|
|
|
#include <QTcpSocket>
|
|
|
|
|
|
#include <QUdpSocket>
|
|
|
|
|
|
#include <QTimer>
|
|
|
|
|
|
#include <QImage>
|
|
|
|
|
|
#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);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @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();
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
// ========================================================================
|
|
|
|
|
|
// UI 组件
|
|
|
|
|
|
// ========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
QLabel* video_label_; ///< 视频显示标签
|
|
|
|
|
|
QLabel* stats_label_; ///< 统计信息标签
|
|
|
|
|
|
QLabel* gps_label_; ///< GPS 信息标签
|
|
|
|
|
|
|
|
|
|
|
|
QPushButton* save_frame_btn_; ///< 保存帧按钮
|
|
|
|
|
|
QPushButton* record_btn_; ///< 录制按钮
|
|
|
|
|
|
QPushButton* settings_btn_; ///< 设置按钮
|
|
|
|
|
|
|
|
|
|
|
|
// ========================================================================
|
|
|
|
|
|
// 业务逻辑对象
|
|
|
|
|
|
// ========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<GroundReceiver> receiver_; ///< UDP 接收器
|
|
|
|
|
|
std::shared_ptr<DataLogger> logger_; ///< 数据记录器
|
|
|
|
|
|
|
|
|
|
|
|
// ========================================================================
|
|
|
|
|
|
// 状态变量
|
|
|
|
|
|
// ========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
QImage current_image_; ///< 当前显示的图像
|
|
|
|
|
|
double current_lat_ = 0.0; ///< 当前纬度
|
|
|
|
|
|
double current_lon_ = 0.0; ///< 当前经度
|
|
|
|
|
|
double current_alt_ = 0.0; ///< 当前海拔
|
|
|
|
|
|
bool is_recording_ = false; ///< 是否正在录制
|
|
|
|
|
|
|
|
|
|
|
|
// ========================================================================
|
|
|
|
|
|
// 初始化函数
|
|
|
|
|
|
// ========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 初始化 UI
|
|
|
|
|
|
*/
|
|
|
|
|
|
void init_ui();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 初始化连接
|
|
|
|
|
|
*/
|
|
|
|
|
|
void init_connections();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 创建菜单栏
|
|
|
|
|
|
*/
|
|
|
|
|
|
void create_menus();
|
|
|
|
|
|
};
|