JoystickPage.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // *****************************************************************************
  2. // 版权所有(C)2023~2099 上海骄成超声波技术有限公司
  3. // 保留所有权利
  4. // *****************************************************************************
  5. // 作者 : 杨坚
  6. // 版本 : 1.0
  7. // 功能说明:
  8. // 摇杆页面
  9. // *****************************************************************************
  10. #include "JoystickPage.h"
  11. JoystickPage::JoystickPage(QWidget* parent /*= nullptr*/)
  12. : QWidget(parent), m_radius(50), m_handlePos(0, 0), m_isPressed(false)
  13. {
  14. setFixedSize(m_radius * 2 + 20, m_radius * 2 + 20);
  15. }
  16. void JoystickPage::paintEvent(QPaintEvent*)
  17. {
  18. QPainter painter(this);
  19. painter.setRenderHint(QPainter::Antialiasing);
  20. // 绘制摇杆底座
  21. painter.setPen(Qt::NoPen);
  22. painter.setBrush(Qt::gray);
  23. painter.drawEllipse(rect().center(), m_radius, m_radius);
  24. // 绘制摇杆手柄
  25. painter.setBrush(m_isPressed ? Qt::red : Qt::blue);
  26. QPoint handleCenter = rect().center() + m_handlePos;
  27. painter.drawEllipse(handleCenter, m_radius / 3, m_radius / 3);
  28. if (QLineF(QPointF(0, 0), m_handlePos).length() > m_radius * 0.8)
  29. {
  30. painter.setBrush(Qt::red);
  31. }
  32. else
  33. {
  34. painter.setBrush(m_isPressed ? Qt::darkBlue : Qt::blue);
  35. }
  36. ////绘制摇杆中的大圆
  37. //QPixmap bigCircle_Pixmap;
  38. //bigCircle_Pixmap.load(":/new/prefix1/image/max.png");
  39. //painter.drawPixmap(SmallCir_xy.x() - BIG_CIRCLE_RADIUS, SmallCir_xy.y() - BIG_CIRCLE_RADIUS, \
  40. // BIG_CIRCLE_RADIUS * 2, BIG_CIRCLE_RADIUS * 2, bigCircle_Pixmap);
  41. ////绘制摇杆中的小圆
  42. //QPixmap smallCircle_Pixmap;
  43. //smallCircle_Pixmap.load(":/new/prefix1/image/min.png");
  44. //painter.drawPixmap(BigCir_xy.x() - SMALL_CIRCLE_RADIUS, BigCir_xy.y() - SMALL_CIRCLE_RADIUS, \
  45. // SMALL_CIRCLE_RADIUS * 2, SMALL_CIRCLE_RADIUS * 2, smallCircle_Pixmap);
  46. }
  47. void JoystickPage::mousePressEvent(QMouseEvent* event)
  48. {
  49. if (QLineF(rect().center(), event->pos()).length() <= m_radius)
  50. {
  51. m_isPressed = true;
  52. updateHandlePosition(event->pos());
  53. update();
  54. }
  55. }
  56. void JoystickPage::mouseMoveEvent(QMouseEvent* event)
  57. {
  58. if (m_isPressed)
  59. {
  60. updateHandlePosition(event->pos());
  61. update();
  62. }
  63. }
  64. void JoystickPage::mouseReleaseEvent(QMouseEvent*)
  65. {
  66. m_isPressed = false;
  67. m_handlePos = QPoint(0, 0);
  68. emit PositionChangedSignals(0, 0);
  69. update();
  70. }
  71. void JoystickPage::updateHandlePosition(const QPoint& pos)
  72. {
  73. QPoint center = rect().center();
  74. QPointF delta = pos - center;
  75. qreal distance = QLineF(center, pos).length();
  76. if (distance > m_radius)
  77. {
  78. delta = delta * m_radius / distance;
  79. }
  80. m_handlePos = delta.toPoint();
  81. if (distance < m_deadZone)
  82. {
  83. m_handlePos = QPoint(0, 0);
  84. emit PositionChangedSignals(0, 0);
  85. }
  86. else
  87. {
  88. // 归一化到[-1, 1]范围
  89. qreal x = delta.x() / m_radius;
  90. qreal y = -delta.y() / m_radius; // Y轴反转,使向上为正
  91. emit PositionChangedSignals(x, y);
  92. //qDebug() << x << ":" << y;
  93. }
  94. }