#include "plcitems.h" PLCItem::PLCItem(ItemType type, QGraphicsItem *parent) : QGraphicsObject(parent), m_type(type) { setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); m_boundingRect = QRectF(-50, -30, 100, 60); } QRectF PLCItem::boundingRect() const { return m_boundingRect; // 返回我们设置的边界矩形 } void PLCItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->setRenderHint(QPainter::Antialiasing); QPen pen(Qt::black, 1); painter->setPen(pen); // 根据状态设置填充颜色 QBrush brush(m_active ? Qt::green : Qt::white); painter->setBrush(brush); switch (m_type) { case NormallyOpen: // 绘制常开触点 painter->drawLine(QPointF(-25, 0), QPointF(-10, 0)); // 左横线 painter->drawLine(QPointF(10, 0), QPointF(25, 0)); // 右横线 painter->drawLine(QPointF(-10, -20), QPointF(-10, 20)); // 左竖线 painter->drawLine(QPointF(10, -20), QPointF(10, 20)); // 右竖线 break; case NormallyClosed: // 绘制常闭触点 painter->drawLine(QPointF(-25, 0), QPointF(-10, 0)); // 左横线 painter->drawLine(QPointF(10, 0), QPointF(25, 0)); // 右横线 painter->drawLine(QPointF(-10, -20), QPointF(-10, 20)); // 左竖线 painter->drawLine(QPointF(10, -20), QPointF(10, 20)); // 右竖线 painter->drawLine(QPointF(10, -20), QPointF(-10, 20)); // 斜线 break; case GreaterThan: painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线 painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线 painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线 painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线 // 绘制大于号 painter->drawLine(QPointF(-8, -8), QPointF(10, 0)); // 上斜线 painter->drawLine(QPointF(-8, 8), QPointF(10, 0)); // 下斜线 break; case GreaterEqual: // 绘制大于等于指令 painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线 painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线 painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线 painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线 // 绘制大于号 painter->drawLine(QPointF(-8, -8), QPointF(10, 0)); // 上斜线 painter->drawLine(QPointF(-8, 8), QPointF(10, 0)); // 下斜线 painter->drawLine(QPointF(-8, 13), QPointF(10, 5)); // 等于线 break; case LessThan: // 绘制小于指令 painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线 painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线 painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线 painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线 // 绘制小于号 painter->drawLine(QPointF(-10,0), QPointF(8, 8)); // 上斜线 painter->drawLine(QPointF(-10,0), QPointF(8, -8)); // 下斜线 break; case LessEqual: // 绘制小于等于指令 painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线 painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线 painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线 painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线 // 绘制小于号 painter->drawLine(QPointF(-10,0), QPointF(8, 8)); // 上斜线 painter->drawLine(QPointF(-10,0), QPointF(8, -8)); // 下斜线 painter->drawLine(QPointF(-10,5), QPointF(8, 13)); // 等于线 break; case Equal: // 绘制等于指令 painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线 painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线 painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线 painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线 // 绘制等于号 painter->drawLine(QPointF(-10,0-5), QPointF(10, -5)); // 上横线 painter->drawLine(QPointF(-10,5), QPointF(10, 5)); // 下横线 break; case Coil: painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左侧横线 painter->drawArc(QRectF(-15, -15, 15, 30), 90 * 16, 180 * 16);// 绘制左括号 "(" painter->drawArc(QRectF(0, -15, 15, 30), 270 * 16, 180 * 16);// 绘制右括号 ")" painter->drawLine(QPointF(15, 0), QPointF(25, 0));// 右侧横线 painter->setPen(QPen(Qt::black, 4));// 调整线条宽度使括号更清晰 break; } } // 位置变化时强制更新,避免拖影 QVariant PLCItem::itemChange(GraphicsItemChange change, const QVariant &value) { if (change == ItemPositionHasChanged) { update(); // 位置变化时刷新绘制 } return QGraphicsItem::itemChange(change, value); } void PLCItem::setState(bool active) { if (m_active != active) { m_active = active; update(); emit stateChanged(active); } } void PLCItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event); setState(!m_active); } QPointF PLCItem::leftTerminal() const { return mapToScene(QPointF(-30, 0)); } QPointF PLCItem::rightTerminal() const { return mapToScene(QPointF(30, 0)); }