// ***************************************************************************** // ��Ȩ���У�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; } }