From c95c57adc65d778af1deb079e8764b0cb31d0a0f Mon Sep 17 00:00:00 2001 From: 123 <123@example.com> Date: Mon, 7 Jul 2025 16:40:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=86=E8=A7=89=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E7=B3=BB=E7=BB=9FWeb=E6=9C=8D=E5=8A=A1=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增功能: - 在MainWindow中集成视觉识别系统Web服务 - 添加startVisionWebService()和stopVisionWebService()方法 - 无人机视图和无人机控制按钮现在可以启动视觉识别Web界面 - 添加QProcess成员变量管理Python子进程 - 实现进程生命周期管理,包括优雅退出和强制终止 - 完善错误处理和日志记录 技术实现: - 使用QProcess启动distance-judgement/main_web.py - 进程信号连接,监控启动、退出和错误状态 - 析构函数中确保进程正确清理 - Web服务运行在localhost:5000端口 --- src/Client/include/ui/main/MainWindow.h | 13 +++ src/Client/src/ui/main/MainWindow.cpp | 107 +++++++++++++++++++++--- 2 files changed, 110 insertions(+), 10 deletions(-) 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服务已停止"); +} +