Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

151 rader
3.8 KiB

  1. #include "comparator.h"
  2. #include <QMenu>
  3. #include <QPainter>
  4. #include <QStyleOptionGraphicsItem>
  5. Comparator::Comparator(const QString &type) : Item(type)
  6. {
  7. }
  8. QRectF Comparator::boundingRect() const
  9. {
  10. return QRectF(-22, -20, 44, 40);
  11. }
  12. void Comparator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *)
  13. {
  14. painter->setRenderHint(QPainter::Antialiasing);
  15. if (state()) {
  16. painter->setBrush(Qt::green); // 激活状态
  17. } else {
  18. painter->setBrush(Qt::white); // 未激活状态
  19. }
  20. if (type_ == "比较") {
  21. painter->drawRect(QRectF(-12, -8, 24, 16));
  22. painter->setFont(QFont("Arial", 8));
  23. painter->drawText(QRectF(-10, -8, 20, 16), Qt::AlignCenter, compare_);
  24. // 锚点
  25. painter->setBrush(Qt::darkGray);
  26. painter->setPen(Qt::NoPen);
  27. painter->drawEllipse(QPointF(-18, 0), 4, 4);
  28. painter->drawEllipse(QPointF(18, 0), 4, 4);
  29. }
  30. painter->save();
  31. painter->setFont(QFont("Arial", 8));
  32. painter->setPen(Qt::black);
  33. if (!registerId_.isEmpty()) {
  34. QString text = QString("%1: %2").arg(registerId_).arg(registerValue_);
  35. painter->drawText(QRectF(-20, -25, 40, 20), Qt::AlignCenter, text);
  36. }
  37. // 在右上角显示第二个寄存器
  38. if (!registerId2_.isEmpty()) {
  39. QString text = QString("%1: %2").arg(registerId2_).arg(registerValue2_);
  40. painter->drawText(QRectF(-20, 5, 40, 20), Qt::AlignCenter, text);
  41. }
  42. painter->restore();
  43. if (option->state & QStyle::State_Selected) {
  44. QPen pen(Qt::DashLine);
  45. pen.setColor(Qt::blue);
  46. pen.setWidth(2);
  47. painter->setPen(pen);
  48. painter->setBrush(Qt::NoBrush);
  49. painter->drawRect(boundingRect());
  50. }
  51. }
  52. bool Comparator::setRegisterId(const QString &id)
  53. {
  54. if (registerId_.isEmpty())
  55. {
  56. registerId_ = id;
  57. return true;
  58. }
  59. else if(registerId2_.isEmpty())
  60. {
  61. registerId2_ = id;
  62. return true;
  63. }
  64. return false;
  65. }
  66. void Comparator::setRegisterValue(const QString &registerId, quint16 value)
  67. {
  68. if (registerId_ == registerId)
  69. {
  70. registerValue_ = value;
  71. update(); // 触发重绘
  72. }
  73. if (registerId2_ == registerId)
  74. {
  75. registerValue2_ = value;
  76. update(); // 触发重绘
  77. }
  78. }
  79. void Comparator::addMenuActions(QMenu *menu)
  80. {
  81. menu->addAction("比较");
  82. }
  83. void Comparator::handleMenuAction(QAction *action)
  84. {
  85. if (action->text() == "复制") {
  86. emit requestCopy(this);
  87. }
  88. if (action->text() == "删除") {
  89. emit requestDelete(this);
  90. }
  91. if (action->text() == "对象"){
  92. emit requestBindRegister(this);
  93. }
  94. if (action->text() == "比较"){
  95. emit requestCompare(this);
  96. }
  97. if (action->text() == "重置") {
  98. emit requestReset(this);
  99. }
  100. }
  101. void Comparator::setCompare(QString compare)
  102. {
  103. compare_ = compare;
  104. update();
  105. }
  106. bool Comparator::state() const
  107. {
  108. if (compare_ == ">") return registerValue_ > registerValue2_;
  109. if (compare_ == "<") return registerValue_ < registerValue2_;
  110. if (compare_ == "=") return registerValue_ == registerValue2_;
  111. if (compare_ == ">=") return registerValue_ >= registerValue2_;
  112. if (compare_ == "<") return registerValue_ <= registerValue2_;
  113. return false;
  114. }
  115. QStringList Comparator::resetRegister()
  116. {
  117. QStringList unboundRegs;
  118. // 重置第一个寄存器
  119. if (!registerId_.isEmpty()) {
  120. unboundRegs << registerId_;
  121. registerId_.clear();
  122. }
  123. // 重置第二个寄存器
  124. if (!registerId2_.isEmpty()) {
  125. unboundRegs << registerId2_;
  126. registerId2_.clear();
  127. }
  128. // 清除寄存器值
  129. registerValue_ = 0;
  130. registerValue2_ = 0;
  131. update(); // 刷新显示
  132. return unboundRegs;
  133. }