選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

56 行
1.8 KiB

  1. #include "coil.h"
  2. #include <QPainter>
  3. #include <QStyleOptionGraphicsItem>
  4. Coil::Coil(const QString &type) : Item(type)
  5. {
  6. }
  7. void Coil::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *)
  8. {
  9. painter->setRenderHint(QPainter::Antialiasing);
  10. if (registerValue_ > 0) {
  11. painter->setBrush(Qt::green); // 激活状态
  12. } else {
  13. painter->setBrush(Qt::black); // 未激活状态
  14. }
  15. if (type_ == "线圈") {
  16. // 绘制线圈样式: 两边线段+中间椭圆
  17. painter->drawLine(-12, 0, -5, 0);
  18. painter->drawEllipse(QRectF(-5, -8, 10, 16));
  19. painter->drawLine(5, 0, 12, 0);
  20. // 画锚点
  21. painter->setBrush(Qt::darkGray);
  22. painter->setPen(Qt::NoPen);
  23. painter->drawEllipse(QPointF(-12, 0), 4, 4); // 左锚点
  24. painter->drawEllipse(QPointF(12, 0), 4, 4); // 右锚点
  25. }
  26. if (!registerId_.isEmpty()) {
  27. painter->save();
  28. painter->setFont(QFont("Arial", 8));
  29. painter->setPen(Qt::black);
  30. // 在元件底部居中绘制寄存器ID
  31. // painter->drawText(boundingRect().adjusted(0, 20, 0, 0),
  32. // Qt::AlignCenter, registerId_);
  33. QString text = QString("%1: %2").arg(registerId()).arg(registerValue_);
  34. painter->drawText(boundingRect(), Qt::AlignBottom | Qt::AlignHCenter, text);
  35. painter->restore();
  36. }
  37. if (option->state & QStyle::State_Selected) {
  38. QPen pen(Qt::DashLine);
  39. pen.setColor(Qt::blue);
  40. pen.setWidth(2);
  41. painter->setPen(pen);
  42. painter->setBrush(Qt::NoBrush);
  43. painter->drawRect(boundingRect());
  44. }
  45. }
  46. bool Coil::state() const
  47. {
  48. return registerValue_ > 0;
  49. }