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

148 行
4.2 KiB

  1. #ifndef GRAPHICSITEMS_H
  2. #define GRAPHICSITEMS_H
  3. #include <QGraphicsRectItem>
  4. #include <QGraphicsEllipseItem>
  5. #include <QGraphicsSceneHoverEvent>
  6. #include <QGraphicsSceneMouseEvent>
  7. #include <QPainter>
  8. #include <QString>
  9. #include <QColor>
  10. #include <QCursor>
  11. #include <QGraphicsScene>
  12. // 命名项接口(用于属性设置)
  13. class NamedItem
  14. {
  15. public:
  16. virtual QString name() const = 0;
  17. virtual void setName(const QString &name) = 0;
  18. virtual ~NamedItem() = default;
  19. };
  20. // 可调整大小的图形基类(模板)
  21. template <typename BaseShape>
  22. class ResizableShape : public BaseShape, public NamedItem
  23. {
  24. protected:
  25. bool m_resizing;
  26. QString m_name;
  27. Qt::CursorShape m_currentCursor;
  28. public:
  29. ResizableShape(qreal x, qreal y, qreal w, qreal h)
  30. : BaseShape(x, y, w, h), m_resizing(false), m_currentCursor(Qt::SizeAllCursor)
  31. {
  32. this->setFlag(QGraphicsItem::ItemIsMovable, true);
  33. this->setFlag(QGraphicsItem::ItemIsSelectable, true);
  34. this->setAcceptHoverEvents(true);
  35. }
  36. // 事件处理(调整大小逻辑)
  37. void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override
  38. {
  39. if (isInResizeArea(event->pos()))
  40. {
  41. m_currentCursor = Qt::SizeFDiagCursor;
  42. this->setCursor(Qt::SizeFDiagCursor);
  43. } else {
  44. m_currentCursor = Qt::SizeAllCursor;
  45. }
  46. BaseShape::hoverMoveEvent(event);
  47. }
  48. void mousePressEvent(QGraphicsSceneMouseEvent *event) override
  49. {
  50. if (isInResizeArea(event->pos())) {
  51. m_resizing = true;
  52. m_currentCursor = Qt::SizeFDiagCursor;
  53. this->setCursor(Qt::SizeFDiagCursor);
  54. } else {
  55. m_resizing = false;
  56. m_currentCursor = Qt::SizeAllCursor;
  57. BaseShape::mousePressEvent(event);
  58. }
  59. }
  60. void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
  61. {
  62. if (m_resizing) {
  63. QRectF newRect = this->rect();
  64. newRect.setBottomRight(event->pos());
  65. this->setRect(newRect);
  66. } else {
  67. BaseShape::mouseMoveEvent(event);
  68. }
  69. }
  70. void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
  71. {
  72. m_resizing = false;
  73. m_currentCursor = Qt::SizeAllCursor;
  74. this->setCursor(Qt::SizeFDiagCursor);
  75. BaseShape::mouseReleaseEvent(event);
  76. }
  77. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
  78. {
  79. BaseShape::paint(painter, option, widget);
  80. }
  81. // 命名项接口实现
  82. QString name() const override { return m_name; }
  83. void setName(const QString &name) override { m_name = name; }
  84. // 光标获取方法
  85. Qt::CursorShape currentCursor() const { return m_currentCursor; }
  86. protected:
  87. bool isInResizeArea(const QPointF &pos) const
  88. {
  89. QRectF r = this->rect();
  90. QRectF resizeArea(r.bottomRight() - QPointF(50, 50), r.bottomRight());
  91. return resizeArea.contains(pos);
  92. }
  93. };
  94. // 可调整大小的矩形(按钮)
  95. class ResizableRectangle : public ResizableShape<QGraphicsRectItem>
  96. {
  97. public:
  98. ResizableRectangle(qreal x, qreal y, qreal w, qreal h);
  99. QColor pressedColor() const { return m_pressedColor; }
  100. void setPressedColor(const QColor &color) { m_pressedColor = color; }
  101. QColor releasedColor() const { return m_releasedColor; }
  102. void setReleasedColor(const QColor &color) {
  103. m_releasedColor = color;
  104. this->setBrush(m_releasedColor); // 更新显示
  105. }
  106. private:
  107. QColor m_pressedColor; // 按下颜色
  108. QColor m_releasedColor; // 释放颜色
  109. };
  110. // 可调整大小的椭圆(指示灯)
  111. class ResizableEllipse : public ResizableShape<QGraphicsEllipseItem>
  112. {
  113. public:
  114. ResizableEllipse(qreal x, qreal y, qreal w, qreal h);
  115. QColor onColor() const { return m_onColor; }
  116. void setOnColor(const QColor &color) {
  117. m_onColor = color;
  118. this->setBrush(m_onColor); // 更新显示
  119. }
  120. QColor offColor() const { return m_offColor; }
  121. void setOffColor(const QColor &color) { m_offColor = color; }
  122. private:
  123. QColor m_onColor; // 开状态颜色
  124. QColor m_offColor; // 关状态颜色
  125. };
  126. #endif // GRAPHICSITEMS_H