@@ -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_ == "线圈") { | |||
// 绘制线圈样式: 两边线段+中间椭圆 | |||
@@ -1,4 +1,5 @@ | |||
#include "comparator.h" | |||
#include <QMenu> | |||
#include <QPainter> | |||
#include <QStyleOptionGraphicsItem> | |||
@@ -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; | |||
} |
@@ -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 |
@@ -1,6 +1,6 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!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> | |||
<data> | |||
<variable>EnvironmentId</variable> | |||
@@ -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) | |||
@@ -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; | |||
@@ -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::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) { | |||
@@ -48,6 +48,7 @@ public slots: | |||
void onItemRequestCopy(Item*); | |||
void onItemRequestDelete(Item*); | |||
void onItemRequestBindRegister(Item*); | |||
void onItemRequestCompare(Item*); | |||
}; | |||
#endif // MYGRAPHICSVIEW_H |