2025-09-29 00:56:53 +08:00

191 lines
6.5 KiB
C++

#include "dialogalgoarg.h"
#include "ui_dialogalgoarg.h"
#include <QMessageBox>
#include <QPushButton>
#include <QtCore/QCoreApplication>
#include <QtCore/QFileInfo>
#include <QtCore/QDir>
#include <QtCore/QStandardPaths>
#include <QtCore/QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QVariant>
#include "PathManager.h"
#include "StyledMessageBox.h"
#include <algorithm>
#include "VrLog.h"
DialogAlgoarg::DialogAlgoarg(IVrBeltTearingConfig* beltTearingConfig, const QMap<QString, ServerInfo>& serverInfos, QWidget *parent)
: QDialog(parent)
, ui(new Ui::DialogAlgoarg)
, m_beltTearingConfig(beltTearingConfig)
, m_serverInfos(serverInfos)
{
ui->setupUi(this);
// 隐藏标题栏
setWindowFlags(Qt::FramelessWindowHint);
// 设置服务器选择组合框
setupServerComboBox();
// 连接服务器选择变化信号
connect(ui->comboBox_serverSelect, &QComboBox::currentTextChanged, this, &DialogAlgoarg::on_serverComboBox_currentTextChanged);
}
DialogAlgoarg::~DialogAlgoarg()
{
delete ui;
}
void DialogAlgoarg::Init()
{
requestParamFromServer();
}
void DialogAlgoarg::setupServerComboBox()
{
ui->comboBox_serverSelect->clear();
int index = 0;
for (auto it = m_serverInfos.begin(); it != m_serverInfos.end(); ++it) {
// 使用 ServerInfo 的 name 字段作为显示文本
QString displayName = QString::fromStdString(it.value().name);
// 存储索引作为用户数据
ui->comboBox_serverSelect->addItem(displayName, QVariant(index));
index++;
}
}
void DialogAlgoarg::requestParamFromServer()
{
// 获取当前选择的服务器索引
int selectedIndex = ui->comboBox_serverSelect->currentData().toInt();
if (selectedIndex < 0 || selectedIndex >= m_serverInfos.size()) {
return;
}
// 根据索引获取对应的服务器名称
auto it = m_serverInfos.begin();
std::advance(it, selectedIndex);
QString selectedServer = it.key();
LOG_DEBUG("request param from : %s \n", selectedServer.toStdString().c_str());
// 同时从服务器加载数据
emit requestServerData(selectedServer);
}
void DialogAlgoarg::on_serverComboBox_currentTextChanged(const QString &text)
{
requestParamFromServer();
}
void DialogAlgoarg::sendParametersToServer()
{
// 获取当前选择的服务器索引
int selectedIndex = ui->comboBox_serverSelect->currentData().toInt();
if (selectedIndex < 0 || selectedIndex >= m_serverInfos.size()) {
return;
}
// 根据索引获取对应的服务器名称
auto it = m_serverInfos.begin();
std::advance(it, selectedIndex);
QString selectedServer = it.key();
// 创建JSON格式的参数数据
QJsonObject paramJson;
paramJson["command"] = "setAlgorithmParams";
paramJson["scanXScale"] = ui->lineEdit_scanXScale->text().toDouble();
paramJson["scanYScale"] = ui->lineEdit_scanYScale->text().toDouble();
paramJson["differnceBinTh"] = ui->lineEdit_differnceBinTh->text().toDouble();
paramJson["tearingMinLen"] = ui->lineEdit_tearingMinLen->text().toDouble();
paramJson["tearingMinGap"] = ui->lineEdit_tearingMinGap->text().toDouble();
paramJson["sameGapTh"] = ui->lineEdit_sameGapTh->text().toDouble();
paramJson["gapChkWin"] = ui->lineEdit_gapChkWin->text().toInt();
QJsonDocument doc(paramJson);
QByteArray data = doc.toJson();
// 这里需要通过网络发送给对应的服务器
// 具体实现将在Presenter中完成
emit parametersChanged(selectedServer, data);
}
void DialogAlgoarg::onServerDataReceived(const QString& serverName, const QJsonObject& data)
{
// 更新UI显示从服务器获取的参数
updateUIWithServerData(data);
// StyledMessageBox::information(this, "提示", "从服务器加载算法参数完成!");
}
void DialogAlgoarg::updateUIWithServerData(const QJsonObject& serverData)
{
// 从服务器返回的数据中提取算法参数并更新UI
// 检查数据是否是配置响应格式
QJsonObject algorithmParams;
if (serverData.contains("config") && serverData["config"].isObject()) {
// 从 config 字段中提取算法参数(服务器返回的配置响应格式)
QJsonObject configObj = serverData["config"].toObject();
if (configObj.contains("algorithmParams") && configObj["algorithmParams"].isObject()) {
algorithmParams = configObj["algorithmParams"].toObject();
}
} else if (serverData.contains("algorithmParams") && serverData["algorithmParams"].isObject()) {
// 直接从根字段提取算法参数(旧格式或其他响应格式)
algorithmParams = serverData["algorithmParams"].toObject();
}
// 更新算法参数UI
if (!algorithmParams.isEmpty()) {
if (algorithmParams.contains("scanXScale")) {
ui->lineEdit_scanXScale->setText(QString::number(algorithmParams["scanXScale"].toDouble()));
}
if (algorithmParams.contains("scanYScale")) {
ui->lineEdit_scanYScale->setText(QString::number(algorithmParams["scanYScale"].toDouble()));
}
if (algorithmParams.contains("differnceBinTh")) {
ui->lineEdit_differnceBinTh->setText(QString::number(algorithmParams["differnceBinTh"].toDouble()));
}
if (algorithmParams.contains("tearingMinLen")) {
ui->lineEdit_tearingMinLen->setText(QString::number(algorithmParams["tearingMinLen"].toDouble()));
}
// 处理额外的参数
if (algorithmParams.contains("tearingMinGap")) {
ui->lineEdit_tearingMinGap->setText(QString::number(algorithmParams["tearingMinGap"].toDouble()));
}
if (algorithmParams.contains("sameGapTh")) {
ui->lineEdit_sameGapTh->setText(QString::number(algorithmParams["sameGapTh"].toDouble()));
}
if (algorithmParams.contains("gapChkWin")) {
ui->lineEdit_gapChkWin->setText(QString::number(algorithmParams["gapChkWin"].toInt()));
}
}
}
void DialogAlgoarg::on_btn_camer_ok_clicked()
{
// 发送参数到服务器
sendParametersToServer();
StyledMessageBox::information(this, "成功", "配置保存成功并已发送到服务器!");
accept();
}
void DialogAlgoarg::on_btn_camer_cancel_clicked()
{
// 直接关闭窗口,不保存任何更改
reject();
}