diff --git a/acceleration.ui b/acceleration.ui index 816dbb4..e0dbe0e 100644 --- a/acceleration.ui +++ b/acceleration.ui @@ -1131,6 +1131,9 @@ + + false + 100 diff --git a/config_mgr.cpp b/config_mgr.cpp index 988b42d..7744c91 100644 --- a/config_mgr.cpp +++ b/config_mgr.cpp @@ -38,7 +38,6 @@ void ConfigMgr::Save(QString & file_path) { card_type_[i] != kCardKeyphaseSingle && card_type_[i] != kCardRelaySingle && card_type_[i] != kCardRelayTMRPrimary && - card_type_[i] != kCardRelayTMRBackup && card_type_[i] != kCardRelaySingleNOK) { continue; } @@ -297,11 +296,10 @@ void ConfigMgr::Save(QString & file_path) { if(ptr->tmr_relay[ch].logic_expression != ""){ channel_item.insert("logic_expression", ptr->tmr_relay[ch].logic_expression); } - }else if(card_type_[i] == kCardRelayTMRBackup){ - continue; } - if(!channel_item.isEmpty()) + if(!channel_item.isEmpty() ){ slot_item[QString::number(ch + 1)] = channel_item; + } } slot_item["version"] = 1; } @@ -356,7 +354,7 @@ void ConfigMgr::Load(QString filename) { continue; } slot = i + 1; - if (json_obj[QString::number(slot)].isNull()) { + if (json_obj[QString::number(slot)].isNull() && card_type_[i] != kCardRelayTMRBackup) { continue; } temp_obj = json_obj[QString::number(slot)].toObject(); diff --git a/config_mgr.h b/config_mgr.h index 0c9e432..d38f234 100644 --- a/config_mgr.h +++ b/config_mgr.h @@ -8,6 +8,8 @@ #include #include #include +#include //数据模型类 +#include class DraggableListWidget : public QListWidget { public: @@ -38,6 +40,71 @@ protected: drag->exec(Qt::CopyAction); } }; +class DropTreeModel : public QStandardItemModel { +public: + using QStandardItemModel::QStandardItemModel; + + QStringList mimeTypes() const override { + // 支持自定义类型和 QListWidget 默认类型 + return { "application/x-custom", "application/x-qabstractitemmodeldatalist" }; + } + + bool dropMimeData(const QMimeData *data, Qt::DropAction action, + int row, int column, const QModelIndex &parent) override { + QStandardItem *parentItem = this->itemFromIndex(parent); + if (!parentItem) + parentItem = this->invisibleRootItem(); + + if (data->hasFormat("application/x-custom")) { + QByteArray rawData = data->data("application/x-custom"); + QString customText = QString::fromUtf8(rawData); + + QStandardItem *newItem = new QStandardItem(customText); + newItem->setData(customText, Qt::UserRole); // 假设 data 也就是内容 + newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | + Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); + + if (row < 0) + parentItem->appendRow(newItem); + else + parentItem->insertRow(row, newItem); + + return true; + } + + if (data->hasFormat("application/x-qabstractitemmodeldatalist")) { + QByteArray encoded = data->data("application/x-qabstractitemmodeldatalist"); + QDataStream stream(&encoded, QIODevice::ReadOnly); + + while (!stream.atEnd()) { + int r, c; + QMap roleDataMap; + stream >> r >> c >> roleDataMap; + + QString text = roleDataMap.value(Qt::DisplayRole).toString(); + QVariant userData = roleDataMap.value(Qt::UserRole); + + QStandardItem *newItem = new QStandardItem(text); + newItem->setData(userData, Qt::UserRole); // 保留附加数据 + newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | + Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); + + if (row < 0) + parentItem->appendRow(newItem); + else + parentItem->insertRow(row, newItem); + } + + return true; + } + + return false; + } + + Qt::DropActions supportedDropActions() const override { + return Qt::CopyAction | Qt::MoveAction; + } +}; class ConfigMgr { private: static ConfigMgr *instance; diff --git a/mainwindow.cpp b/mainwindow.cpp index ad2ec33..8974665 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -183,8 +183,8 @@ void MainWindow::createMenu(const QString &rootTitle, QPushButton *parent) { // 创建第二层子菜单:/KPM834 键相模块 QAction *keyphasor_1 = keyphasor->addAction("/KPM834 单板卡"); keyphasor_1->setData(kCardKeyphaseSingle); - QAction *keyphasor_2 = keyphasor->addAction("/KPM834 两板卡"); - keyphasor_2->setData(kCardKeyphaseDouble); + //QAction *keyphasor_2 = keyphasor->addAction("/KPM834 两板卡"); + //keyphasor_2->setData(kCardKeyphaseDouble); // 创建第二层子菜单:/DOM810 继电器模块 QAction *relays_1 = relays->addAction("/DOM810 单板卡"); relays_1->setData(kCardRelaySingle); diff --git a/radial_vibration.ui b/radial_vibration.ui index ef84d42..ce15039 100644 --- a/radial_vibration.ui +++ b/radial_vibration.ui @@ -1071,6 +1071,9 @@ + + false + 100 diff --git a/seismic_monitor.cpp b/seismic_monitor.cpp index 16ba123..21dfc6a 100644 --- a/seismic_monitor.cpp +++ b/seismic_monitor.cpp @@ -258,7 +258,7 @@ void Seismic_monitor::on_comboBox_chan_type_1_currentTextChanged(const QString & } void Seismic_monitor::on_comboBox_chan_type_2_currentTextChanged(const QString &arg1) { - switch (ui->comboBox_chan_type_1->currentIndex()) { + switch (ui->comboBox_chan_type_2->currentIndex()) { case kVibRadial: ui->label_unit_2->setText("mV / mm"); break; @@ -272,7 +272,7 @@ void Seismic_monitor::on_comboBox_chan_type_2_currentTextChanged(const QString & } void Seismic_monitor::on_comboBox_chan_type_3_currentTextChanged(const QString &arg1) { - switch (ui->comboBox_chan_type_1->currentIndex()) { + switch (ui->comboBox_chan_type_3->currentIndex()) { case kVibRadial: ui->label_unit_3->setText("mV / mm"); break; @@ -286,7 +286,7 @@ void Seismic_monitor::on_comboBox_chan_type_3_currentTextChanged(const QString & } void Seismic_monitor::on_comboBox_chan_type_4_currentTextChanged(const QString &arg1) { - switch (ui->comboBox_chan_type_1->currentIndex()) { + switch (ui->comboBox_chan_type_4->currentIndex()) { case kVibRadial: ui->label_unit_4->setText("mV / mm"); break; diff --git a/seismic_monitor.ui b/seismic_monitor.ui index 69174dd..e6ee6af 100644 --- a/seismic_monitor.ui +++ b/seismic_monitor.ui @@ -82,6 +82,9 @@ + + false + 100 @@ -95,6 +98,9 @@ + + false + 100 @@ -108,6 +114,9 @@ + + false + 100 diff --git a/setpoint.cpp b/setpoint.cpp index 04f03d6..870ff65 100644 --- a/setpoint.cpp +++ b/setpoint.cpp @@ -5,6 +5,7 @@ #include "displacement_ds.h" #include "acceleration_ds.h" #include "velocity_ds.h" +#include Setpoint::Setpoint(int slot_no_,int cardtype,QWidget *parent) : QWidget(parent), @@ -14,7 +15,8 @@ Setpoint::Setpoint(int slot_no_,int cardtype,QWidget *parent) : slot_no = slot_no_; car_type = static_cast(cardtype); ui->label_slot->setText(QString::number(slot_no)); - + ui->comboBox_chan->setView(new QListView()); + ui->comboBox_danger->setView(new QListView()); Init(); connect(ui->comboBox_chan, QOverload::of(&QComboBox::currentIndexChanged), this, &Setpoint::onComboBoxIndexChanged); @@ -54,10 +56,9 @@ void Setpoint::Init(){ std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); vib_alert_ptr = std::dynamic_pointer_cast(base_ptr); + switch (car_type) { case kCardVibSingle:{ - slider_1x_ampl->setRange(0,20); - slider_2x_ampl->setRange(0,20); update(); }break; } @@ -153,152 +154,156 @@ void Setpoint::update() std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); std::shared_ptr setpoint_data = std::dynamic_pointer_cast(base_ptr); std::vector> variable_ = setpoint_data->variables_; + if(!variable_[chan]->x1_.checked){ + ui->checkBox_1x_ampl->setEnabled(false); + ui->lineEdit_1x_ampl_lower->setEnabled(false); + ui->lineEdit_1x_ampl_upper->setEnabled(false); + } + if(!variable_[chan]->x2_.checked){ + ui->checkBox_2x_ampl->setEnabled(false); + ui->lineEdit_2x_ampl_upper->setEnabled(false); + ui->lineEdit_2x_ampl_lower->setEnabled(false); + } if(setpoint_data->base_config_[chan].channel_type == kVibRadial){ - for (int var = 0; var < variable_.size(); ++var) { - if(variable_[var]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,100); - slider_danger->setRange(0,100); - }else if(variable_[var]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,150); - slider_danger->setRange(0,150); - }else if(variable_[var]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,200); - slider_danger->setRange(0,200); - }else if(variable_[var]->direct_.full_scale_range == 3){ - slider_direct->setRange(0,400); - slider_danger->setRange(0,400); - }else if(variable_[var]->direct_.full_scale_range == 4){ - slider_direct->setRange(0,500); - slider_danger->setRange(0,500); - } - ui->label_direct->setText("um"); - ui->label_danger->setText("um"); + + if(variable_[chan]->direct_.full_scale_range == 0){ + slider_direct->setRange(0,100); + slider_danger->setRange(0,100); + }else if(variable_[chan]->direct_.full_scale_range == 1){ + slider_direct->setRange(0,150); + slider_danger->setRange(0,150); + }else if(variable_[chan]->direct_.full_scale_range == 2){ + slider_direct->setRange(0,200); + slider_danger->setRange(0,200); + }else if(variable_[chan]->direct_.full_scale_range == 3){ + slider_direct->setRange(0,400); + slider_danger->setRange(0,400); + }else if(variable_[chan]->direct_.full_scale_range == 4){ + slider_direct->setRange(0,500); + slider_danger->setRange(0,500); } + ui->label_direct->setText("um"); + ui->label_danger->setText("um"); + } if(setpoint_data->base_config_[chan].channel_type == kVibAcc){ std::shared_ptr base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1); std::shared_ptr av_ptr = std::dynamic_pointer_cast(base_channel_ptr); - for (int var = 0; var < variable_.size(); ++ var) { - if(variable_[var]->direct_.full_scale_range == 0){ + if(variable_[chan]->direct_.full_scale_range == 0){ + slider_direct->setRange(0,20); + slider_danger->setRange(0,20); + }else if(variable_[chan]->direct_.full_scale_range == 1){ + slider_direct->setRange(0,50); + slider_danger->setRange(0,50); + }else if(variable_[chan]->direct_.full_scale_range == 2){ + slider_direct->setRange(0,100); + slider_danger->setRange(0,100); + }else if(variable_[chan]->direct_.full_scale_range == 3){ + slider_direct->setRange(0,200); + slider_danger->setRange(0,200); + }else if(variable_[chan]->direct_.full_scale_range == 4){ + slider_direct->setRange(0,250); + slider_danger->setRange(0,250); + }else if(variable_[chan]->direct_.full_scale_range == 5){ + slider_direct->setRange(0,400); + slider_danger->setRange(0,400); + } + ui->label_direct->setText("m/s^2 pk"); + ui->label_danger->setText("m/s^2 pk"); + + if(av_ptr->rms_active_){ + if(variable_[chan]->direct_.full_scale_range == 0){ slider_direct->setRange(0,20); slider_danger->setRange(0,20); - }else if(variable_[var]->direct_.full_scale_range == 1){ + }else if(variable_[chan]->direct_.full_scale_range == 1){ slider_direct->setRange(0,50); slider_danger->setRange(0,50); - }else if(variable_[var]->direct_.full_scale_range == 2){ + }else if(variable_[chan]->direct_.full_scale_range == 2){ slider_direct->setRange(0,100); slider_danger->setRange(0,100); - }else if(variable_[var]->direct_.full_scale_range == 3){ + }else if(variable_[chan]->direct_.full_scale_range == 3){ slider_direct->setRange(0,200); slider_danger->setRange(0,200); - }else if(variable_[var]->direct_.full_scale_range == 4){ - slider_direct->setRange(0,250); - slider_danger->setRange(0,250); - }else if(variable_[var]->direct_.full_scale_range == 5){ - slider_direct->setRange(0,400); - slider_danger->setRange(0,400); - } - ui->label_direct->setText("m/s^2 pk"); - ui->label_danger->setText("m/s^2 pk"); - } - if(av_ptr->rms_active_){ - for (int var = 0; var < variable_.size(); ++ var) { - if(variable_[var]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,20); - slider_danger->setRange(0,20); - }else if(variable_[var]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,50); - slider_danger->setRange(0,50); - }else if(variable_[var]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,100); - slider_danger->setRange(0,100); - }else if(variable_[var]->direct_.full_scale_range == 3){ - slider_direct->setRange(0,200); - slider_danger->setRange(0,200); - } - ui->label_direct->setText("m/s^2 rms"); - ui->label_danger->setText("m/s^2 rms"); } + ui->label_direct->setText("m/s^2 rms"); + ui->label_danger->setText("m/s^2 rms"); } + if(av_ptr->integrate_active_){ - for (int var = 0; var < variable_.size(); ++ var) { - if(variable_[var]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,25); - slider_danger->setRange(0,25); - }else if(variable_[var]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,50); - slider_danger->setRange(0,50); - }else if(variable_[var]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,100); - slider_danger->setRange(0,100); - } - ui->label_direct->setText("mm/s pk"); - ui->label_danger->setText("mm/s pk"); - } - } - if(av_ptr->rms_active_ && av_ptr->integrate_active_){ - for (int var = 0; var < variable_.size(); ++ var) { - if(variable_[var]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,25); - slider_danger->setRange(0,25); - }else if(variable_[var]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,50); - slider_danger->setRange(0,50); - } - ui->label_direct->setText("mm/s rms"); - ui->label_danger->setText("mm/s rms"); - } - } - } - if(setpoint_data->base_config_[chan].channel_type == kVibVelocity){ - std::shared_ptr base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1); - std::shared_ptr av_ptr = std::dynamic_pointer_cast(base_channel_ptr); - for (int var = 0; var < variable_.size(); ++ var) { - if(variable_[var]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,10); - slider_danger->setRange(0,10); - }else if(variable_[var]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,20); - slider_danger->setRange(0,20); - }else if(variable_[var]->direct_.full_scale_range == 2){ + if(variable_[chan]->direct_.full_scale_range == 0){ + slider_direct->setRange(0,25); + slider_danger->setRange(0,25); + }else if(variable_[chan]->direct_.full_scale_range == 1){ slider_direct->setRange(0,50); slider_danger->setRange(0,50); + }else if(variable_[chan]->direct_.full_scale_range == 2){ + slider_direct->setRange(0,100); + slider_danger->setRange(0,100); } ui->label_direct->setText("mm/s pk"); ui->label_danger->setText("mm/s pk"); } + + if(av_ptr->rms_active_ && av_ptr->integrate_active_){ + if(variable_[chan]->direct_.full_scale_range == 0){ + slider_direct->setRange(0,25); + slider_danger->setRange(0,25); + }else if(variable_[chan]->direct_.full_scale_range == 1){ + slider_direct->setRange(0,50); + slider_danger->setRange(0,50); + } + ui->label_direct->setText("mm/s rms"); + ui->label_danger->setText("mm/s rms"); + } + + } + if(setpoint_data->base_config_[chan].channel_type == kVibVelocity){ + std::shared_ptr base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1); + std::shared_ptr av_ptr = std::dynamic_pointer_cast(base_channel_ptr); + + if(variable_[chan]->direct_.full_scale_range == 0){ + slider_direct->setRange(0,10); + slider_danger->setRange(0,10); + }else if(variable_[chan]->direct_.full_scale_range == 1){ + slider_direct->setRange(0,20); + slider_danger->setRange(0,20); + }else if(variable_[chan]->direct_.full_scale_range == 2){ + slider_direct->setRange(0,50); + slider_danger->setRange(0,50); + } + ui->label_direct->setText("mm/s pk"); + ui->label_danger->setText("mm/s pk"); + if(av_ptr->rms_active_){ - for (int var = 0; var < variable_.size(); ++ var) { - if(variable_[var]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,10); - slider_danger->setRange(0,10); - }else if(variable_[var]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,20); - slider_danger->setRange(0,20); - }else if(variable_[var]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,50); - slider_danger->setRange(0,50); - } - ui->label_direct->setText("mm/s rms"); - ui->label_danger->setText("mm/s rms"); + if(variable_[chan]->direct_.full_scale_range == 0){ + slider_direct->setRange(0,10); + slider_danger->setRange(0,10); + }else if(variable_[chan]->direct_.full_scale_range == 1){ + slider_direct->setRange(0,20); + slider_danger->setRange(0,20); + }else if(variable_[chan]->direct_.full_scale_range == 2){ + slider_direct->setRange(0,50); + slider_danger->setRange(0,50); } + ui->label_direct->setText("mm/s rms"); + ui->label_danger->setText("mm/s rms"); } + if(av_ptr->integrate_active_){ - for (int var = 0; var < variable_.size(); ++ var) { - if(variable_[var]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,100); - slider_danger->setRange(0,100); - }else if(variable_[var]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,200); - slider_danger->setRange(0,200); - }else if(variable_[var]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,500); - slider_danger->setRange(0,500); - } - ui->label_direct->setText("um pp"); - ui->label_danger->setText("um pp"); + if(variable_[chan]->direct_.full_scale_range == 0){ + slider_direct->setRange(0,100); + slider_danger->setRange(0,100); + }else if(variable_[chan]->direct_.full_scale_range == 1){ + slider_direct->setRange(0,200); + slider_danger->setRange(0,200); + }else if(variable_[chan]->direct_.full_scale_range == 2){ + slider_direct->setRange(0,500); + slider_danger->setRange(0,500); } + ui->label_direct->setText("um pp"); + ui->label_danger->setText("um pp"); } + } ui->lineEdit_direct_upper->setText(QString::number(setpoint_data->alert_danger[chan].direct_upper)); ui->checkBox_direct->setChecked(setpoint_data->alert_danger[chan].direct_enable); diff --git a/setpoint.ui b/setpoint.ui index c0a1d58..d8fc8c2 100644 --- a/setpoint.ui +++ b/setpoint.ui @@ -28,7 +28,7 @@ - 10 + 20 30 69 22 @@ -53,20 +53,35 @@ - 20 - 72 - 36 - 16 + 30 + 60 + 50 + 20 + + + 50 + 0 + + + + + 50 + 16777215 + + - - + + Qt::AlignCenter + - 20 + 30 415 47 16 @@ -82,7 +97,7 @@ - 12 + 30 90 50 20 @@ -104,7 +119,7 @@ - 0 + 10 116 100 260 @@ -187,6 +202,9 @@ + + false + 100 @@ -319,10 +337,22 @@ 130 59 - 36 + 50 16 + + + 50 + 0 + + + + + 50 + 16777215 + + - - @@ -393,10 +423,22 @@ 230 59 - 36 + 50 16 + + + 50 + 0 + + + + + 50 + 16777215 + + - - @@ -533,12 +575,24 @@ - 40 + 25 60 - 36 - 16 + 50 + 20 + + + 50 + 0 + + + + + 50 + 16777215 + + - - diff --git a/singlerelay.cpp b/singlerelay.cpp index 6ec8da8..97fbbef 100644 --- a/singlerelay.cpp +++ b/singlerelay.cpp @@ -10,15 +10,22 @@ SingleRelay::SingleRelay(int slot,int cardtype,QWidget *parent) car_type = static_cast(cardtype); ui->label_slot_no->setText(QString::number(slot_no)); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - QVBoxLayout *layout_relay = new QVBoxLayout(ui->widget_relay); - textEdit_relay = new DropTextEdit; - textEdit_relay->setAcceptDrops(true); - layout_relay->addWidget(textEdit_relay); QVBoxLayout *layout_available = new QVBoxLayout(ui->widget_available); - list_widget_available = new DraggableListWidget(); + list_widget_available = new QListWidget(); layout_available->addWidget(list_widget_available); list_widget_available->setDragEnabled(true); + QVBoxLayout *layout_relay = new QVBoxLayout(ui->widget_relay); + treeView_relay = new QTreeView; + layout_relay->addWidget(treeView_relay); + treeView_relay->setDragEnabled(true); // 启用拖动 + treeView_relay->setAcceptDrops(true); // 接受放下 + treeView_relay->setDropIndicatorShown(true); // 显示放置指示器 + treeView_relay->setDragDropMode(QAbstractItemView::DropOnly); + model_Relay = new DropTreeModel(this); //创建模型指定父类 + treeView_relay->setModel(model_Relay); + treeView_relay->setHeaderHidden(true); + btnGroup_slot = new QButtonGroup(this); btnGroup_slot->addButton(ui->pushButton_slot1); btnGroup_slot->addButton(ui->pushButton_slot2); @@ -38,14 +45,15 @@ SingleRelay::SingleRelay(int slot,int cardtype,QWidget *parent) btnGroup_slot->addButton(ui->pushButton_slot16); connect(btnGroup_slot, SIGNAL(buttonClicked(QAbstractButton *)), this, SLOT(OnButtonGroup(QAbstractButton *))); - //connect(ui->pushButton_backspace, &QPushButton::clicked, textEdit_relay, &DropTextEdit::removeLastElement); connect(ui->comboBox_relay_ch, QOverload::of(&QComboBox::currentIndexChanged), this, &SingleRelay::onComboBoxIndexChanged); Init(); current_index = ui->comboBox_relay_ch->currentIndex(); if(single_relay_nok_data->single_relay_nok[current_index].logic_expression != ""){ QString channel_name = channelNameMap[single_relay_nok_data->single_relay_nok[current_index].logic_expression]; - textEdit_relay->setPlainText(channel_name); + QStandardItem *item = new QStandardItem(channel_name); + item->setData(single_relay_nok_data->single_relay_nok[current_index].logic_expression,Qt::UserRole); + model_Relay->appendRow(item); } } @@ -121,14 +129,18 @@ void SingleRelay::OnButtonGroup(QAbstractButton *slot_btn) { int button_id = object_name.right(object_name.length() - 15).toInt(); for(int var = 0; var < CHANNEL_COUNT ; ++var){ std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(button_id); - std::shared_ptr vib_data = std::dynamic_pointer_cast(base_ptr); - if((vib_data->base_config_[var].standby && vib_data->base_config_[var + 1].standby && !(var % 2))) - continue; - QString item_str = QString("%1 (槽位 %2 通道 %3 非OK)").arg(vib_data->base_config_[var].point_name).arg(button_id).arg(var+1); - QListWidgetItem *item = new QListWidgetItem(item_str); - QString item_data = QString("S%1C%2P##NO").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); - item->setData(Qt::UserRole, item_data); - list_widget_available->addItem(item); + if(base_ptr->card_type_ == kCardVibSingle){ + std::shared_ptr vib_data = std::dynamic_pointer_cast(base_ptr); + if((vib_data->base_config_[var].standby && vib_data->base_config_[var + 1].standby && !(var % 2))) + continue; + QString item_str = QString("%1 (槽位 %2 通道 %3 非OK)").arg(vib_data->base_config_[var].point_name).arg(button_id).arg(var+1); + QListWidgetItem *item = new QListWidgetItem(item_str); + QString item_data = QString("S%1C%2P##NO").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); + item->setData(Qt::UserRole, item_data); + list_widget_available->addItem(item); + }else if(base_ptr->card_type_ == kCardSpeedSingle){ + + } } } } @@ -142,7 +154,7 @@ void SingleRelay::on_pushButton_enter_clicked() void SingleRelay::on_pushButton_clr_clicked() { - textEdit_relay->setText(""); + } @@ -160,26 +172,39 @@ void SingleRelay::keyPressEvent(QKeyEvent *event) { void SingleRelay::on_pushButton_confirm_clicked() { - single_relay_nok_data->single_relay_nok[current_index].logic_expression = textEdit_relay->toPlainText(); + QStandardItemModel *model = qobject_cast(treeView_relay->model()); + if (!model) return; + QStandardItem *root = model->invisibleRootItem(); + QStandardItem *topItem = root->child(0); + QString finalExpr; + QVariant userData = topItem->data(Qt::UserRole); + QString user_text = userData.toString().trimmed(); + single_relay_nok_data->single_relay_nok[current_index].logic_expression = user_text; this->close(); } void SingleRelay::onComboBoxIndexChanged(int index){ qDebug()<< "[SingleRelay]:index " << index; - QString html = textEdit_relay->toHtml(); - qDebug() << html ; - QRegularExpression spanRegex(R"(]*data-key='([^']+)'[^>]*>([^<]+))"); - QRegularExpressionMatchIterator i = spanRegex.globalMatch(html); - QString userData = "",visibleText = ""; - while (i.hasNext()) { - QRegularExpressionMatch match = i.next(); - userData = match.captured(1); - visibleText = match.captured(2); + QStandardItemModel *model = qobject_cast(treeView_relay->model()); + if (!model) return; + QStandardItem *root = model->invisibleRootItem(); + if(root->rowCount() > 0){ + QStandardItem *topItem = root->child(0); + QString finalExpr; + QVariant userData = topItem->data(Qt::UserRole); + QString user_text = userData.toString().trimmed(); + single_relay_nok_data->single_relay_nok[current_index].logic_expression = user_text; } - qDebug() << "Extracted data-key:" << userData << ", text:" << visibleText; - - single_relay_nok_data->single_relay_nok[current_index].logic_expression = userData; current_index = index; - textEdit_relay->setPlainText(single_relay_nok_data->single_relay_nok[index].logic_expression); + + if(single_relay_nok_data->single_relay_nok[index].logic_expression != ""){ + model_Relay->clear(); + QString channel_name = channelNameMap[single_relay_nok_data->single_relay_nok[current_index].logic_expression]; + QStandardItem *item = new QStandardItem(channel_name); + item->setData(single_relay_nok_data->single_relay_nok[current_index].logic_expression,Qt::UserRole); + model_Relay->appendRow(item); + }else{ + model_Relay->clear(); + } } diff --git a/singlerelay.h b/singlerelay.h index 7659aac..b9f7043 100644 --- a/singlerelay.h +++ b/singlerelay.h @@ -8,61 +8,13 @@ #include "data_config.h" #include "config_mgr.h" #include "singlerelay_data.h" +#include //数据模型类 +#include namespace Ui { class SingleRelay; } -class DropTextEdit : public QTextEdit { - Q_OBJECT -public: - DropTextEdit(QWidget *parent = nullptr) : QTextEdit(parent) { - setAcceptDrops(true); - } -public slots: - -protected: - void dragEnterEvent(QDragEnterEvent *event) override { - if (event->mimeData()->hasFormat("application/x-custom")) { - event->acceptProposedAction(); - } else { - event->ignore(); - } - } - - void dragMoveEvent(QDragMoveEvent *event) override { - if (event->mimeData()->hasFormat("application/x-custom")) { - event->acceptProposedAction(); - } else { - event->ignore(); - } - } - - void dropEvent(QDropEvent *event) override { - if (!this->toPlainText().isEmpty()) { - event->ignore(); - return; - } - if (event->mimeData()->hasFormat("application/x-custom")) { - QByteArray data = event->mimeData()->data("application/x-custom"); - QDataStream stream(&data, QIODevice::ReadOnly); - QString visibleText, userData; - stream >> visibleText >> userData; // 解析显示文本和 UserRole 数据 - qDebug() << visibleText << userData; - QString text = QString::fromUtf8(data); - - QTextCursor cursor = this->textCursor(); - this->setTextCursor(cursor); - - QString html = QString("%2 ") - .arg(userData.toHtmlEscaped(), visibleText.toHtmlEscaped()); - cursor.insertHtml(html); - event->acceptProposedAction(); - } else { - event->ignore(); - } - } -}; class SingleRelay : public QDialog { Q_OBJECT @@ -89,8 +41,9 @@ class SingleRelay : public QDialog { private: Ui::SingleRelay *ui; QButtonGroup * btnGroup_slot = nullptr; - DraggableListWidget *list_widget_available = nullptr; - DropTextEdit *textEdit_relay = nullptr; + QListWidget *list_widget_available = nullptr; + QTreeView *treeView_relay; + QStandardItemModel *model_Relay; std::shared_ptr single_relay_nok_data = nullptr; int current_index; QMap channelNameMap; diff --git a/tmrrelayassociation.h b/tmrrelayassociation.h index d0b5ffc..0047e64 100644 --- a/tmrrelayassociation.h +++ b/tmrrelayassociation.h @@ -6,8 +6,7 @@ #include #include "data_config.h" #include "config_mgr.h" -#include //数据模型类 -#include + #include "tmrrelayassociation_data.h" #include @@ -23,71 +22,7 @@ struct ExprValidationResult { int errorPos; QString errorMsg; }; -class DropTreeModel : public QStandardItemModel { -public: - using QStandardItemModel::QStandardItemModel; - QStringList mimeTypes() const override { - // 支持自定义类型和 QListWidget 默认类型 - return { "application/x-custom", "application/x-qabstractitemmodeldatalist" }; - } - - bool dropMimeData(const QMimeData *data, Qt::DropAction action, - int row, int column, const QModelIndex &parent) override { - QStandardItem *parentItem = this->itemFromIndex(parent); - if (!parentItem) - parentItem = this->invisibleRootItem(); - - if (data->hasFormat("application/x-custom")) { - QByteArray rawData = data->data("application/x-custom"); - QString customText = QString::fromUtf8(rawData); - - QStandardItem *newItem = new QStandardItem(customText); - newItem->setData(customText, Qt::UserRole); // 假设 data 也就是内容 - newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | - Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); - - if (row < 0) - parentItem->appendRow(newItem); - else - parentItem->insertRow(row, newItem); - - return true; - } - - if (data->hasFormat("application/x-qabstractitemmodeldatalist")) { - QByteArray encoded = data->data("application/x-qabstractitemmodeldatalist"); - QDataStream stream(&encoded, QIODevice::ReadOnly); - - while (!stream.atEnd()) { - int r, c; - QMap roleDataMap; - stream >> r >> c >> roleDataMap; - - QString text = roleDataMap.value(Qt::DisplayRole).toString(); - QVariant userData = roleDataMap.value(Qt::UserRole); - - QStandardItem *newItem = new QStandardItem(text); - newItem->setData(userData, Qt::UserRole); // 保留附加数据 - newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | - Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); - - if (row < 0) - parentItem->appendRow(newItem); - else - parentItem->insertRow(row, newItem); - } - - return true; - } - - return false; - } - - Qt::DropActions supportedDropActions() const override { - return Qt::CopyAction | Qt::MoveAction; - } -}; class TMRRelayAssociation : public QDialog {