Software_Architecture/src/Client/guidingui.cpp

652 lines
25 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "guidingui.h"
#include "ui_guidingui.h"
#include <QWebEngineView>
#include <QString>
#include <QVBoxLayout>
#include <QDir>
#include <QUrl>
#include <QWebEnginePage>
#include <QMessageBox>
#include <QComboBox>
#include <QTime>
#include <QProcess>
#include <QDebug>
#include <QFileInfo>
#include <QBrush>
#include <QColor>
#include <QApplication>
#include <QDesktopWidget>
GuidingUI::GuidingUI(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::GuidingUI)
{
ui->setupUi(this);
// 设置窗口最小尺寸
this->setMinimumSize(1200, 800);
// 窗口居中显示
this->resize(1400, 900);
QRect screenGeometry = QApplication::desktop()->screenGeometry();
int x = (screenGeometry.width() - this->width()) / 2;
int y = (screenGeometry.height() - this->height()) / 2;
this->move(x, y);
// 初始化随机数生成器
qsrand(QTime::currentTime().msec());
// 设置按钮样式 - 现代化军用风格 (兼容Qt样式表)
QString buttonStyle = "QPushButton {"
" background: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
" stop:0 rgba(45, 65, 95, 0.8), "
" stop:1 rgba(25, 40, 65, 0.8));"
" color: rgb(220, 230, 242);"
" border: 2px solid rgba(82, 194, 242, 0.5);"
" padding: 10px 18px;"
" border-radius: 8px;"
" font-size: 14px;"
" font-weight: bold;"
" text-align: left;"
"}"
"QPushButton:hover {"
" background: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
" stop:0 rgba(82, 194, 242, 0.7), "
" stop:1 rgba(45, 120, 180, 0.7));"
" border: 2px solid rgba(82, 194, 242, 0.9);"
" color: white;"
"}"
"QPushButton:pressed {"
" background: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
" stop:0 rgba(82, 194, 242, 0.9), "
" stop:1 rgba(45, 120, 180, 0.9));"
" border: 2px solid rgba(82, 194, 242, 1.0);"
"}";
// 应用样式到所有按钮
ui->robottab->setStyleSheet(buttonStyle);
ui->robotlocation->setStyleSheet(buttonStyle);
ui->addrobot->setStyleSheet(buttonStyle);
ui->mapbutton->setStyleSheet(buttonStyle);
ui->addUAV->setStyleSheet(buttonStyle);
ui->UAVtab->setStyleSheet(buttonStyle);
ui->UAVview->setStyleSheet(buttonStyle);
ui->robotView->setStyleSheet(buttonStyle);
ui->robotMapping->setStyleSheet(buttonStyle);
ui->smartNavigation->setStyleSheet(buttonStyle);
ui->faceRecognition->setStyleSheet(buttonStyle);
ui->faceTracking->setStyleSheet(buttonStyle);
/* 控制地图显示 */
MapDisplayControl(ui->mapbutton,ui->MapDisplayer,ui->gridLayout_3);
/* 控制添加机器人 */
AddRobotControl(ui->addrobot);
/* 控制机器人列表 */
RobotsInfosControl(ui->robottab);
// 初始化默认机器人
robotList.append(qMakePair(QString("ALice"), QString("192.168.0.1")));
robotList.append(qMakePair(QString("Bob"), QString("192.168.0.2")));
// 初始化人脸识别进程
faceRecognitionProcess = new QProcess(this);
// 初始化人脸跟随进程
faceTrackingProcess = new QProcess(this);
// 连接人脸识别按钮信号
connect(ui->faceRecognition, &QPushButton::clicked, this, &GuidingUI::on_faceRecognition_clicked);
// 连接人脸跟随按钮信号
connect(ui->faceTracking, &QPushButton::clicked, this, &GuidingUI::on_faceTracking_clicked);
// 连接战场探索系统新按钮的信号
connect(ui->UAVview, &QPushButton::clicked, this, &GuidingUI::on_UAVview_clicked);
connect(ui->robotView, &QPushButton::clicked, this, &GuidingUI::on_robotView_clicked);
connect(ui->robotMapping, &QPushButton::clicked, this, &GuidingUI::on_robotMapping_clicked);
connect(ui->smartNavigation, &QPushButton::clicked, this, &GuidingUI::on_smartNavigation_clicked);
// 连接进程输出信号可以在控制台显示Python脚本的输出
connect(faceRecognitionProcess, &QProcess::readyReadStandardOutput, [this]() {
QByteArray output = faceRecognitionProcess->readAllStandardOutput();
qDebug() << "人脸识别输出:" << output;
});
connect(faceRecognitionProcess, &QProcess::readyReadStandardError, [this]() {
QByteArray error = faceRecognitionProcess->readAllStandardError();
qDebug() << "人脸识别错误:" << error;
});
}
GuidingUI::~GuidingUI()
{
// 如果进程正在运行,终止它
if (faceRecognitionProcess->state() == QProcess::Running) {
faceRecognitionProcess->terminate();
faceRecognitionProcess->waitForFinished(3000);
}
// 如果人脸跟随进程正在运行,终止它
if (faceTrackingProcess->state() == QProcess::Running) {
faceTrackingProcess->terminate();
faceTrackingProcess->waitForFinished(3000);
}
delete faceRecognitionProcess;
delete faceTrackingProcess;
delete ui;
}
void GuidingUI::MapDisplayControl(QPushButton *btnCtr,QWidget*Tar,QGridLayout*layout)
{
// 创建堆栈部件
QStackedWidget* stackedWidget = new QStackedWidget(this);
// 创建背景板部件
QWidget* backgroundWidget = new QWidget(this);
QPixmap backgroundPixmap(":/image/res/image/MapBackGround.png");
QLabel *backgroundLabel = new QLabel(backgroundWidget);
backgroundLabel->setPixmap(backgroundPixmap);
// 设置堆栈部件的组成
backgroundLabel->setMaximumSize(1500,900); // 背景板的最大尺寸
backgroundLabel->setMinimumSize(500,300); // 背景板的最小尺寸
// 设置QLabel的缩放模式为拉伸填充
backgroundLabel->setScaledContents(true);
// 设置地图部件的尺寸
Tar->setMaximumSize(1500,900); // 地图部件的最大尺寸
Tar->setMinimumSize(500,300); // 地图部件的最小尺寸
stackedWidget->addWidget(Tar);
stackedWidget->addWidget(backgroundLabel);
stackedWidget->setCurrentIndex(1);
connect(btnCtr,&QPushButton::clicked,this,[=](){
if(stackedWidget->currentIndex() == 0)
stackedWidget->setCurrentIndex(1);
else
stackedWidget->setCurrentIndex(0);
});
// 将堆栈部件添加到布局当中
layout->addWidget(stackedWidget);
QWebEngineView *view = new QWebEngineView(ui->MapDisplayer);
// 设置HTML文件的路径这里使用资源文件系统
QUrl url = QUrl("qrc:/html/res/html/map.html");
view->load(url);
// 连接loadFinished信号来确认页面是否加载成功
connect(view, &QWebEngineView::loadFinished, [view]() {
// 地图加载完成后的操作
view->page()->runJavaScript("initMap();", [](const QVariant &result) {
// 地图初始化完成后处理
});
});
// 由于 MapDisplayer 已经在 UI 布局中,我们不需要创建新的布局
// 直接将 QWebEngineView 添加到 MapDisplayer 中
QVBoxLayout *layout1 = qobject_cast<QVBoxLayout*>(ui->MapDisplayer->layout());
if (layout1) {
layout1->addWidget(view);
} else {
// 如果 MapDisplayer 没有布局,则创建一个并添加 QWebEngineView
QVBoxLayout *newLayout = new QVBoxLayout(ui->MapDisplayer);
newLayout->addWidget(view);
ui->MapDisplayer->setLayout(newLayout);
}
}
void GuidingUI::on_addrobot_clicked()
{
QDialog *dialog = new QDialog(this);
dialog->setWindowTitle("添加机器人");
dialog->setStyleSheet("QDialog { background-color: rgb(34, 43, 61); color: white; }"
"QLabel { color: rgb(220, 230, 242); font-size: 14px; }"
"QLineEdit { background-color: rgb(40, 51, 70); color: white; border: 1px solid rgba(82, 194, 242, 0.5); border-radius: 4px; padding: 5px; }"
"QPushButton { background-color: rgba(82, 194, 242, 0.6); color: white; border: none; border-radius: 4px; padding: 8px 16px; }"
"QPushButton:hover { background-color: rgba(82, 194, 242, 0.8); }"
"QPushButton:pressed { background-color: rgba(82, 194, 242, 1.0); }");
QVBoxLayout *layout = new QVBoxLayout;
QHBoxLayout *nameLayout = new QHBoxLayout;
QLabel *nameLabel = new QLabel("名称(customized)", dialog);
QLineEdit *nameEdit = new QLineEdit(dialog);
nameLayout->addWidget(nameLabel);
nameLayout->addWidget(nameEdit);
layout->addLayout(nameLayout);
QHBoxLayout *ipLayout = new QHBoxLayout;
QLabel *ipLabel = new QLabel("IP地址", dialog);
QLineEdit *ipEdit = new QLineEdit(dialog);
ipLayout->addWidget(ipLabel);
ipLayout->addWidget(ipEdit);
layout->addLayout(ipLayout);
QPushButton *okButton = new QPushButton("确定", dialog);
layout->addWidget(okButton);
connect(okButton, &QPushButton::clicked, dialog, &QDialog::accept);
connect(dialog, &QDialog::accepted, [=]() {
QString name = nameEdit->text();
QString ip = ipEdit->text();
// 保存机器人信息到列表中
if (!name.isEmpty() && !ip.isEmpty()) {
robotList.append(qMakePair(name, ip));
qDebug() << "添加机器人:" << name << " - " << ip;
}
});
dialog->setLayout(layout);
dialog->exec();
}
void GuidingUI::AddRobotControl(QPushButton* btnCtr)
{
connect(btnCtr,&QPushButton::clicked,this,&GuidingUI::on_addrobot_clicked);
}
void on_specifiedrobottab_clicked()
{
}
void GuidingUI::on_robottab_clicked()
{
QDialog *dialog = new QDialog(this);
dialog->setWindowTitle("机器人列表");
dialog->resize(600, 400);
dialog->setStyleSheet("QDialog { background-color: rgb(34, 43, 61); color: white; }"
"QLabel { color: rgb(220, 230, 242); font-size: 14px; }"
"QTableWidget { background-color: rgb(40, 51, 70); color: white; gridline-color: rgba(82, 194, 242, 0.3); border: none; }"
"QTableWidget::item { padding: 5px; }"
"QTableWidget::item:selected { background-color: rgba(82, 194, 242, 0.5); }"
"QHeaderView::section { background-color: rgb(30, 40, 60); color: rgb(220, 230, 242); padding: 5px; border: none; }"
"QPushButton { background-color: rgba(82, 194, 242, 0.6); color: white; border: none; border-radius: 4px; padding: 8px 16px; }"
"QPushButton:hover { background-color: rgba(82, 194, 242, 0.8); }"
"QPushButton:pressed { background-color: rgba(82, 194, 242, 1.0); }");
QVBoxLayout *layout = new QVBoxLayout;
QHBoxLayout *titleLayout = new QHBoxLayout;
QLabel *titleLabel = new QLabel("机器人列表", dialog);
titleLabel->setStyleSheet("font-size: 18px; font-weight: bold;");
titleLayout->addWidget(titleLabel);
layout->addLayout(titleLayout);
// 新布局当中添加列表
QTableWidget *tableWidget = new QTableWidget(dialog);
QVBoxLayout *robotListLayout = new QVBoxLayout;
robotListLayout->addWidget(tableWidget);
layout->addLayout(robotListLayout);
// 根据实际机器人数量设置行数
tableWidget->setRowCount(robotList.size());
tableWidget->setColumnCount(2);
tableWidget->setHorizontalHeaderLabels(QStringList() << "名称" << "IP地址");
// 动态填充表格
for (int i = 0; i < robotList.size(); ++i) {
QTableWidgetItem *nameItem = new QTableWidgetItem(robotList[i].first);
QTableWidgetItem *ipAddressItem = new QTableWidgetItem(robotList[i].second);
nameItem->setForeground(QBrush(QColor(220, 230, 242)));
ipAddressItem->setForeground(QBrush(QColor(220, 230, 242)));
tableWidget->setItem(i, 0, nameItem);
tableWidget->setItem(i, 1, ipAddressItem);
}
/* 跳转按钮 */
QPushButton *specified_robot_btn = new QPushButton("查看详情", dialog); // 新的按钮跟dialog是子属关系
QHBoxLayout *specified_robot_btnLayout = new QHBoxLayout(); // 按钮的布局
specified_robot_btnLayout->addWidget(specified_robot_btn); // 添加按钮到按钮布局当中
layout->addLayout(specified_robot_btnLayout); // 添加按钮布局到对话框布局当中
// connect(specified_robot_btn,&QPushButton::clicked,this,&GuidingUI::on_specifiedrobottab_clicked); // 联系槽函数
dialog->setLayout(layout);
dialog->exec();
}
void GuidingUI::RobotsInfosControl(QPushButton* btnCtr)
{
connect(btnCtr,&QPushButton::clicked,this,&GuidingUI::on_robottab_clicked);
}
// 添加无人机按钮槽函数
void GuidingUI::on_addUAV_clicked()
{
QDialog *dialog = new QDialog(this);
QVBoxLayout *layout = new QVBoxLayout;
QHBoxLayout *nameLayout = new QHBoxLayout;
QLabel *nameLabel = new QLabel("名称:", dialog);
QLineEdit *nameEdit = new QLineEdit(dialog);
nameLayout->addWidget(nameLabel);
nameLayout->addWidget(nameEdit);
layout->addLayout(nameLayout);
QHBoxLayout *ipLayout = new QHBoxLayout;
QLabel *ipLabel = new QLabel("IP地址", dialog);
QLineEdit *ipEdit = new QLineEdit(dialog);
ipLayout->addWidget(ipLabel);
ipLayout->addWidget(ipEdit);
layout->addLayout(ipLayout);
QPushButton *okButton = new QPushButton("确定", dialog);
layout->addWidget(okButton);
connect(okButton, &QPushButton::clicked, dialog, &QDialog::accept);
connect(dialog, &QDialog::accepted, [=]() {
QString name = nameEdit->text();
QString ip = ipEdit->text();
// 保存无人机信息到列表中
if (!name.isEmpty() && !ip.isEmpty()) {
uavList.append(qMakePair(name, ip));
qDebug() << "添加无人机:" << name << " - " << ip;
}
});
dialog->setLayout(layout);
dialog->exec();
}
// 无人机列表显示按钮槽函数
void GuidingUI::on_UAVtab_clicked()
{
QDialog *dialog = new QDialog(this);
QVBoxLayout *layout = new QVBoxLayout;
QHBoxLayout *titleLayout = new QHBoxLayout;
QLabel *titleLabel = new QLabel("无人机列表", dialog);
titleLayout->addWidget(titleLabel);
layout->addLayout(titleLayout);
// 添加列表
QTableWidget *tableWidget = new QTableWidget(dialog);
QVBoxLayout *uavListLayout = new QVBoxLayout;
uavListLayout->addWidget(tableWidget);
layout->addLayout(uavListLayout);
// 根据实际无人机数量设置行数
tableWidget->setRowCount(uavList.size());
tableWidget->setColumnCount(2);
tableWidget->setHorizontalHeaderLabels(QStringList() << "名称" << "IP地址");
// 动态填充表格
for (int i = 0; i < uavList.size(); ++i) {
QTableWidgetItem *nameItem = new QTableWidgetItem(uavList[i].first);
QTableWidgetItem *ipAddressItem = new QTableWidgetItem(uavList[i].second);
tableWidget->setItem(i, 0, nameItem);
tableWidget->setItem(i, 1, ipAddressItem);
}
/* 跳转按钮 */
QPushButton *specified_uav_btn = new QPushButton("查看详情", dialog);
QHBoxLayout *specified_uav_btnLayout = new QHBoxLayout();
specified_uav_btnLayout->addWidget(specified_uav_btn);
layout->addLayout(specified_uav_btnLayout);
dialog->setLayout(layout);
dialog->exec();
}
// 机器人位置显示按钮槽函数
void GuidingUI::on_robotlocation_clicked()
{
// 如果存在机器人位置数据,可从数据库获取
QMessageBox::information(this, "机器人位置", "此功能正在开发中,暂时无法使用");
}
// 战场探索系统新增的槽函数
void GuidingUI::on_UAVview_clicked()
{
QMessageBox::information(this, "无人机视角", "无人机视角功能正在开发中,暂时无法使用");
}
void GuidingUI::on_robotView_clicked()
{
QMessageBox::information(this, "机器狗视角", "机器狗视角功能正在开发中,暂时无法使用");
}
void GuidingUI::on_robotMapping_clicked()
{
QMessageBox::information(this, "机器狗建图", "机器狗建图功能正在开发中,暂时无法使用");
}
void GuidingUI::on_smartNavigation_clicked()
{
QMessageBox::information(this, "智能导航", "智能导航功能正在开发中,暂时无法使用");
}
// 人脸识别按钮点击处理函数
void GuidingUI::on_faceRecognition_clicked()
{
// 设置QMessageBox样式
QString messageBoxStyle = "QMessageBox {"
" background-color: rgb(34, 43, 61);"
" color: white;"
"}"
"QMessageBox QLabel {"
" color: rgb(220, 230, 242);"
" font-size: 14px;"
"}"
"QMessageBox QPushButton {"
" background-color: rgba(82, 194, 242, 0.6);"
" color: white;"
" border: none;"
" border-radius: 4px;"
" padding: 8px 16px;"
" min-width: 80px;"
"}"
"QMessageBox QPushButton:hover {"
" background-color: rgba(82, 194, 242, 0.8);"
"}"
"QMessageBox QPushButton:pressed {"
" background-color: rgba(82, 194, 242, 1.0);"
"}";
// 检查进程是否已经在运行
if (faceRecognitionProcess->state() == QProcess::Running) {
QMessageBox msgBox;
msgBox.setWindowTitle("提示");
msgBox.setText("人脸识别程序已经在运行!");
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
return;
}
// 设置Python解释器路径和脚本路径
QString pythonPath = "/home/hzk/Enjoy/src/face-recognition-cv2-master/venv/bin/python";
QString scriptPath = "/home/hzk/Enjoy/src/face-recognition-cv2-master/main.py";
// 检查文件是否存在
QFileInfo pythonFileInfo(pythonPath);
QFileInfo scriptFileInfo(scriptPath);
if (!pythonFileInfo.exists()) {
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("找不到Python解释器: " + pythonPath);
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
return;
}
if (!scriptFileInfo.exists()) {
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("找不到人脸识别脚本: " + scriptPath);
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
return;
}
// 设置工作目录
faceRecognitionProcess->setWorkingDirectory("/home/hzk/Enjoy/src/face-recognition-cv2-master");
// 启动Python脚本
QStringList arguments;
arguments << scriptPath;
faceRecognitionProcess->start(pythonPath, arguments);
// 等待进程启动
if (!faceRecognitionProcess->waitForStarted(3000)) {
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("无法启动人脸识别程序: " + faceRecognitionProcess->errorString());
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
return;
}
QMessageBox msgBox;
msgBox.setWindowTitle("提示");
msgBox.setText("人脸识别程序已启动!");
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
// 连接进程结束信号
connect(faceRecognitionProcess, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
[this, messageBoxStyle](int exitCode, QProcess::ExitStatus exitStatus) {
if (exitStatus == QProcess::NormalExit) {
QMessageBox msgBox;
msgBox.setWindowTitle("提示");
msgBox.setText("人脸识别程序已正常结束,退出代码: " + QString::number(exitCode));
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
} else {
QMessageBox msgBox;
msgBox.setWindowTitle("警告");
msgBox.setText("人脸识别程序异常结束!");
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
}
});
}
// 人脸跟随按钮点击处理函数
void GuidingUI::on_faceTracking_clicked()
{
// 设置QMessageBox样式
QString messageBoxStyle = "QMessageBox {"
" background-color: rgb(34, 43, 61);"
" color: white;"
"}"
"QMessageBox QLabel {"
" color: rgb(220, 230, 242);"
" font-size: 14px;"
"}"
"QMessageBox QPushButton {"
" background-color: rgba(82, 194, 242, 0.6);"
" color: white;"
" border: none;"
" border-radius: 4px;"
" padding: 8px 16px;"
" min-width: 80px;"
"}"
"QMessageBox QPushButton:hover {"
" background-color: rgba(82, 194, 242, 0.8);"
"}"
"QMessageBox QPushButton:pressed {"
" background-color: rgba(82, 194, 242, 1.0);"
"}";
// 检查进程是否已经在运行
if (faceTrackingProcess->state() == QProcess::Running) {
QMessageBox msgBox;
msgBox.setWindowTitle("提示");
msgBox.setText("人脸跟随程序已经在运行!");
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
return;
}
// 设置Python解释器路径和脚本路径
QString pythonPath = "/home/hzk/Enjoy/src/face-recognition-cv2-master/venv/bin/python";
QString scriptPath = "/home/hzk/Enjoy/src/yolov3_sort/main.py";
// 检查文件是否存在
QFileInfo pythonFileInfo(pythonPath);
QFileInfo scriptFileInfo(scriptPath);
if (!pythonFileInfo.exists()) {
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("找不到Python解释器: " + pythonPath);
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
return;
}
if (!scriptFileInfo.exists()) {
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("找不到人脸跟随脚本: " + scriptPath);
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
return;
}
// 设置工作目录
faceTrackingProcess->setWorkingDirectory("/home/hzk/Enjoy/src/yolov3_sort");
// 启动Python脚本
QStringList arguments;
arguments << scriptPath;
faceTrackingProcess->start(pythonPath, arguments);
// 等待进程启动
if (!faceTrackingProcess->waitForStarted(3000)) {
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("无法启动人脸跟随程序: " + faceTrackingProcess->errorString());
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
return;
}
QMessageBox msgBox;
msgBox.setWindowTitle("提示");
msgBox.setText("人脸跟随程序已启动!按'q'键可退出跟随窗口");
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
// 连接进程输出信号可以在控制台显示Python脚本的输出
connect(faceTrackingProcess, &QProcess::readyReadStandardOutput, [this]() {
QByteArray output = faceTrackingProcess->readAllStandardOutput();
qDebug() << "人脸跟随输出:" << output;
});
connect(faceTrackingProcess, &QProcess::readyReadStandardError, [this]() {
QByteArray error = faceTrackingProcess->readAllStandardError();
qDebug() << "人脸跟随错误:" << error;
});
// 连接进程结束信号
connect(faceTrackingProcess, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
[this, messageBoxStyle](int exitCode, QProcess::ExitStatus exitStatus) {
if (exitStatus == QProcess::NormalExit) {
QMessageBox msgBox;
msgBox.setWindowTitle("提示");
msgBox.setText("人脸跟随程序已正常结束,退出代码: " + QString::number(exitCode));
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
} else {
QMessageBox msgBox;
msgBox.setWindowTitle("警告");
msgBox.setText("人脸跟随程序异常结束!");
msgBox.setStyleSheet(messageBoxStyle);
msgBox.exec();
}
});
}