#ifndef TMRRELAYASSOCIATION_H #define TMRRELAYASSOCIATION_H #include #include #include #include "data_config.h" #include "config_mgr.h" #include //数据模型类 #include #include "tmrrelayassociation_data.h" namespace Ui { class TMRRelayAssociation; } struct ExprNode { QString value; QList children; }; struct ExprValidationResult { bool isValid; 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 { Q_OBJECT public: explicit TMRRelayAssociation(int slot,int cardtype,QWidget *parent = nullptr); ~TMRRelayAssociation(); int slot_no; CardType car_type; private slots: void on_pushButton_cancel_clicked(); void on_pushButton_confirm_clicked(); void onComboBoxIndexChanged(int index); void OnButtonGroup(QAbstractButton *); void on_pushButton_and_clicked(); void on_pushButton_or_clicked(); void on_treeView_Relay_customContextMenuRequested(const QPoint &pos); void slotDeleteItem(); void on_checkBox_sgcc_stateChanged(int arg1); void on_pushButton_logic_clicked(); private: Ui::TMRRelayAssociation *ui; QButtonGroup * btnGroup_slot = nullptr; QListWidget *list_widget_available = nullptr; int current_index; QTreeView *treeView_relay; QStandardItemModel *model_Relay; std::shared_ptr relay_data = nullptr; QMap channelNameMap; void Init(); void buildTreeFromExpression(QTreeView *treeView, const QString &expr); ExprNode* parseExpression(const QString& expr, int& pos); QStandardItem* buildItemTree(ExprNode* node); void setExpressionToTreeView(QTreeView* treeView, const QString& expr); QStandardItem* parseExpression(const QString &expr); QString buildLogicExpression(QStandardItem *item); ExprValidationResult validateLogicExpression(const QString& expr); }; #endif // TMRRELAYASSOCIATION_H