Files
d330viewer/src/gui/MainWindow.h
2026-01-16 18:07:52 +08:00

168 lines
4.6 KiB
C++

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <QDateTime>
#include <memory>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
class ConfigManager;
class NetworkManager;
class DeviceScanner;
class GVSPParser;
class PointCloudProcessor;
class PointCloudWidget;
struct DeviceInfo;
class QListWidget;
class QListWidgetItem;
class QPushButton;
class QSlider;
class QSpinBox;
class QLabel;
class QImage;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
// 相机控制槽函数
void onStartClicked();
void onStopClicked();
void onOnceClicked();
void onExposureChanged(int value);
void onCaptureClicked();
void onBrowseSavePathClicked();
// 网络配置槽函数
void onConnectClicked();
void onIpAddressChanged(const QString &ip);
void onControlPortChanged(int port);
void onDataPortChanged(int port);
void onNetworkConnected();
void onNetworkDisconnected();
void onDataReceived(const QByteArray &data);
// GVSP数据处理槽函数
void onImageReceived(const QImage &image, uint32_t blockId);
void onDepthDataReceived(const QByteArray &depthData, uint32_t blockId);
void onPointCloudDataReceived(const QByteArray &cloudData, uint32_t blockId);
void onPointCloudReady(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, uint32_t blockId);
// 设备扫描槽函数
void onRefreshClicked();
void onDeviceFound(const DeviceInfo &device);
void onScanProgress(int current, int total);
void onScanFinished(int devicesFound);
void onDeviceSelected(QListWidgetItem *item);
// 定时器更新
void updateUI();
// 日志槽函数
void onClearLogClicked();
void onSaveLogClicked();
protected:
// 重写事件处理函数以监听系统主题变化
void changeEvent(QEvent *event) override;
private:
void setupUI();
void setupConnections();
void loadSettings();
void saveSettings();
// 拍照辅助函数
bool saveDepthImage(const QString &dir, const QString &baseName, const QString &format);
bool savePointCloud(const QString &dir, const QString &baseName, const QString &format);
void performBackgroundSave(const QString &saveDir, const QString &baseName,
const QString &depthFormat, const QString &pointCloudFormat,
const QImage &image, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
// 日志辅助函数
void addLog(const QString &message, const QString &level = "INFO");
void updateStatistics();
private:
// 核心管理器
std::unique_ptr<ConfigManager> m_configManager;
std::unique_ptr<NetworkManager> m_networkManager;
std::unique_ptr<DeviceScanner> m_deviceScanner;
std::unique_ptr<PointCloudProcessor> m_pointCloudProcessor;
// UI更新定时器
QTimer *m_updateTimer;
// 状态变量
bool m_isConnected;
bool m_autoSaveOnNextFrame;
// 当前帧数据(用于拍照)
QImage m_currentImage;
pcl::PointCloud<pcl::PointXYZ>::Ptr m_currentPointCloud;
uint32_t m_currentFrameId;
// UI控件指针
class QWidget *m_centralWidget;
class QSplitter *m_mainSplitter;
class QWidget *m_controlPanel;
class QLabel *m_imageDisplay;
PointCloudWidget *m_pointCloudWidget;
// 按钮控件
QPushButton *m_refreshBtn;
QPushButton *m_connectBtn;
QPushButton *m_startBtn;
QPushButton *m_stopBtn;
QPushButton *m_onceBtn;
QPushButton *m_captureBtn;
// 输入控件
QSlider *m_exposureSlider;
QSpinBox *m_exposureSpinBox;
QSpinBox *m_ctrlPortSpinBox;
QSpinBox *m_dataPortSpinBox;
// 拍照参数控件
class QLineEdit *m_savePathEdit;
QPushButton *m_browseSavePathBtn;
class QComboBox *m_depthFormatCombo;
class QComboBox *m_pointCloudFormatCombo;
// 显示控件
QLabel *m_statusLabel;
QListWidget *m_deviceList;
// 统计信息控件
QLabel *m_depthFpsLabel;
QLabel *m_pointCloudFpsLabel;
QLabel *m_resolutionLabel;
QLabel *m_queueLabel;
// 日志显示控件
class QTextEdit *m_logDisplay;
QPushButton *m_clearLogBtn;
QPushButton *m_saveLogBtn;
// 统计数据 - 深度图
QDateTime m_lastDepthFrameTime;
int m_depthFrameCount;
int m_totalDepthFrameCount;
double m_currentDepthFps;
// 统计数据 - 点云
QDateTime m_lastPointCloudFrameTime;
int m_pointCloudFrameCount;
int m_totalPointCloudFrameCount;
double m_currentPointCloudFps;
};
#endif // MAINWINDOW_H