Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

144 righe
4.0 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. m_currentCursor = Qt::SizeFDiagCursor;
  41. } else {
  42. m_currentCursor = Qt::SizeAllCursor;
  43. }
  44. BaseShape::hoverMoveEvent(event);
  45. }
  46. void mousePressEvent(QGraphicsSceneMouseEvent *event) override
  47. {
  48. if (isInResizeArea(event->pos())) {
  49. m_resizing = true;
  50. m_currentCursor = Qt::SizeFDiagCursor;
  51. } else {
  52. m_resizing = false;
  53. m_currentCursor = Qt::SizeAllCursor;
  54. BaseShape::mousePressEvent(event);
  55. }
  56. }
  57. void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
  58. {
  59. if (m_resizing) {
  60. QRectF newRect = this->rect();
  61. newRect.setBottomRight(event->pos());
  62. this->setRect(newRect);
  63. } else {
  64. BaseShape::mouseMoveEvent(event);
  65. }
  66. }
  67. void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
  68. {
  69. m_resizing = false;
  70. m_currentCursor = Qt::SizeAllCursor;
  71. BaseShape::mouseReleaseEvent(event);
  72. }
  73. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
  74. {
  75. BaseShape::paint(painter, option, widget);
  76. }
  77. // 命名项接口实现
  78. QString name() const override { return m_name; }
  79. void setName(const QString &name) override { m_name = name; }
  80. // 光标获取方法
  81. Qt::CursorShape currentCursor() const { return m_currentCursor; }
  82. protected:
  83. bool isInResizeArea(const QPointF &pos) const
  84. {
  85. QRectF r = this->rect();
  86. QRectF resizeArea(r.bottomRight() - QPointF(20, 20), r.bottomRight());
  87. return resizeArea.contains(pos);
  88. }
  89. };
  90. // 可调整大小的矩形(按钮)
  91. class ResizableRectangle : public ResizableShape<QGraphicsRectItem>
  92. {
  93. public:
  94. ResizableRectangle(qreal x, qreal y, qreal w, qreal h);
  95. QColor pressedColor() const { return m_pressedColor; }
  96. void setPressedColor(const QColor &color) { m_pressedColor = color; }
  97. QColor releasedColor() const { return m_releasedColor; }
  98. void setReleasedColor(const QColor &color) {
  99. m_releasedColor = color;
  100. this->setBrush(m_releasedColor); // 更新显示
  101. }
  102. private:
  103. QColor m_pressedColor; // 按下颜色
  104. QColor m_releasedColor; // 释放颜色
  105. };
  106. // 可调整大小的椭圆(指示灯)
  107. class ResizableEllipse : public ResizableShape<QGraphicsEllipseItem>
  108. {
  109. public:
  110. ResizableEllipse(qreal x, qreal y, qreal w, qreal h);
  111. QColor onColor() const { return m_onColor; }
  112. void setOnColor(const QColor &color) {
  113. m_onColor = color;
  114. this->setBrush(m_onColor); // 更新显示
  115. }
  116. QColor offColor() const { return m_offColor; }
  117. void setOffColor(const QColor &color) { m_offColor = color; }
  118. private:
  119. QColor m_onColor; // 开状态颜色
  120. QColor m_offColor; // 关状态颜色
  121. };
  122. #endif // GRAPHICSITEMS_H