123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #include "JoystickPage.h"
- JoystickPage::JoystickPage(QWidget* parent )
- : 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);
- }
-
-
-
-
-
-
-
-
-
-
- }
- 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
- {
-
- qreal x = delta.x() / m_radius;
- qreal y = -delta.y() / m_radius;
- emit PositionChangedSignals(x, y);
-
- }
- }
|