#include "dialogalgoarg.h" #include "ui_dialogalgoarg.h" #include #include #include #include #include #include #include #include #include #include #include "PathManager.h" #include "StyledMessageBox.h" #include #include "VrLog.h" DialogAlgoarg::DialogAlgoarg(IVrBeltTearingConfig* beltTearingConfig, const QMap& 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(); }