diff --git a/coil.cpp b/coil.cpp index be28e26..d267f3b 100644 --- a/coil.cpp +++ b/coil.cpp @@ -11,10 +11,10 @@ void Coil::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWid { painter->setRenderHint(QPainter::Antialiasing); - if (registerValue_ > 0) { + if (state()) { painter->setBrush(Qt::green); // 激活状态 } else { - painter->setBrush(Qt::black); // 未激活状态 + painter->setBrush(Qt::white); // 未激活状态 } if (type_ == "线圈") { // 绘制线圈样式: 两边线段+中间椭圆 diff --git a/comparator.cpp b/comparator.cpp index 1cf320f..6d6000f 100644 --- a/comparator.cpp +++ b/comparator.cpp @@ -1,4 +1,5 @@ #include "comparator.h" +#include #include #include @@ -15,10 +16,15 @@ QRectF Comparator::boundingRect() const void Comparator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) { painter->setRenderHint(QPainter::Antialiasing); + if (state()) { + painter->setBrush(Qt::green); // 激活状态 + } else { + painter->setBrush(Qt::white); // 未激活状态 + } if (type_ == "比较") { painter->drawRect(QRectF(-12, -8, 24, 16)); painter->setFont(QFont("Arial", 8)); - painter->drawText(QRectF(-10, -8, 20, 16), Qt::AlignCenter, "CP"); + painter->drawText(QRectF(-10, -8, 20, 16), Qt::AlignCenter, compare_); // 锚点 painter->setBrush(Qt::darkGray); @@ -75,3 +81,40 @@ void Comparator::setRegisterValue(const QString ®isterId, quint16 value) update(); // 触发重绘 } } + +void Comparator::addMenuActions(QMenu *menu) +{ + menu->addAction("比较"); +} + +void Comparator::handleMenuAction(QAction *action) +{ + if (action->text() == "复制") { + emit requestCopy(this); + } + if (action->text() == "删除") { + emit requestDelete(this); + } + if (action->text() == "对象"){ + emit requestBindRegister(this); + } + if (action->text() == "比较"){ + emit requestCompare(this); + } +} + +void Comparator::setCompare(QString compare) +{ + compare_ = compare; + update(); +} + +bool Comparator::state() const +{ + if (compare_ == ">") return registerValue_ > registerValue2_; + if (compare_ == "<") return registerValue_ < registerValue2_; + if (compare_ == "=") return registerValue_ == registerValue2_; + if (compare_ == ">=") return registerValue_ >= registerValue2_; + if (compare_ == "<") return registerValue_ <= registerValue2_; + return false; +} diff --git a/comparator.h b/comparator.h index a60f7c2..19f5839 100644 --- a/comparator.h +++ b/comparator.h @@ -12,10 +12,15 @@ public: QWidget *) override; void setRegisterId(const QString &id) override; void setRegisterValue(const QString ®isterId, quint16 value) override; + void addMenuActions(QMenu *menu) override; + void handleMenuAction(QAction *action) override; + void setCompare(QString) override; + bool state() const override; private: QString registerId2_; quint16 registerValue2_ = 0; + QString compare_ = "CP"; }; #endif // COMPARATOR_H diff --git a/editor.pro.user b/editor.pro.user index 3a14858..26c4f65 100644 --- a/editor.pro.user +++ b/editor.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/item.cpp b/item.cpp index a8fc850..ffef5b3 100644 --- a/item.cpp +++ b/item.cpp @@ -58,6 +58,11 @@ QString Item::itemType() return type_; } +void Item::setRegisterId(const QString &id) +{ + registerId_ = id; +} + void Item::setRegisterValue(const QString ®isterId, quint16 value) { if (registerId_ == registerId) diff --git a/item.h b/item.h index a6a690f..0254bc3 100644 --- a/item.h +++ b/item.h @@ -26,6 +26,7 @@ public: virtual void setRegisterValue(const QString& registerId, quint16 value); quint16 registerValue() const { return registerValue_; } + virtual void setCompare(QString) {} // 添加状态属性(用于线圈、触点等) virtual bool state() const { return false; } @@ -35,9 +36,10 @@ signals: void requestCopy(Item*); void requestDelete(Item*); void requestBindRegister(Item*); + void requestCompare(Item*); protected: - virtual void MenuActions(QMenu *menu); + void MenuActions(QMenu *menu); virtual void addMenuActions(QMenu *menu); virtual void handleMenuAction(QAction *action); QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; diff --git a/item.h.autosave b/item.h.autosave new file mode 100644 index 0000000..41593fa --- /dev/null +++ b/item.h.autosave @@ -0,0 +1,53 @@ +#ifndef ITEM_H +#define ITEM_H + +#include +#include +#include +#include + +class Connection; + +class Item : public QGraphicsObject +{ + Q_OBJECT +public: + enum AnchorType { Left, Right }; + explicit Item(const QString &type, QGraphicsItem *parent = nullptr); + + QRectF boundingRect() const override; + QPointF anchorPos(AnchorType type) const; + void addConnection(Connection* conn); + void removeConnection(Connection* conn); + QList connections(); + QString itemType(); + virtual void setRegisterId(const QString& id); + QString registerId() const { return registerId_; } + virtual void setRegisterValue(const QString& registerId, quint16 value); + quint16 registerValue() const { return registerValue_; } + + virtual void setCompare(QString) {} + + // 添加状态属性(用于线圈、触点等) + virtual bool state() const { return false; } + + +signals: + void requestCopy(Item*); + void requestDelete(Item*); + void requestBindRegister(Item*); + void requestCompare(Item*); + +protected: + void MenuActions(QMenu *menu); + virtual void addMenuActions(QMenu *menu); + virtual void handleMenuAction(QAction *action); + QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; + void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; + QString type_; + QList connections_; + QString registerId_; + quint16 registerValue_ = 0; +}; + +#endif // ITEM_H diff --git a/mygraphicsview.cpp b/mygraphicsview.cpp index 1c59a10..1a9fffb 100644 --- a/mygraphicsview.cpp +++ b/mygraphicsview.cpp @@ -50,6 +50,7 @@ void MyGraphicsView::dropEvent(QDropEvent *event) connect(item, &Item::requestCopy, this, &MyGraphicsView::onItemRequestCopy); connect(item, &Item::requestDelete, this, &MyGraphicsView::onItemRequestDelete); connect(item, &Item::requestBindRegister, this, &MyGraphicsView::onItemRequestBindRegister); + connect(item, &Item::requestCompare, this, &MyGraphicsView::onItemRequestCompare); scene()->addItem(item); event->acceptProposedAction(); @@ -209,6 +210,19 @@ void MyGraphicsView::onItemRequestBindRegister(Item *item) } } +void MyGraphicsView::onItemRequestCompare(Item *item) +{ + if (!item) return; + + QString compare = QInputDialog::getText( + this, + "绑定寄存器", + "格式:>、<、=、<=、>=", + QLineEdit::Normal + ); + item->setCompare(compare); +} + void MyGraphicsView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { diff --git a/mygraphicsview.h b/mygraphicsview.h index d51e227..e347c5b 100644 --- a/mygraphicsview.h +++ b/mygraphicsview.h @@ -48,6 +48,7 @@ public slots: void onItemRequestCopy(Item*); void onItemRequestDelete(Item*); void onItemRequestBindRegister(Item*); + void onItemRequestCompare(Item*); }; #endif // MYGRAPHICSVIEW_H