|
- #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));
- }
|