@@ -11,10 +11,10 @@ void Coil::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWid | |||||
{ | { | ||||
painter->setRenderHint(QPainter::Antialiasing); | painter->setRenderHint(QPainter::Antialiasing); | ||||
if (registerValue_ > 0) { | |||||
if (state()) { | |||||
painter->setBrush(Qt::green); // 激活状态 | painter->setBrush(Qt::green); // 激活状态 | ||||
} else { | } else { | ||||
painter->setBrush(Qt::black); // 未激活状态 | |||||
painter->setBrush(Qt::white); // 未激活状态 | |||||
} | } | ||||
if (type_ == "线圈") { | if (type_ == "线圈") { | ||||
// 绘制线圈样式: 两边线段+中间椭圆 | // 绘制线圈样式: 两边线段+中间椭圆 | ||||
@@ -1,4 +1,5 @@ | |||||
#include "comparator.h" | #include "comparator.h" | ||||
#include <QMenu> | |||||
#include <QPainter> | #include <QPainter> | ||||
#include <QStyleOptionGraphicsItem> | #include <QStyleOptionGraphicsItem> | ||||
@@ -15,10 +16,15 @@ QRectF Comparator::boundingRect() const | |||||
void Comparator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) | void Comparator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) | ||||
{ | { | ||||
painter->setRenderHint(QPainter::Antialiasing); | painter->setRenderHint(QPainter::Antialiasing); | ||||
if (state()) { | |||||
painter->setBrush(Qt::green); // 激活状态 | |||||
} else { | |||||
painter->setBrush(Qt::white); // 未激活状态 | |||||
} | |||||
if (type_ == "比较") { | if (type_ == "比较") { | ||||
painter->drawRect(QRectF(-12, -8, 24, 16)); | painter->drawRect(QRectF(-12, -8, 24, 16)); | ||||
painter->setFont(QFont("Arial", 8)); | 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); | painter->setBrush(Qt::darkGray); | ||||
@@ -75,3 +81,40 @@ void Comparator::setRegisterValue(const QString ®isterId, quint16 value) | |||||
update(); // 触发重绘 | 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; | |||||
} |
@@ -12,10 +12,15 @@ public: | |||||
QWidget *) override; | QWidget *) override; | ||||
void setRegisterId(const QString &id) override; | void setRegisterId(const QString &id) override; | ||||
void setRegisterValue(const QString ®isterId, quint16 value) 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: | private: | ||||
QString registerId2_; | QString registerId2_; | ||||
quint16 registerValue2_ = 0; | quint16 registerValue2_ = 0; | ||||
QString compare_ = "CP"; | |||||
}; | }; | ||||
#endif // COMPARATOR_H | #endif // COMPARATOR_H |
@@ -1,6 +1,6 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
<!DOCTYPE QtCreatorProject> | <!DOCTYPE QtCreatorProject> | ||||
<!-- Written by QtCreator 4.11.1, 2025-08-09T09:34:13. --> | |||||
<!-- Written by QtCreator 4.11.1, 2025-08-09T12:58:16. --> | |||||
<qtcreator> | <qtcreator> | ||||
<data> | <data> | ||||
<variable>EnvironmentId</variable> | <variable>EnvironmentId</variable> | ||||
@@ -58,6 +58,11 @@ QString Item::itemType() | |||||
return type_; | return type_; | ||||
} | } | ||||
void Item::setRegisterId(const QString &id) | |||||
{ | |||||
registerId_ = id; | |||||
} | |||||
void Item::setRegisterValue(const QString ®isterId, quint16 value) | void Item::setRegisterValue(const QString ®isterId, quint16 value) | ||||
{ | { | ||||
if (registerId_ == registerId) | if (registerId_ == registerId) | ||||
@@ -26,6 +26,7 @@ public: | |||||
virtual void setRegisterValue(const QString& registerId, quint16 value); | virtual void setRegisterValue(const QString& registerId, quint16 value); | ||||
quint16 registerValue() const { return registerValue_; } | quint16 registerValue() const { return registerValue_; } | ||||
virtual void setCompare(QString) {} | |||||
// 添加状态属性(用于线圈、触点等) | // 添加状态属性(用于线圈、触点等) | ||||
virtual bool state() const { return false; } | virtual bool state() const { return false; } | ||||
@@ -35,9 +36,10 @@ signals: | |||||
void requestCopy(Item*); | void requestCopy(Item*); | ||||
void requestDelete(Item*); | void requestDelete(Item*); | ||||
void requestBindRegister(Item*); | void requestBindRegister(Item*); | ||||
void requestCompare(Item*); | |||||
protected: | protected: | ||||
virtual void MenuActions(QMenu *menu); | |||||
void MenuActions(QMenu *menu); | |||||
virtual void addMenuActions(QMenu *menu); | virtual void addMenuActions(QMenu *menu); | ||||
virtual void handleMenuAction(QAction *action); | virtual void handleMenuAction(QAction *action); | ||||
QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; | QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; | ||||
@@ -0,0 +1,53 @@ | |||||
#ifndef ITEM_H | |||||
#define ITEM_H | |||||
#include <QGraphicsObject> | |||||
#include <QColor> | |||||
#include <QList> | |||||
#include <QAction> | |||||
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<Connection*> 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<Connection*> connections_; | |||||
QString registerId_; | |||||
quint16 registerValue_ = 0; | |||||
}; | |||||
#endif // ITEM_H |
@@ -50,6 +50,7 @@ void MyGraphicsView::dropEvent(QDropEvent *event) | |||||
connect(item, &Item::requestCopy, this, &MyGraphicsView::onItemRequestCopy); | connect(item, &Item::requestCopy, this, &MyGraphicsView::onItemRequestCopy); | ||||
connect(item, &Item::requestDelete, this, &MyGraphicsView::onItemRequestDelete); | connect(item, &Item::requestDelete, this, &MyGraphicsView::onItemRequestDelete); | ||||
connect(item, &Item::requestBindRegister, this, &MyGraphicsView::onItemRequestBindRegister); | connect(item, &Item::requestBindRegister, this, &MyGraphicsView::onItemRequestBindRegister); | ||||
connect(item, &Item::requestCompare, this, &MyGraphicsView::onItemRequestCompare); | |||||
scene()->addItem(item); | scene()->addItem(item); | ||||
event->acceptProposedAction(); | 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) | void MyGraphicsView::mousePressEvent(QMouseEvent *event) | ||||
{ | { | ||||
if (event->button() == Qt::LeftButton) { | if (event->button() == Qt::LeftButton) { | ||||
@@ -48,6 +48,7 @@ public slots: | |||||
void onItemRequestCopy(Item*); | void onItemRequestCopy(Item*); | ||||
void onItemRequestDelete(Item*); | void onItemRequestDelete(Item*); | ||||
void onItemRequestBindRegister(Item*); | void onItemRequestBindRegister(Item*); | ||||
void onItemRequestCompare(Item*); | |||||
}; | }; | ||||
#endif // MYGRAPHICSVIEW_H | #endif // MYGRAPHICSVIEW_H |