You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.8 KiB

  1. #include "item.h"
  2. #include "connection.h"
  3. #include <QMenu>
  4. #include <QPainter>
  5. #include <QStyleOptionGraphicsItem>
  6. #include <QGraphicsSceneContextMenuEvent>
  7. Item::Item(const QString &type, QGraphicsItem *parent)
  8. : QGraphicsObject(parent), type_(type)
  9. {
  10. setFlags(QGraphicsItem::ItemIsMovable |
  11. QGraphicsItem::ItemIsSelectable |
  12. QGraphicsItem::ItemSendsGeometryChanges);
  13. }
  14. QRectF Item::boundingRect() const
  15. {
  16. return QRectF(-22, -15, 44, 30);
  17. }
  18. //void Item::paint(QPainter *painter,
  19. // const QStyleOptionGraphicsItem * option,
  20. // QWidget *)
  21. //{
  22. // painter->setRenderHint(QPainter::Antialiasing);
  23. // if (type_ == "线圈") {
  24. // // 绘制线圈样式: 两边线段+中间椭圆
  25. // painter->drawLine(-12, 0, -5, 0);
  26. // painter->drawEllipse(QRectF(-5, -8, 10, 16));
  27. // painter->drawLine(5, 0, 12, 0);
  28. // // 画锚点
  29. // painter->setBrush(Qt::darkGray);
  30. // painter->setPen(Qt::NoPen);
  31. // painter->drawEllipse(QPointF(-12, 0), 4, 4); // 左锚点
  32. // painter->drawEllipse(QPointF(12, 0), 4, 4); // 右锚点
  33. // }
  34. // else if (type_ == "常开") {
  35. // painter->drawLine(-12, 0, -4, 0);
  36. // painter->drawLine(-4, -8, -4, 8);
  37. // painter->drawLine(4, -8, 4, 8);
  38. // painter->drawLine(4, 0, 12, 0);
  39. // // 锚点
  40. // painter->setBrush(Qt::darkGray);
  41. // painter->setPen(Qt::NoPen);
  42. // painter->drawEllipse(QPointF(-18, 0), 4, 4); // 左
  43. // painter->drawEllipse(QPointF(18, 0), 4, 4); // 右
  44. // }
  45. // else if (type_ == "常闭") {
  46. // painter->drawLine(-15, -10, 15, 10); // 对角线
  47. // painter->drawLine(-12, 0, -4, 0);
  48. // painter->drawLine(-4, -8, -4, 8);
  49. // painter->drawLine(4, -8, 4, 8);
  50. // painter->drawLine(4, 0, 12, 0);
  51. // // 锚点
  52. // painter->setBrush(Qt::darkGray);
  53. // painter->setPen(Qt::NoPen);
  54. // painter->drawEllipse(QPointF(-18, 0), 4, 4); // 左
  55. // painter->drawEllipse(QPointF(18, 0), 4, 4); // 右
  56. // }
  57. // else if (type_ == "比较") {
  58. // painter->drawRect(QRectF(-12, -8, 24, 16));
  59. // painter->setFont(QFont("Arial", 8));
  60. // painter->drawText(QRectF(-10, -8, 20, 16), Qt::AlignCenter, "CP");
  61. // // 锚点
  62. // painter->setBrush(Qt::darkGray);
  63. // painter->setPen(Qt::NoPen);
  64. // painter->drawEllipse(QPointF(-18, 0), 4, 4);
  65. // painter->drawEllipse(QPointF(18, 0), 4, 4);
  66. // }
  67. // if (option->state & QStyle::State_Selected) {
  68. // QPen pen(Qt::DashLine);
  69. // pen.setColor(Qt::blue);
  70. // pen.setWidth(2);
  71. // painter->setPen(pen);
  72. // painter->setBrush(Qt::NoBrush);
  73. // painter->drawRect(boundingRect());
  74. // }
  75. //}
  76. QPointF Item::anchorPos(AnchorType type) const
  77. {
  78. return mapToScene(type == Left ? QPointF(-18, 0) : QPointF(18, 0));
  79. }
  80. void Item::addConnection(Connection* conn)
  81. {
  82. if (!connections_.contains(conn))
  83. connections_.append(conn);
  84. }
  85. void Item::removeConnection(Connection* conn)
  86. {
  87. connections_.removeAll(conn);
  88. }
  89. QList<Connection *> Item::connections()
  90. {
  91. return connections_;
  92. }
  93. QString Item::itemType()
  94. {
  95. return type_;
  96. }
  97. QVariant Item::itemChange(GraphicsItemChange change, const QVariant &value)
  98. {
  99. if (change == QGraphicsItem::ItemPositionChange) {
  100. for (Connection* conn : connections_)
  101. conn->updatePosition();
  102. }
  103. return QGraphicsObject::itemChange(change, value);
  104. }
  105. void Item::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
  106. {
  107. QMenu menu;
  108. QAction* copyAct = menu.addAction("复制");
  109. QAction* deleteAct = menu.addAction("删除");
  110. QAction* selected = menu.exec(event->screenPos());
  111. if (selected == copyAct) {
  112. emit requestCopy(this);
  113. }
  114. if (selected == deleteAct) {
  115. emit requestDelete(this);
  116. }
  117. }