DraggableLine.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #ifndef RULERLINEITEM_H
  2. #define RULERLINEITEM_H
  3. #include <QGraphicsLineItem >
  4. #include <QObject>
  5. #include <QPainter>
  6. class HandleItem : public QObject, public QGraphicsEllipseItem
  7. {
  8. Q_OBJECT
  9. public:
  10. enum { Type = UserType + 2 };
  11. HandleItem(QGraphicsItem* parent = nullptr)
  12. : QGraphicsEllipseItem(-6, -6, 12, 12, parent) {
  13. setFlag(QGraphicsItem::ItemIsSelectable);
  14. setFlag(QGraphicsItem::ItemIsMovable);
  15. setFlag(QGraphicsItem::ItemSendsGeometryChanges);
  16. setBrush(Qt::cyan);
  17. setPen(Qt::NoPen);
  18. }
  19. int type() const override { return Type; }
  20. protected:
  21. QVariant itemChange(GraphicsItemChange change, const QVariant& value) override {
  22. if (change == ItemPositionHasChanged) {
  23. emit positionChanged();
  24. }
  25. return QGraphicsEllipseItem::itemChange(change, value);
  26. }
  27. signals:
  28. void positionChanged();
  29. };
  30. class RulerLineItem : public QObject, public QGraphicsLineItem
  31. {
  32. Q_OBJECT
  33. public:
  34. enum HandleType
  35. {
  36. NoHandle,
  37. StartHandle,
  38. EndHandle
  39. };
  40. enum { Type = UserType + 1 };
  41. explicit RulerLineItem(const QLineF& line, QGraphicsItem* parent = nullptr);
  42. int type() const override;
  43. void setRulerText(const QString& strText);
  44. signals:
  45. //标尺端点更新,发送信号
  46. void updateHandlesSignal(QPointF sPos, QPointF ePos);
  47. private slots:
  48. void updateLineFromHandles();
  49. private:
  50. void initRuler();
  51. void createTextItem();
  52. void createHandles();
  53. void updateHandlePositions();
  54. void updateTextPosition();
  55. // 成员变量
  56. HandleType m_draggingHandle = NoHandle;
  57. QPointF m_dragOffset;
  58. QGraphicsTextItem* m_textItem = nullptr;
  59. HandleItem* m_startHandle = nullptr;
  60. HandleItem* m_endHandle = nullptr;
  61. QString m_strRulerText;
  62. };
  63. #endif // RULERLINEITEM_H