#ifndef RULERLINEITEM_H #define RULERLINEITEM_H #include #include #include class HandleItem : public QObject, public QGraphicsEllipseItem { Q_OBJECT public: enum { Type = UserType + 2 }; HandleItem(QGraphicsItem* parent = nullptr) : QGraphicsEllipseItem(-6, -6, 12, 12, parent) { setFlag(QGraphicsItem::ItemIsSelectable); setFlag(QGraphicsItem::ItemIsMovable); setFlag(QGraphicsItem::ItemSendsGeometryChanges); setBrush(Qt::cyan); setPen(Qt::NoPen); } int type() const override { return Type; } protected: QVariant itemChange(GraphicsItemChange change, const QVariant& value) override { if (change == ItemPositionHasChanged) { emit positionChanged(); } return QGraphicsEllipseItem::itemChange(change, value); } signals: void positionChanged(); }; class RulerLineItem : public QObject, public QGraphicsLineItem { Q_OBJECT public: enum HandleType { NoHandle, StartHandle, EndHandle }; enum { Type = UserType + 1 }; explicit RulerLineItem(const QLineF& line, QGraphicsItem* parent = nullptr); int type() const override; void setRulerText(const QString& strText); signals: //标尺端点更新,发送信号 void updateHandlesSignal(QPointF sPos, QPointF ePos); private slots: void updateLineFromHandles(); private: void initRuler(); void createTextItem(); void createHandles(); void updateHandlePositions(); void updateTextPosition(); // 成员变量 HandleType m_draggingHandle = NoHandle; QPointF m_dragOffset; QGraphicsTextItem* m_textItem = nullptr; HandleItem* m_startHandle = nullptr; HandleItem* m_endHandle = nullptr; QString m_strRulerText; }; #endif // RULERLINEITEM_H