431 lines
20 KiB
C++
431 lines
20 KiB
C++
#include "mainwindow.h"
|
||
#include "ui_mainwindow.h"
|
||
#include <QDebug>
|
||
#include <QList>
|
||
#include <QJsonDocument>
|
||
#include <QJsonArray>
|
||
#include <QJsonObject>
|
||
#include "keyphase.h"
|
||
#include "singlerelay.h"
|
||
#include "tachometer.h"
|
||
#include "seismic_monitor.h"
|
||
#include "setpoint.h"
|
||
#include <QMessageBox>
|
||
|
||
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<QAbstractButton*> 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<QAction*>(sender());
|
||
if (action) {
|
||
// 获取触发动作的父菜单
|
||
QMenu *menu = qobject_cast<QMenu*>(action->parent());
|
||
// 遍历所有父菜单,直到找到按钮
|
||
while (menu) {
|
||
QPushButton *button = qobject_cast<QPushButton*>(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<QMenu*>(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();
|
||
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();
|
||
}
|
||
|