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
{