#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(); } 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::move(const QPoint &delta) { QRect desk = QGuiApplication::primaryScreen()->geometry(); m_pos += delta; 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); }