// ***************************************************************************** // 版权所有(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; } }