DraggableLine.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "DraggableLine.h"
  2. #include <QGraphicsSceneMouseEvent>
  3. #include <QPainter>
  4. #include <QDebug>
  5. #include <QGraphicsScene>
  6. RulerLineItem::RulerLineItem(const QLineF& line, QGraphicsItem* parent)
  7. : QGraphicsLineItem(line, parent) {
  8. initRuler();
  9. createHandles();
  10. }
  11. int RulerLineItem::type() const
  12. {
  13. return Type;
  14. }
  15. void RulerLineItem::initRuler() {
  16. // 初始化标尺样式
  17. setPen(QPen(Qt::red, 2));
  18. createTextItem();
  19. setFlags(QGraphicsItem::ItemIsSelectable |
  20. QGraphicsItem::ItemSendsGeometryChanges);
  21. }
  22. void RulerLineItem::createTextItem() {
  23. m_textItem = new QGraphicsTextItem(this);
  24. m_textItem->setDefaultTextColor(Qt::black);
  25. m_textItem->setFont(QFont("Arial", 8));
  26. updateTextPosition();
  27. }
  28. void RulerLineItem::createHandles() {
  29. // 创建可拖动端点
  30. m_startHandle = new HandleItem(this);
  31. m_endHandle = new HandleItem(this);
  32. m_startHandle->setPos(line().p1());
  33. m_endHandle->setPos(line().p2());
  34. connect(m_startHandle, &HandleItem::positionChanged, this, &RulerLineItem::updateLineFromHandles);
  35. connect(m_endHandle, &HandleItem::positionChanged, this, &RulerLineItem::updateLineFromHandles);
  36. }
  37. void RulerLineItem::updateHandlePositions() {
  38. QLineF l = line();
  39. m_startHandle->setPos(l.p1());
  40. m_endHandle->setPos(l.p2());
  41. updateHandlesSignal(l.p1(), l.p2());
  42. }
  43. void RulerLineItem::updateTextPosition()
  44. {
  45. m_textItem->setPos(line().center());
  46. }
  47. void RulerLineItem::setRulerText(const QString& strText)
  48. {
  49. m_strRulerText = strText;
  50. m_textItem->setPlainText(strText);
  51. }
  52. void RulerLineItem::updateLineFromHandles()
  53. {
  54. QLineF newLine(m_startHandle->pos(), m_endHandle->pos());
  55. setLine(newLine);
  56. updateTextPosition();
  57. // qreal length = line().length();
  58. // QString strText = QString("%1 px").arg(length, 0, 'f', 1);
  59. // setRulerText(strText);
  60. }