Présentation succincte de Qt Gamepad

Qt 5.7 est arrivé avec quelques nouveaux modules relativement expérimentaux, notamment Qt Gamepad. Comme son nom l’indique, ce module se destine principalement aux jeux et permet d’utiliser des manettes de jeu directement depuis Qt, c’est-à-dire des mécanismes d’entrée avec des boutons, des contrôles directionnels (comme un manche à balai) et parfois des touches. Ce module fournit tant une interface C++ que QML (ce qui est monnaie courante dans les nouveaux développements, comme Qt 3D). Son API n’est pas encore finalisée (le module reste expérimental) et pourrait évoluer dans les versions de Qt à venir. Au niveau de la compatibilité, l’implémentation utilise les API systèmes de Linux, Windows, macOS, iOS et Android, mais aussi la SDL.

Le module se décompose principalement en trois classes, côté C++. Le singleton QGamepadManager liste les manettes connectées et reconnues (accessibles individuellement par QGamepad) et offre un accès de haut niveau aux événements générés par toutes les manettes. QGamepadKeyNavigation se spécialise dans les signaux d’appui sur les touches. Les composants QML (disponibles dans le module QtGamepad 1.0) portent des noms identiques.

La documentation est assez éparse pour le moment (une seule classe C++, rien côté Qt Quick), ICS propose donc un exemple d’utilisation, exploitant QGamepadManager (au lieu de QGamepad, comme dans les exemples fournis avec Qt 5.7). Celui-ci montre comment lister les manettes disponibles, puis connecte des signaux à chaque événement possible pour en afficher les détails.

GamepadMonitor::GamepadMonitor(QObject *parent)
    : QObject(parent)
{
    qDebug() << "QGamePadManager Demo\n";

    auto gamepads = QGamepadManager::instance()->connectedGamepads();
    qDebug() << "Number of gamepads:" << gamepads.size();

    for (auto i : gamepads) {
        QGamepad *gamepad = new QGamepad(i);
        qDebug() << "Gamepad:" << i;
        qDebug() << "  device id:   " << gamepad->deviceId();
        qDebug() << "  name:        " << gamepad->name();
        qDebug() << "  is connected?" << gamepad->isConnected();
    }

    qDebug() << "\nMonitoring for events...\n";

    connect(QGamepadManager::instance(), &QGamepadManager::connectedGamepadsChanged, this,
        []() { qDebug() << "connected gamepads changed:"; });
    connect(QGamepadManager::instance(), &QGamepadManager::gamepadConnected, this,
        [](int deviceId) { qDebug() << "gamepad connected:" << deviceId; });
    connect(QGamepadManager::instance(), &QGamepadManager::gamepadDisconnected, this,
        [](int deviceId) { qDebug() << "gamepad disconnected:" << deviceId; });
    connect(QGamepadManager::instance(), &QGamepadManager::gamepadButtonPressEvent, this,
        [](int deviceId, QGamepadManager::GamepadButton button, double value) { qDebug() << "button press event:" << deviceId << button << value; });
    connect(QGamepadManager::instance(), &QGamepadManager::gamepadButtonReleaseEvent, this,
        [](int deviceId, QGamepadManager::GamepadButton button) { qDebug() << "button release event:" << deviceId << button; });
    connect(QGamepadManager::instance(), &QGamepadManager::gamepadAxisEvent, this,
        [](int deviceId, QGamepadManager::GamepadAxis axis, double value) { qDebug() << "axis event:" << deviceId << axis << value; });
    connect(QGamepadManager::instance(), &QGamepadManager::buttonConfigured, this,
        [](int deviceId, QGamepadManager::GamepadButton button) { qDebug() << "button configured:" << deviceId << button; });
    connect(QGamepadManager::instance(), &QGamepadManager::axisConfigured, this,
        [](int deviceId, QGamepadManager::GamepadAxis axis) { qDebug() << "axis configured:" << deviceId << axis; });
    connect(QGamepadManager::instance(), &QGamepadManager::configurationCanceled, this,
        [](int deviceId) { qDebug() << "configuration canceled:" << deviceId; });
}

Source, image et code source : What’s New in Qt 5.7.0: Qt Gamepad.
Merci à Claude Leloup pour ses corrections.

Laisser un commentaire