25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
5.6 KiB

  1. #include "plcitems.h"
  2. PLCItem::PLCItem(ItemType type, QGraphicsItem *parent)
  3. : QGraphicsObject(parent), m_type(type)
  4. {
  5. setFlag(QGraphicsItem::ItemIsMovable, true);
  6. setFlag(QGraphicsItem::ItemIsSelectable, true);
  7. setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
  8. m_boundingRect = QRectF(-50, -30, 100, 60);
  9. }
  10. QRectF PLCItem::boundingRect() const
  11. {
  12. return m_boundingRect; // 返回我们设置的边界矩形
  13. }
  14. void PLCItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  15. {
  16. Q_UNUSED(option);
  17. Q_UNUSED(widget);
  18. painter->setRenderHint(QPainter::Antialiasing);
  19. QPen pen(Qt::black, 1);
  20. painter->setPen(pen);
  21. // 根据状态设置填充颜色
  22. QBrush brush(m_active ? Qt::green : Qt::white);
  23. painter->setBrush(brush);
  24. switch (m_type)
  25. {
  26. case NormallyOpen:
  27. // 绘制常开触点
  28. painter->drawLine(QPointF(-25, 0), QPointF(-10, 0)); // 左横线
  29. painter->drawLine(QPointF(10, 0), QPointF(25, 0)); // 右横线
  30. painter->drawLine(QPointF(-10, -20), QPointF(-10, 20)); // 左竖线
  31. painter->drawLine(QPointF(10, -20), QPointF(10, 20)); // 右竖线
  32. break;
  33. case NormallyClosed:
  34. // 绘制常闭触点
  35. painter->drawLine(QPointF(-25, 0), QPointF(-10, 0)); // 左横线
  36. painter->drawLine(QPointF(10, 0), QPointF(25, 0)); // 右横线
  37. painter->drawLine(QPointF(-10, -20), QPointF(-10, 20)); // 左竖线
  38. painter->drawLine(QPointF(10, -20), QPointF(10, 20)); // 右竖线
  39. painter->drawLine(QPointF(10, -20), QPointF(-10, 20)); // 斜线
  40. break;
  41. case GreaterThan:
  42. painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线
  43. painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线
  44. painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线
  45. painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线
  46. // 绘制大于号
  47. painter->drawLine(QPointF(-8, -8), QPointF(10, 0)); // 上斜线
  48. painter->drawLine(QPointF(-8, 8), QPointF(10, 0)); // 下斜线
  49. break;
  50. case GreaterEqual:
  51. // 绘制大于等于指令
  52. painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线
  53. painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线
  54. painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线
  55. painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线
  56. // 绘制大于号
  57. painter->drawLine(QPointF(-8, -8), QPointF(10, 0)); // 上斜线
  58. painter->drawLine(QPointF(-8, 8), QPointF(10, 0)); // 下斜线
  59. painter->drawLine(QPointF(-8, 13), QPointF(10, 5)); // 等于线
  60. break;
  61. case LessThan:
  62. // 绘制小于指令
  63. painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线
  64. painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线
  65. painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线
  66. painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线
  67. // 绘制小于号
  68. painter->drawLine(QPointF(-10,0), QPointF(8, 8)); // 上斜线
  69. painter->drawLine(QPointF(-10,0), QPointF(8, -8)); // 下斜线
  70. break;
  71. case LessEqual:
  72. // 绘制小于等于指令
  73. painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线
  74. painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线
  75. painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线
  76. painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线
  77. // 绘制小于号
  78. painter->drawLine(QPointF(-10,0), QPointF(8, 8)); // 上斜线
  79. painter->drawLine(QPointF(-10,0), QPointF(8, -8)); // 下斜线
  80. painter->drawLine(QPointF(-10,5), QPointF(8, 13)); // 等于线
  81. break;
  82. case Equal:
  83. // 绘制等于指令
  84. painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左横线
  85. painter->drawLine(QPointF(-15, -20), QPointF(-15, 20)); // 左竖线
  86. painter->drawLine(QPointF(15, -20), QPointF(15, 20)); // 右竖线
  87. painter->drawLine(QPointF(15, 0), QPointF(25, 0)); // 右横线
  88. // 绘制等于号
  89. painter->drawLine(QPointF(-10,0-5), QPointF(10, -5)); // 上横线
  90. painter->drawLine(QPointF(-10,5), QPointF(10, 5)); // 下横线
  91. break;
  92. case Coil:
  93. painter->drawLine(QPointF(-25, 0), QPointF(-15, 0)); // 左侧横线
  94. painter->drawArc(QRectF(-15, -15, 15, 30), 90 * 16, 180 * 16);// 绘制左括号 "("
  95. painter->drawArc(QRectF(0, -15, 15, 30), 270 * 16, 180 * 16);// 绘制右括号 ")"
  96. painter->drawLine(QPointF(15, 0), QPointF(25, 0));// 右侧横线
  97. painter->setPen(QPen(Qt::black, 4));// 调整线条宽度使括号更清晰
  98. break;
  99. }
  100. }
  101. // 位置变化时强制更新,避免拖影
  102. QVariant PLCItem::itemChange(GraphicsItemChange change, const QVariant &value)
  103. {
  104. if (change == ItemPositionHasChanged) {
  105. update(); // 位置变化时刷新绘制
  106. }
  107. return QGraphicsItem::itemChange(change, value);
  108. }
  109. void PLCItem::setState(bool active)
  110. {
  111. if (m_active != active)
  112. {
  113. m_active = active;
  114. update();
  115. emit stateChanged(active);
  116. }
  117. }
  118. void PLCItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
  119. {
  120. Q_UNUSED(event);
  121. setState(!m_active);
  122. }
  123. QPointF PLCItem::leftTerminal() const
  124. {
  125. return mapToScene(QPointF(-30, 0));
  126. }
  127. QPointF PLCItem::rightTerminal() const
  128. {
  129. return mapToScene(QPointF(30, 0));
  130. }