#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include "keyphase.h" #include "singlerelay.h" #include "tachometer.h" #include "seismic_monitor.h" #include "setpoint.h" #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); btnGroup_slot = new QButtonGroup(this); btnGroup_slot->addButton(ui->pushButton_slot3); btnGroup_slot->addButton(ui->pushButton_slot4); btnGroup_slot->addButton(ui->pushButton_slot5); btnGroup_slot->addButton(ui->pushButton_slot6); btnGroup_slot->addButton(ui->pushButton_slot7); btnGroup_slot->addButton(ui->pushButton_slot8); btnGroup_slot->addButton(ui->pushButton_slot9); btnGroup_slot->addButton(ui->pushButton_slot10); btnGroup_slot->addButton(ui->pushButton_slot11); btnGroup_slot->addButton(ui->pushButton_slot12); btnGroup_slot->addButton(ui->pushButton_slot13); btnGroup_slot->addButton(ui->pushButton_slot14); btnGroup_slot->addButton(ui->pushButton_slot15); btnGroup_slot->addButton(ui->pushButton_slot16); btnGroup_slot->addButton(ui->pushButton_slot17); ui->pushButton_slot->setChecked(true); readJsonFile(QCoreApplication::applicationDirPath() + "\\config\\main.json"); createMenu(); connect(btnGroup_slot, SIGNAL(buttonClicked(QAbstractButton *)), this, SLOT(OnButtonGroup(QAbstractButton *))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::readJsonFile(const QString &filePath) { // 创建文件对象 QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Cannot open file for reading:" << filePath; return; } QString content = file.readAll(); file.close(); QByteArray jsonData = content.toUtf8(); QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); if (jsonDoc.isNull()) { qDebug() << "Cannot parse JSON document"; return; } if (!jsonDoc.isObject() && !jsonDoc.isArray()) { qDebug() << "JSON document is not an object or an array"; return; } int slot_id = 3; QJsonArray jsonArray = jsonDoc.array(); for (const QJsonValue &value : jsonArray) { SlotConfig slot_config; if (value.isObject()) { // 处理数组中的对象,例如每个对象代表一个记录或用户等。 QJsonObject obj = value.toObject(); slot_config.slot = obj["slot"].toInt(); slot_config.slot_type = obj["slot_type"].toInt(); slot_config.chan_display = obj["chan_display"].toString(); slot_config.rack_type = obj["rack_type"].toString(); map_slot_config.insert(slot_id,slot_config); slot_id ++; } } } void MainWindow::createMenu() { QList buttonList = btnGroup_slot->buttons(); for (int i = 0; i < buttonList.count(); i++){ buttonList[i]->setText(map_slot_config[i + 3].chan_display); createMenu(QString("%1").arg(i + 1), (QPushButton*)buttonList[i]); map_slot_config[ i + 3].slot_btn = (QPushButton*)buttonList[i]; // else // createMenuSet(QString("%1").arg(i + 1), (QPushButton*)buttonList[i]); } } void MainWindow::createMenu(const QString& rootTitle, QPushButton* parent ) { // 创建主菜单 QMenu *mainMenu = new QMenu(rootTitle, parent); // 创建第一层子菜单:/30 振电器模块 QMenu *monitors = new QMenu("监视器", mainMenu); QMenu *relays = new QMenu("/30 继电器模块", mainMenu); QMenu *keyphasor = new QMenu("/25 键相模块", mainMenu); // 创建第二层子菜单:/40 振动板卡 QMenu *proximitor_menu = new QMenu("/40 振动板卡", monitors); QMenu *rpm_menu = new QMenu("/50 转速板卡", monitors); // 创建第三层子菜单:/40 单板卡、三冗余板卡 QAction *proximitor_1 = proximitor_menu->addAction("/40 单板卡"); QAction *proximitor_2 = proximitor_menu->addAction("/40 三冗余板卡"); QAction *rpm_1 = rpm_menu->addAction("/50 单板卡"); // 创建第二层子菜单:/25 键相模块 QAction *keyphasor_1 = keyphasor->addAction("/25 单板卡"); QAction *keyphasor_2 = keyphasor->addAction("/25 两板卡"); // 创建第二层子菜单:/30 继电器模块 QAction *relays_1 = relays->addAction("/30 单板卡"); QAction *relays_2 = relays->addAction("/30 三冗余板卡"); // 将子菜单加入上一级菜单 monitors->addMenu(proximitor_menu); // 将第二层加入第一层 monitors->addMenu(rpm_menu); // 第二层另一个子菜单 mainMenu->addMenu(monitors); // 将第一层加入主菜单 mainMenu->addMenu(relays); mainMenu->addMenu(keyphasor); QAction *reset = mainMenu->addAction("重置模块"); parent->setContextMenuPolicy(Qt::CustomContextMenu); connect(parent,&QPushButton::customContextMenuRequested,[=](const QPoint &pos) { qDebug() << pos << endl; mainMenu->exec(QCursor::pos()); }); // 连接所有菜单项 QObject::connect(proximitor_1, &QAction::triggered,this, &MainWindow::onMenuActionTriggered); QObject::connect(proximitor_2, &QAction::triggered,this, &MainWindow::onMenuActionTriggered); QObject::connect(rpm_1, &QAction::triggered,this, &MainWindow::onMenuActionTriggered); QObject::connect(relays_1, &QAction::triggered,this, &MainWindow::onMenuActionTriggered); QObject::connect(relays_2, &QAction::triggered,this, &MainWindow::onMenuActionTriggered); QObject::connect(keyphasor_1, &QAction::triggered,this, &MainWindow::onMenuActionTriggered); QObject::connect(keyphasor_2, &QAction::triggered,this, &MainWindow::onMenuActionTriggered); QObject::connect(reset, &QAction::triggered,this, &MainWindow::onMenuActionTriggered); } void MainWindow::createMenuSet(const QString& rootTitle, QPushButton* parent ) { // 创建主菜单 qDebug() << "createMenu" << parent->objectName() << endl; QMenu *mainMenu = new QMenu(rootTitle, parent); QAction *option = mainMenu->addAction("通道配置…"); QAction *set_points = mainMenu->addAction("触发配置…"); QAction *point_names = mainMenu->addAction("测点名称"); } // 清除菜单中所有动作的属性 void MainWindow::clearMenuProperties(QMenu* menu) { // 遍历菜单的所有动作 if (!menu) { qWarning() << "菜单为空,无法清除属性!"; return; } // 遍历菜单的所有动作 for (QAction* action : menu->actions()) { if (!action) continue; // 检查是否有子菜单 if (QMenu* subMenu = action->menu()) { clearMenuProperties(subMenu); // 递归处理子菜单 } // 清除动作的属性 action->setProperty("customProperty", QVariant()); qDebug() << "清除了属性,动作:" << action->text(); } } void MainWindow::onMenuActionTriggered() { qDebug() << "onMenuActionTriggered()" << endl; QAction *action = qobject_cast(sender()); if (action) { // 获取触发动作的父菜单 QMenu *menu = qobject_cast(action->parent()); // 遍历所有父菜单,直到找到按钮 while (menu) { QPushButton *button = qobject_cast(menu->parent()); if (button) { qDebug() << "子菜单项被点击,所属按钮:" << button->objectName() << action->text(); int slot_type = action->text().mid(1,2).toInt(); QString rack_type = action->text().right(action->text().length()-4); int button_id = button->objectName().right(button->objectName().length()-15).toInt(); qDebug() << slot_type << rack_type << button_id << map_slot_config[button_id + 1].slot_type << map_slot_config[button_id + 2].slot_type << endl; if(rack_type == "三冗余板卡" && (map_slot_config[button_id].slot_type != 0 || map_slot_config[button_id + 1].slot_type != 0 \ || map_slot_config[button_id + 2].slot_type != 0)){ QMessageBox::information(this, QStringLiteral("提示"), "不要重叠三冗余板卡配置,请在创建新配置之前移除现有的配置!"); return; }else if(rack_type == "三冗余板卡" && map_slot_config[button_id + 1].slot_type == 0 \ && map_slot_config[button_id + 2].slot_type == 0){ map_slot_config[button_id].slot_type = slot_type; map_slot_config[button_id].rack_type = "TMR1"; map_slot_config[button_id].slot_btn->setText(action->text()); map_slot_config[button_id].chan_display = action->text(); map_slot_config[button_id + 1].slot_type = slot_type; map_slot_config[button_id + 1].rack_type = "TMR2"; map_slot_config[button_id + 1].slot_btn->setText(action->text()); map_slot_config[button_id + 1].chan_display = action->text(); map_slot_config[button_id + 2].slot_type = slot_type; map_slot_config[button_id + 2].rack_type = "TMR3"; map_slot_config[button_id + 2].slot_btn->setText(action->text()); map_slot_config[button_id + 2].chan_display = action->text(); } if(rack_type == "两板卡" && (map_slot_config[button_id].slot_type != 0 || map_slot_config[button_id + 1].slot_type != 0 )){ QMessageBox::information(this, QStringLiteral("提示"), "不要重叠两板卡配置,请在创建新配置之前移除现有的配置!"); return; }else if(rack_type == "两板卡" && map_slot_config[button_id + 1].slot_type == 0){ map_slot_config[button_id].slot_type = slot_type; map_slot_config[button_id].rack_type = "Double1"; map_slot_config[button_id].slot_btn->setText(action->text()); map_slot_config[button_id].chan_display = action->text(); map_slot_config[button_id + 1].slot_type = slot_type; map_slot_config[button_id + 1].rack_type = "Double2"; map_slot_config[button_id + 1].slot_btn->setText(action->text()); map_slot_config[button_id + 1].chan_display = action->text(); } if(rack_type == "单板卡" && map_slot_config[button_id].slot_type != 0){ QMessageBox::information(this, QStringLiteral("提示"), "不要重叠单板卡配置,请在创建新配置之前移除现有的配置!"); return; }else if(rack_type == "单板卡" && map_slot_config[button_id].slot_type == 0) { map_slot_config[button_id].slot_type = slot_type; map_slot_config[button_id].rack_type = "Single"; map_slot_config[button_id].chan_display = action->text(); button->setText(action->text()); } QString reset_slot = action->text(); qDebug() << "action->text():" << action->text() << reset_slot; if(reset_slot == "重置模块"){ if(map_slot_config[button_id].rack_type == "TMR1"){ map_slot_config[button_id].slot_type = 0; map_slot_config[button_id].rack_type = "0"; map_slot_config[button_id].slot_btn->setText(""); map_slot_config[button_id].chan_display = ""; map_slot_config[button_id + 1].slot_type = 0; map_slot_config[button_id + 1].rack_type = "0"; map_slot_config[button_id + 1].slot_btn->setText(""); map_slot_config[button_id + 1].chan_display = ""; map_slot_config[button_id + 2].slot_type = 0; map_slot_config[button_id + 2].rack_type = "0"; map_slot_config[button_id + 2].slot_btn->setText(""); map_slot_config[button_id + 2].chan_display = ""; }else if(map_slot_config[button_id].rack_type == "TMR2"){ map_slot_config[button_id - 1].slot_type = 0; map_slot_config[button_id - 1].rack_type = "0"; map_slot_config[button_id - 1].slot_btn->setText(""); map_slot_config[button_id - 1].chan_display = ""; map_slot_config[button_id].slot_type = 0; map_slot_config[button_id].rack_type = "0"; map_slot_config[button_id].slot_btn->setText(""); map_slot_config[button_id].chan_display = ""; map_slot_config[button_id + 1].slot_type = 0; map_slot_config[button_id + 1].rack_type = "0"; map_slot_config[button_id + 1].slot_btn->setText(""); map_slot_config[button_id + 1].chan_display = ""; }else if(map_slot_config[button_id].rack_type == "TMR3"){ map_slot_config[button_id - 2].slot_type = 0; map_slot_config[button_id - 2].rack_type = "0"; map_slot_config[button_id - 2].slot_btn->setText(""); map_slot_config[button_id - 2].chan_display = ""; map_slot_config[button_id - 1].slot_type = 0; map_slot_config[button_id - 1].rack_type = "0"; map_slot_config[button_id - 1].slot_btn->setText(""); map_slot_config[button_id - 1].chan_display = ""; map_slot_config[button_id].slot_type = 0; map_slot_config[button_id].rack_type = "0"; map_slot_config[button_id].slot_btn->setText(""); map_slot_config[button_id].chan_display = ""; } if(map_slot_config[button_id].rack_type == "Double1"){ map_slot_config[button_id].slot_type = 0; map_slot_config[button_id].rack_type = "0"; map_slot_config[button_id].slot_btn->setText(""); map_slot_config[button_id].chan_display = ""; map_slot_config[button_id + 1].slot_type = 0; map_slot_config[button_id + 1].rack_type = "0"; map_slot_config[button_id + 1].slot_btn->setText(""); map_slot_config[button_id + 1].chan_display = ""; }else if(map_slot_config[button_id].rack_type == "Double2"){ map_slot_config[button_id - 1].slot_type = 0; map_slot_config[button_id - 1].rack_type = "0"; map_slot_config[button_id - 1].slot_btn->setText(""); map_slot_config[button_id - 1].chan_display = ""; map_slot_config[button_id].slot_type = 0; map_slot_config[button_id].rack_type = "0"; map_slot_config[button_id].slot_btn->setText(""); map_slot_config[button_id].chan_display = ""; } if(map_slot_config[button_id].rack_type == "Single"){ map_slot_config[button_id].slot_type = 0; map_slot_config[button_id].rack_type = "0"; map_slot_config[button_id].slot_btn->setText(""); map_slot_config[button_id].chan_display = ""; } } // QMenu* menu = button->menu(); // if (!menu) { // qWarning() << "菜单为空,无法清除属性!"; // return; // } clearMenuProperties(button->menu()); createMenu(); break; // 找到按钮后,跳出循环 } // 如果没有找到按钮,继续向上查找 menu = qobject_cast(menu->parent()); } } } void MainWindow::OnButtonGroup(QAbstractButton * slot_btn) { if(slot_btn != NULL && ui->pushButton_chan->isChecked()) { QString object_name = slot_btn->objectName(); qDebug() << object_name << endl; int button_id = object_name.right(object_name.length()-15).toInt(); SlotConfig slot_config = map_slot_config[button_id]; if (slot_config.slot_type == KEYPHASOR){ KeyPhase *key_phase = new KeyPhase(); key_phase->setWindowModality(Qt::ApplicationModal); key_phase->show(); }else if (slot_config.slot_type == RELAY){ SingleRelay *single_relay = new SingleRelay(); single_relay->setWindowModality(Qt::ApplicationModal); single_relay->show(); }else if (slot_config.slot_type == VIBRATE){ Seismic_monitor *seismic_monitor = new Seismic_monitor(button_id); seismic_monitor->setWindowModality(Qt::ApplicationModal); seismic_monitor->show(); }else if (slot_config.slot_type == RPM){ Tachometer *tachometer = new Tachometer(); tachometer->setWindowModality(Qt::ApplicationModal); tachometer->show(); } } if(slot_btn != NULL && ui->pushButton_alarm->isChecked()){ QString object_name = slot_btn->objectName(); qDebug() << object_name << endl; Setpoint *setpoint = new Setpoint(); setpoint->setWindowModality(Qt::ApplicationModal); setpoint->show(); } } void MainWindow::on_pushButton_slot_clicked() { if(ui->pushButton_chan->isChecked()) ui->pushButton_chan->setChecked(false); if(ui->pushButton_alarm->isChecked()) ui->pushButton_alarm->setChecked(false); if(ui->pushButton_point_name->isChecked()) ui->pushButton_point_name->setChecked(false); } void MainWindow::on_pushButton_chan_clicked() { if(ui->pushButton_slot->isChecked()) ui->pushButton_slot->setChecked(false); if(ui->pushButton_alarm->isChecked()) ui->pushButton_alarm->setChecked(false); if(ui->pushButton_point_name->isChecked()) ui->pushButton_point_name->setChecked(false); } void MainWindow::on_pushButton_alarm_clicked() { if(ui->pushButton_slot->isChecked()) ui->pushButton_slot->setChecked(false); if(ui->pushButton_chan->isChecked()) ui->pushButton_chan->setChecked(false); if(ui->pushButton_point_name->isChecked()) ui->pushButton_point_name->setChecked(false); } void MainWindow::on_pushButton_point_name_clicked() { if(ui->pushButton_slot->isChecked()) ui->pushButton_slot->setChecked(false); if(ui->pushButton_chan->isChecked()) ui->pushButton_chan->setChecked(false); if(ui->pushButton_alarm->isChecked()) ui->pushButton_alarm->setChecked(false); } void MainWindow::on_pushButton_save_clicked() { QJsonObject itemObj; QJsonArray slotArray; for(int i = 0; i < map_slot_config.size();i++){ itemObj["slot"] = map_slot_config[i+3].slot; itemObj["slot_type"] = map_slot_config[i+3].slot_type; itemObj["chan_display"] = map_slot_config[i+3].chan_display; itemObj["rack_type"] = map_slot_config[i+3].rack_type; slotArray.append(itemObj); } QJsonDocument jsonDoc; jsonDoc.setArray(slotArray); QFile file(QCoreApplication::applicationDirPath() + "\\config\\main.json"); file.open(QIODevice::WriteOnly); file.write(jsonDoc.toJson()); file.close(); } void MainWindow::on_pushButton_open_clicked() { }