#include "CursorController.h" #include #include #include #include #include #include CursorController::CursorController(QObject *parent) : QObject(parent) { // 判断能否真正移动系统光标 m_useRealCursor = QGuiApplication::platformName() != "eglfs" && QGuiApplication::platformName() != "linuxfb" && QGuiApplication::platformName() != "minimal"; if (!m_useRealCursor) m_pos = QGuiApplication::primaryScreen()->geometry().center(); else m_pos = QCursor::pos(); m_holdTimer.setSingleShot(true); connect(&m_holdTimer, &QTimer::timeout, this, [this] { m_isLongPress = true; m_curStep = cfg.step * 2; // 切到长步长 }); } void CursorController::handleKey(int key) { QPoint delta; switch (key) { case Qt::Key_Up: delta = QPoint(0, -cfg.step); break; case Qt::Key_Down: delta = QPoint(0, cfg.step); break; case Qt::Key_Left: delta = QPoint(-cfg.step, 0); break; case Qt::Key_Right: delta = QPoint( cfg.step, 0); break; case Qt::Key_Return: case Qt::Key_Space: if (cfg.emulate) emulateClick(); return; default: return; } move(delta); } void CursorController::handleKey(int key, bool pressed) { static QSet pressedKeys; // 记录当前按住的键 switch (key) { case Qt::Key_Up: case Qt::Key_Down: case Qt::Key_Left: case Qt::Key_Right: { QPoint dir; switch (key) { case Qt::Key_Up: dir = QPoint(0, -1); break; case Qt::Key_Down: dir = QPoint(0, 1); break; case Qt::Key_Left: dir = QPoint(-1, 0); break; case Qt::Key_Right: dir = QPoint( 1, 0); break; } if (pressed) { /* ---------- 键按下(含自动重复) ---------- */ if (!pressedKeys.contains(key)) { // 第一次按下 pressedKeys.insert(key); m_isLongPress = false; m_curStep = cfg.step; // 短按步长 m_holdTimer.start(100); // 1 秒后切成长按 } /* 每次按下(含自动重复)都移动 */ int step = m_isLongPress ? cfg.step * 2 : cfg.step; move(dir * step); } else { /* ---------- 键释放 ---------- */ pressedKeys.remove(key); m_holdTimer.stop(); m_isLongPress = false; } return; } case Qt::Key_Return: case Qt::Key_Space: if (pressed && cfg.emulate) emulateClick(); return; default: return; } } void CursorController::move(const QPoint &delta) { QRect desk = QGuiApplication::primaryScreen()->geometry(); //m_pos += delta; m_pos += delta * m_curStep; // 用 m_curStep 而不是 cfg.step if (cfg.wrap) { m_pos.setX(((m_pos.x() - desk.left()) % desk.width() + desk.width()) % desk.width() + desk.left()); m_pos.setY(((m_pos.y() - desk.top()) % desk.height() + desk.height()) % desk.height() + desk.top()); } else { m_pos.setX(qBound(desk.left() + cfg.edgeGap, m_pos.x(), desk.right() - cfg.edgeGap)); m_pos.setY(qBound(desk.top() + cfg.edgeGap, m_pos.y(), desk.bottom() - cfg.edgeGap)); } if (m_useRealCursor) QCursor::setPos(m_pos); emit cursorMoved(m_pos); } void CursorController::emulateClick() { QWidget *w = QApplication::widgetAt(m_pos); if (w) { QPoint local = w->mapFromGlobal(m_pos); QMouseEvent press (QEvent::MouseButtonPress, local, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QMouseEvent release(QEvent::MouseButtonRelease, local, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(w, &press); QApplication::sendEvent(w, &release); } emit clicked(w); }