diff --git a/src/Client/include/ui/main/MainWindow.h b/src/Client/include/ui/main/MainWindow.h index 23e41920..fa461675 100644 --- a/src/Client/include/ui/main/MainWindow.h +++ b/src/Client/include/ui/main/MainWindow.h @@ -346,6 +346,16 @@ private: */ void initializeModernStyles(); + /** + * @brief 启动视觉识别系统Web服务 + */ + void startVisionWebService(); + + /** + * @brief 停止视觉识别系统Web服务 + */ + void stopVisionWebService(); + private: Ui::MainWindow *m_ui; ///< UI界面指针 IntelligenceUI *m_intelligenceUI; ///< 情报传达界面指针 @@ -361,6 +371,9 @@ private: // DroneControlDialog *m_droneControlDialog; ///< 无人机控制对话框 // RobotDogControlDialog *m_robotDogControlDialog; ///< 机器狗控制对话框 + // 视觉识别系统相关 + QProcess *m_visionProcess; ///< 视觉识别系统进程 + // 人脸识别相关成员变量已移除(功能暂未实现) }; #endif // MAINWINDOW_H diff --git a/src/Client/src/ui/main/MainWindow.cpp b/src/Client/src/ui/main/MainWindow.cpp index 9f631bac..42644357 100644 --- a/src/Client/src/ui/main/MainWindow.cpp +++ b/src/Client/src/ui/main/MainWindow.cpp @@ -56,6 +56,7 @@ MainWindow::MainWindow(QWidget *parent) , m_leftPanelSplitter(nullptr) , m_intelligenceUI(nullptr) , m_faceLightControl(nullptr) + , m_visionProcess(nullptr) // , m_droneControlDialog(nullptr) // , m_robotDogControlDialog(nullptr) { @@ -91,6 +92,17 @@ MainWindow::~MainWindow() // delete m_robotDogControlDialog; // m_robotDogControlDialog = nullptr; // } + + // 停止并清理视觉识别进程 + if (m_visionProcess) { + if (m_visionProcess->state() != QProcess::NotRunning) { + m_visionProcess->kill(); + m_visionProcess->waitForFinished(3000); + } + delete m_visionProcess; + m_visionProcess = nullptr; + } + delete m_ui; } @@ -781,7 +793,10 @@ void MainWindow::onRobotLocationClicked() void MainWindow::onUAVViewClicked() { - QMessageBox::information(this, "无人机视图", "无人机视图功能正在开发中,暂时无法使用"); + SystemLogger::getInstance()->logInfo("无人机视角请求"); + + // 启动视觉识别系统Web服务 + startVisionWebService(); } void MainWindow::onRobotViewClicked() @@ -1356,15 +1371,8 @@ void MainWindow::onDroneControlRequested() { SystemLogger::getInstance()->logInfo("无人机控制请求"); - // 暂时使用简单的消息框来测试功能 - QMessageBox::information(this, "无人机控制", - "无人机控制界面功能正在开发中...\n" - "将包含以下功能:\n" - "• 飞行控制(起飞、降落、悬停)\n" - "• 航线规划和导航\n" - "• 实时视频传输\n" - "• 照片拍摄和传输\n" - "• 人物识别功能"); + // 启动视觉识别系统Web服务 + startVisionWebService(); } void MainWindow::onRobotDogControlRequested() @@ -1382,3 +1390,82 @@ void MainWindow::onRobotDogControlRequested() "• 设备状态监控"); } +void MainWindow::startVisionWebService() +{ + SystemLogger::getInstance()->logInfo("启动视觉识别系统Web服务"); + + // 如果进程已经在运行,先停止它 + if (m_visionProcess && m_visionProcess->state() != QProcess::NotRunning) { + SystemLogger::getInstance()->logWarning("视觉识别系统已在运行,先停止现有进程"); + stopVisionWebService(); + } + + // 创建新的进程对象 + if (!m_visionProcess) { + m_visionProcess = new QProcess(this); + + // 连接进程信号 + connect(m_visionProcess, &QProcess::started, [this]() { + SystemLogger::getInstance()->logInfo("视觉识别系统Web服务启动成功"); + QMessageBox::information(this, "无人机视觉系统", + "视觉识别系统正在启动...\n" + "Web界面将在几秒钟后自动打开\n" + "访问地址: https://localhost:5000"); + }); + + connect(m_visionProcess, QOverload::of(&QProcess::finished), + [this](int exitCode, QProcess::ExitStatus exitStatus) { + Q_UNUSED(exitStatus) + SystemLogger::getInstance()->logInfo(QString("视觉识别系统Web服务已停止,退出代码: %1").arg(exitCode)); + }); + + connect(m_visionProcess, &QProcess::errorOccurred, [this](QProcess::ProcessError error) { + QString errorMsg; + switch (error) { + case QProcess::FailedToStart: + errorMsg = "无法启动Python进程,请检查Python环境"; + break; + case QProcess::Crashed: + errorMsg = "视觉识别系统进程意外崩溃"; + break; + default: + errorMsg = "视觉识别系统进程发生未知错误"; + break; + } + SystemLogger::getInstance()->logError(errorMsg); + QMessageBox::critical(this, "启动错误", errorMsg); + }); + } + + // 设置工作目录和启动参数 + QString workingDir = "/home/hzk/Software_Architecture/distance-judgement"; + QString pythonScript = "main_web.py"; + + m_visionProcess->setWorkingDirectory(workingDir); + m_visionProcess->start("python3", QStringList() << pythonScript); + + SystemLogger::getInstance()->logInfo("正在启动视觉识别系统..."); +} + +void MainWindow::stopVisionWebService() +{ + if (!m_visionProcess || m_visionProcess->state() == QProcess::NotRunning) { + SystemLogger::getInstance()->logWarning("视觉识别系统进程未运行"); + return; + } + + SystemLogger::getInstance()->logInfo("停止视觉识别系统Web服务"); + + // 优雅地终止进程 + m_visionProcess->terminate(); + + // 等待进程结束,如果超时则强制杀死 + if (!m_visionProcess->waitForFinished(5000)) { + SystemLogger::getInstance()->logWarning("进程未能正常退出,强制结束"); + m_visionProcess->kill(); + m_visionProcess->waitForFinished(3000); + } + + SystemLogger::getInstance()->logInfo("视觉识别系统Web服务已停止"); +} +