#include "dialognetconfig.h" #include "ui_dialognetconfig.h" #include "IVrBeltTearingConfig.h" #include "PathManager.h" #include #include #include "widgets/StyledMessageBox.h" #include DialogNetConfig::DialogNetConfig(QWidget *parent) : QDialog(parent) , ui(new Ui::DialogNetConfig) , m_config(nullptr) { // 设置窗口标志,隐藏标题栏并使窗口成为模态对话框 setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); setModal(true); ui->setupUi(this); // 创建配置实例 IVrBeltTearingConfig::CreateInstance(&m_config); // 连接信号和槽 connect(ui->btn_camer_ok, &QPushButton::clicked, this, &DialogNetConfig::onSaveConfig); connect(ui->btn_camer_cancel, &QPushButton::clicked, this, &DialogNetConfig::onCancel); connect(ui->pushButton_2, &QPushButton::clicked, this, &DialogNetConfig::onRemoveServer); // 加载配置 loadConfig(); } void DialogNetConfig::showEvent(QShowEvent *event) { // 调用基类的showEvent QDialog::showEvent(event); // 每次显示时重新加载配置 loadConfig(); } DialogNetConfig::~DialogNetConfig() { if (m_config) { delete m_config; m_config = nullptr; } delete ui; } void DialogNetConfig::loadConfig() { if (!m_config) { return; } QString configPath = PathManager::GetConfigFilePath(); BeltTearingConfigResult configResult = m_config->LoadConfig(configPath.toStdString()); // 清空组合框 ui->combo_server->clear(); // 添加服务器到组合框,并将索引作为用户数据存储 for (size_t i = 0; i < configResult.servers.size(); ++i) { const auto& server = configResult.servers[i]; ui->combo_server->addItem(QString::fromStdString(server.name), static_cast(i)); } // 添加"新增"选项 ui->combo_server->addItem("新增", -1); // 如果有服务器,选择第一个并加载其配置 if (!configResult.servers.empty()) { ui->combo_server->setCurrentIndex(0); const ServerInfo& server = configResult.servers[0]; ui->lineEdit_name->setText(QString::fromStdString(server.name)); ui->lineEdit_ip->setText(QString::fromStdString(server.ip)); ui->lineEdit_port->setText(QString::number(server.port)); } // 连接组合框的信号和槽 connect(ui->combo_server, &QComboBox::currentTextChanged, this, &DialogNetConfig::onServerSelectionChanged); } void DialogNetConfig::onServerSelectionChanged(const QString& text) { if (!m_config) { return; } // 如果选择的是"新增",则清空输入框 if (text == "新增") { ui->lineEdit_name->clear(); ui->lineEdit_ip->clear(); ui->lineEdit_port->clear(); ui->lineEdit_name->setFocus(); return; } QString configPath = PathManager::GetConfigFilePath(); BeltTearingConfigResult configResult = m_config->LoadConfig(configPath.toStdString()); // 获取当前选中项的索引 int index = ui->combo_server->currentData().toInt(); // 检查索引是否有效 if (index >= 0 && index < static_cast(configResult.servers.size())) { const ServerInfo& server = configResult.servers[index]; ui->lineEdit_name->setText(QString::fromStdString(server.name)); ui->lineEdit_ip->setText(QString::fromStdString(server.ip)); ui->lineEdit_port->setText(QString::number(server.port)); } } void DialogNetConfig::onSaveConfig() { if (!m_config) { return; } QString configPath = PathManager::GetConfigFilePath(); BeltTearingConfigResult configResult = m_config->LoadConfig(configPath.toStdString()); // 获取当前输入的服务器信息 QString inputName = ui->lineEdit_name->text(); QString inputIp = ui->lineEdit_ip->text(); int inputPort = ui->lineEdit_port->text().toInt(); // 检查输入的名称是否为空 if (inputName.isEmpty()) { StyledMessageBox::warning(this, "警告", "服务器名称不能为空"); return; } // 检查IP地址是否为空 if (inputIp.isEmpty()) { StyledMessageBox::warning(this, "警告", "服务器IP地址不能为空"); return; } // 检查IP地址格式是否正确 QRegExp ipRegex("^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$"); if (!ipRegex.exactMatch(inputIp)) { StyledMessageBox::warning(this, "警告", "服务器IP地址格式不正确"); return; } // 检查端口是否为空或无效 if (ui->lineEdit_port->text().isEmpty() || inputPort <= 0 || inputPort > 65535) { StyledMessageBox::warning(this, "警告", "端口号必须在1-65535之间"); return; } // 获取当前选中的服务器名称 QString selectedName = ui->combo_server->currentText(); // 如果当前没有选中服务器或选中的服务器名称与输入的名称不同,则添加新服务器 if (selectedName.isEmpty() || selectedName == "新增") { ServerInfo newServer; newServer.name = inputName.toStdString(); newServer.ip = inputIp.toStdString(); newServer.port = inputPort; configResult.servers.push_back(newServer); } else { // 更新当前选中的服务器配置 for (auto& server : configResult.servers) { QString serverName = QString::fromStdString(server.name); if (serverName == selectedName) { server.name = inputName.toStdString(); server.ip = inputIp.toStdString(); server.port = inputPort; break; } } } // 保存配置 bool success = m_config->SaveConfig(configPath.toStdString(), configResult); if (success) { StyledMessageBox::information(this, "提示", "配置保存成功"); // 通知主窗口重新初始化 emit configSaved(); // 关闭对话框 this->accept(); } else { StyledMessageBox::critical(this, "错误", "配置保存失败"); } } void DialogNetConfig::onCancel() { // 通知主窗口重新初始化 emit configSaved(); this->reject(); } void DialogNetConfig::onRemoveServer() { if (!m_config) { return; } QString selectedName = ui->combo_server->currentText(); if (selectedName.isEmpty()) { StyledMessageBox::warning(this, "警告", "请选择要删除的服务器"); return; } // 不能删除"新增"选项 if (selectedName == "新增") { StyledMessageBox::warning(this, "警告", "不能删除\"新增\"选项"); return; } QString configPath = PathManager::GetConfigFilePath(); BeltTearingConfigResult configResult = m_config->LoadConfig(configPath.toStdString()); // 获取当前选中项的索引 int index = ui->combo_server->currentData().toInt(); // 检查索引是否有效 if (index >= 0 && index < static_cast(configResult.servers.size())) { // 删除指定索引的服务器 configResult.servers.erase(configResult.servers.begin() + index); // 保存配置 bool success = m_config->SaveConfig(configPath.toStdString(), configResult); if (success) { StyledMessageBox::information(this, "提示", "服务器删除成功"); // 重新加载配置 loadConfig(); } else { StyledMessageBox::critical(this, "错误", "服务器删除失败"); } } else { StyledMessageBox::warning(this, "警告", "未找到要删除的服务器"); } }