Browse Source

比较指令的状态改变

master
鹏鹏 李 12 hours ago
parent
commit
813f2df497
9 changed files with 128 additions and 5 deletions
  1. +2
    -2
      coil.cpp
  2. +44
    -1
      comparator.cpp
  3. +5
    -0
      comparator.h
  4. +1
    -1
      editor.pro.user
  5. +5
    -0
      item.cpp
  6. +3
    -1
      item.h
  7. +53
    -0
      item.h.autosave
  8. +14
    -0
      mygraphicsview.cpp
  9. +1
    -0
      mygraphicsview.h

+ 2
- 2
coil.cpp View File

@@ -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_ == "线圈") {
// 绘制线圈样式: 两边线段+中间椭圆


+ 44
- 1
comparator.cpp View File

@@ -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 &registerId, 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;
}

+ 5
- 0
comparator.h View File

@@ -12,10 +12,15 @@ public:
QWidget *) override;
void setRegisterId(const QString &id) override;
void setRegisterValue(const QString &registerId, 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
- 1
editor.pro.user View File

@@ -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>


+ 5
- 0
item.cpp View File

@@ -58,6 +58,11 @@ QString Item::itemType()
return type_;
}

void Item::setRegisterId(const QString &id)
{
registerId_ = id;
}

void Item::setRegisterValue(const QString &registerId, quint16 value)
{
if (registerId_ == registerId)


+ 3
- 1
item.h View File

@@ -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;


+ 53
- 0
item.h.autosave View File

@@ -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

+ 14
- 0
mygraphicsview.cpp View File

@@ -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) {


+ 1
- 0
mygraphicsview.h View File

@@ -48,6 +48,7 @@ public slots:
void onItemRequestCopy(Item*);
void onItemRequestDelete(Item*);
void onItemRequestBindRegister(Item*);
void onItemRequestCompare(Item*);
};

#endif // MYGRAPHICSVIEW_H

Loading…
Cancel
Save