|
- #include "item.h"
- #include "connection.h"
- #include <QMenu>
- #include <QPainter>
- #include <QStyleOptionGraphicsItem>
- #include <QGraphicsSceneContextMenuEvent>
-
- Item::Item(const QString &type, QGraphicsItem *parent)
- : QGraphicsObject(parent), type_(type)
- {
- setFlags(QGraphicsItem::ItemIsMovable |
- QGraphicsItem::ItemIsSelectable |
- QGraphicsItem::ItemSendsGeometryChanges);
- }
-
- QRectF Item::boundingRect() const
- {
- return QRectF(-22, -15, 44, 30);
- }
-
- void Item::paint(QPainter *painter,
- const QStyleOptionGraphicsItem * option,
- QWidget *)
- {
- painter->setRenderHint(QPainter::Antialiasing);
-
- if (type_ == "线圈") {
- // 绘制线圈样式: 两边线段+中间椭圆
- painter->drawLine(-12, 0, -5, 0);
- painter->drawEllipse(QRectF(-5, -8, 10, 16));
- painter->drawLine(5, 0, 12, 0);
-
- // 画锚点
- painter->setBrush(Qt::darkGray);
- painter->setPen(Qt::NoPen);
- painter->drawEllipse(QPointF(-12, 0), 4, 4); // 左锚点
- painter->drawEllipse(QPointF(12, 0), 4, 4); // 右锚点
- }
- else if (type_ == "常开") {
- painter->drawLine(-12, 0, -4, 0);
- painter->drawLine(-4, -8, -4, 8);
- painter->drawLine(4, -8, 4, 8);
- painter->drawLine(4, 0, 12, 0);
-
- // 锚点
- painter->setBrush(Qt::darkGray);
- painter->setPen(Qt::NoPen);
- painter->drawEllipse(QPointF(-18, 0), 4, 4); // 左
- painter->drawEllipse(QPointF(18, 0), 4, 4); // 右
- }
- else if (type_ == "常闭") {
- painter->drawLine(-15, -10, 15, 10); // 对角线
- painter->drawLine(-12, 0, -4, 0);
- painter->drawLine(-4, -8, -4, 8);
- painter->drawLine(4, -8, 4, 8);
- painter->drawLine(4, 0, 12, 0);
-
- // 锚点
- painter->setBrush(Qt::darkGray);
- painter->setPen(Qt::NoPen);
- painter->drawEllipse(QPointF(-18, 0), 4, 4); // 左
- painter->drawEllipse(QPointF(18, 0), 4, 4); // 右
- }
- else 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->setBrush(Qt::darkGray);
- painter->setPen(Qt::NoPen);
- painter->drawEllipse(QPointF(-18, 0), 4, 4);
- painter->drawEllipse(QPointF(18, 0), 4, 4);
- }
- if (option->state & QStyle::State_Selected) {
- QPen pen(Qt::DashLine);
- pen.setColor(Qt::blue);
- pen.setWidth(2);
- painter->setPen(pen);
- painter->setBrush(Qt::NoBrush);
- painter->drawRect(boundingRect());
- }
- }
-
- QPointF Item::anchorPos(AnchorType type) const
- {
- return mapToScene(type == Left ? QPointF(-18, 0) : QPointF(18, 0));
- }
-
- void Item::addConnection(Connection* conn)
- {
- if (!connections_.contains(conn))
- connections_.append(conn);
- }
-
- void Item::removeConnection(Connection* conn)
- {
- connections_.removeAll(conn);
- }
-
- QList<Connection *> Item::connections()
- {
- return connections_;
- }
-
- QString Item::itemType()
- {
- return type_;
- }
-
- QVariant Item::itemChange(GraphicsItemChange change, const QVariant &value)
- {
- if (change == QGraphicsItem::ItemPositionChange) {
- for (Connection* conn : connections_)
- conn->updatePosition();
- }
- return QGraphicsObject::itemChange(change, value);
- }
-
- void Item::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
- {
- QMenu menu;
- QAction* copyAct = menu.addAction("复制");
- QAction* deleteAct = menu.addAction("删除");
- QAction* selected = menu.exec(event->screenPos());
- if (selected == copyAct) {
- emit requestCopy(this);
- }
- if (selected == deleteAct) {
- emit requestDelete(this);
- }
- }
|