123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // *****************************************************************************
- // 版权所有(C)2023~2099 上海骄成超声波技术有限公司
- // 保留所有权利
- // *****************************************************************************
- // 作者 : 杨坚
- // 版本 : 1.0
- // 功能说明:
- // 摇杆页面
- // *****************************************************************************
- #include "JoystickPage.h"
- JoystickPage::JoystickPage(QWidget* parent /*= nullptr*/)
- : QWidget(parent), m_radius(50), m_handlePos(0, 0), m_isPressed(false)
- {
- setFixedSize(m_radius * 2 + 20, m_radius * 2 + 20);
- }
- void JoystickPage::paintEvent(QPaintEvent*)
- {
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
- // 绘制摇杆底座
- painter.setPen(Qt::NoPen);
- painter.setBrush(Qt::gray);
- painter.drawEllipse(rect().center(), m_radius, m_radius);
- // 绘制摇杆手柄
- painter.setBrush(m_isPressed ? Qt::red : Qt::blue);
- QPoint handleCenter = rect().center() + m_handlePos;
- painter.drawEllipse(handleCenter, m_radius / 3, m_radius / 3);
- if (QLineF(QPointF(0, 0), m_handlePos).length() > m_radius * 0.8)
- {
- painter.setBrush(Qt::red);
- }
- else
- {
- painter.setBrush(m_isPressed ? Qt::darkBlue : Qt::blue);
- }
- ////绘制摇杆中的大圆
- //QPixmap bigCircle_Pixmap;
- //bigCircle_Pixmap.load(":/new/prefix1/image/max.png");
- //painter.drawPixmap(SmallCir_xy.x() - BIG_CIRCLE_RADIUS, SmallCir_xy.y() - BIG_CIRCLE_RADIUS, \
- // BIG_CIRCLE_RADIUS * 2, BIG_CIRCLE_RADIUS * 2, bigCircle_Pixmap);
- ////绘制摇杆中的小圆
- //QPixmap smallCircle_Pixmap;
- //smallCircle_Pixmap.load(":/new/prefix1/image/min.png");
- //painter.drawPixmap(BigCir_xy.x() - SMALL_CIRCLE_RADIUS, BigCir_xy.y() - SMALL_CIRCLE_RADIUS, \
- // SMALL_CIRCLE_RADIUS * 2, SMALL_CIRCLE_RADIUS * 2, smallCircle_Pixmap);
- }
- void JoystickPage::mousePressEvent(QMouseEvent* event)
- {
- if (QLineF(rect().center(), event->pos()).length() <= m_radius)
- {
- m_isPressed = true;
- updateHandlePosition(event->pos());
- update();
- }
- }
- void JoystickPage::mouseMoveEvent(QMouseEvent* event)
- {
- if (m_isPressed)
- {
- updateHandlePosition(event->pos());
- update();
- }
- }
- void JoystickPage::mouseReleaseEvent(QMouseEvent*)
- {
- m_isPressed = false;
- m_handlePos = QPoint(0, 0);
- emit PositionChangedSignals(0, 0);
- update();
- }
- void JoystickPage::updateHandlePosition(const QPoint& pos)
- {
- QPoint center = rect().center();
- QPointF delta = pos - center;
- qreal distance = QLineF(center, pos).length();
- if (distance > m_radius)
- {
- delta = delta * m_radius / distance;
- }
- m_handlePos = delta.toPoint();
- if (distance < m_deadZone)
- {
- m_handlePos = QPoint(0, 0);
- emit PositionChangedSignals(0, 0);
- }
- else
- {
- // 归一化到[-1, 1]范围
- qreal x = delta.x() / m_radius;
- qreal y = -delta.y() / m_radius; // Y轴反转,使向上为正
- emit PositionChangedSignals(x, y);
- //qDebug() << x << ":" << y;
- }
- }
|