您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

73 行
2.0 KiB

  1. #include "plceditor.h"
  2. #include <QPainter>
  3. #include <QPen>
  4. #include <QBrush>
  5. PLCElement::PLCElement(Type type, QGraphicsItem *parent)
  6. : QGraphicsRectItem(parent), type(type)
  7. {
  8. setRect(0, 0, 60, 30);
  9. setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
  10. }
  11. void PLCElement::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
  12. Q_UNUSED(option);
  13. Q_UNUSED(widget);
  14. // 绘制基本形状
  15. painter->setPen(QPen(Qt::black, 2));
  16. painter->setBrush(QBrush(Qt::white));
  17. painter->drawRect(rect());
  18. // 绘制触点类型
  19. painter->setPen(QPen(Qt::red, 2));
  20. if (type == NormallyOpen) {
  21. // 常开触点
  22. painter->drawLine(10, 15, 25, 15);
  23. painter->drawLine(35, 15, 50, 15);
  24. painter->drawLine(25, 10, 35, 20);
  25. } else {
  26. // 常闭触点
  27. painter->drawLine(10, 15, 25, 15);
  28. painter->drawLine(35, 15, 50, 15);
  29. painter->drawLine(25, 20, 35, 10);
  30. painter->drawLine(25, 10, 35, 20);
  31. }
  32. }
  33. PLCEditor::PLCEditor(QWidget *parent)
  34. : QWidget(parent), elementCount(0)
  35. {
  36. // 创建布局
  37. QVBoxLayout* layout = new QVBoxLayout(this);
  38. // 创建图形场景和视图
  39. scene = new QGraphicsScene(this);
  40. scene->setSceneRect(0, 0, 800, 600);
  41. scene->setBackgroundBrush(Qt::lightGray);
  42. view = new QGraphicsView(scene, this);
  43. view->setRenderHint(QPainter::Antialiasing);
  44. layout->addWidget(view);
  45. }
  46. void PLCEditor::onNormallyOpen() {
  47. // 创建新的常开触点
  48. PLCElement* element = new PLCElement(PLCElement::NormallyOpen);
  49. scene->addItem(element);
  50. // 放置在不同位置
  51. element->setPos(50 + (elementCount % 10) * 80, 50 + (elementCount / 10) * 50);
  52. elementCount++;
  53. }
  54. void PLCEditor::onNormallyClosed() {
  55. // 创建新的常闭触点
  56. PLCElement* element = new PLCElement(PLCElement::NormallyClosed);
  57. scene->addItem(element);
  58. // 放置在不同位置
  59. element->setPos(50 + (elementCount % 10) * 80, 50 + (elementCount / 10) * 50);
  60. elementCount++;
  61. }