Qt et les manettes

Utiliser la SDL (ou une autre API) pour gérer une manette dans un projet Qt

a marqué ce sujet comme résolu.

Bonjour !

J’ai un projet qui requiert d’utiliser Qt (pour une GUI) et une manette. Il n’est pas question de tout faire avec la SDL : Bien trop d’efforts nécessaires comparé à Qt. Cependant, Qt seul ne me suffit pas. Je suis en version 6.3, et de d’après la doc, cette version ne gère pas les manettes :

image.png
image.png

J’ai essayé de dégrossir un peu le problème. En C++, l’outil le plus plébiscité pour la gestion d’une manette est SFML. J’aime bien car c’est codé en C++ et il semble que ce soit pleinement compatible avec Qt (question des signals et des slots) mais je ne connais pas. D’un autre côté, il y a la SDL. Je la connais un peu, mais jamais utilisée avec Qt. Quand je cherche sur internet, les sujets sur Qt + SDL datent de 2018, ça commence à dater, il y a un risque que ce soit obsolète.

Quel est le choix le plus judicieux selon vous ? SDL ou SFML ? Le critère principal étant la facilité d’intégration. (je veux juste des inputs manettes, donc pas besoin d’apprendre pendant des mois à utiliser SFML je crois)

Merci pour vos conseils !

Hello,

Je ne peux pas t’aider pour QT, mais par contre, pour info, wxWidgets supporte les manettes de jeu, via une interface générique. Sauf erreur on a accès à 6 axes analogiques + deux gâchettes) + 32 boutons.

Donc si tu n’es pas fermé à changer complètement de bibliothèque de GUI, ça pourra s’intégrer sûrement plus facilement. wxWidgets est aussi multiplateforme, libre, et possède aussi un composant pour affiger de l’OpenGL, au cas où.

Le problème que je vois à utiliser une bibliothèque de GUI comme QT et SFML ou SDL en même temps, c’est qu’ils risquent de se marcher dessus dans leurs boucles d’évènement respectives. Est-ce que tu peux ouvrir une fenêtre en QT et la binder avec le système évènementiel de SDL ou SFML ? Ou bien au contraire, est-ce que tu peux ouvrir une fenêtre SFML ou SDL et ensuite l’enregistrer dans QT et utiliser des composants de GUI QT ? Pas sûr, peut-être pas totalement portable, et dans tous les cas probablement inutilement compliqué.

Sinon, si tu es sous windows exclusivement, utiliser xinput.h directement n’est pas hyper compliqué non plus. Tu pourras notamment voir qu’en fait, récupérer l’état de la manette est complètement indépendant du système d’évènement de la GUI, que ça se résume en 2 ou 3 fonctions à appeler à chaque frame, donc utiliser SDL ou SFML juste pour ça est un peu inutile.

+0 -0

Salut,

En effet, il semblerait que Qt6 ne supporte pas QtGamepad. Mais peut-être pourrais-tu faire le portage toi-même ? C’est peut-être pas très compliqué (je ne vois pas trop pourquoi ce le serait, les drivers n’ont pas changé et les signaux/slots existent toujours), juste pas une priorité, ou ils prévoient une refonte …

En tout cas, tu pourrais t'inspirer de ce qu’ils ont fait pour juste intégrer SDL.

Comme l’a dit QuentinC, la difficulté à faire cohabiter deux lib GUI c’est qu’ils ont chacun besoin d’une boucle d’évènement.
Ici, on voit que c’est réglé simplement en scrutant les évènement SDL sur un QTimer. (Il faut aussi voir que dans ce module l’implémentation SDL est appelée lorsque les implémentations natives xinput, evdev etc … n’ont pas fonctionnées)

EDIT : Autre solution : Downgrade Qt vers Qt 5.15 pour profiter du module. En tout cas ce serait bien de fixer ta version sur une LTS (la plus récente étant 6.5). Pourquoi avoir choisi Qt 6.3 ?

+0 -0

Hey there ! je viens aux nouvelles. :)

J’ai "choisi" Qt 6.3, car c’est la version qu’on m’a faite installer en cours, tout simplement. ^^ Mais justement, hier j’ai downgrade vers la 5.15… Et maintenant je constate que cette API de malheur ne fonctionne pas ! :S ma manette n’est pas détectée… Pourtant elle est bien connectée, elle fonctionne en jeu… mais le code suivant s’active :

auto gamepads = QGamepadManager::instance()->connectedGamepads();
if(gamepads.isEmpty()){
    qDebug() << "Did not find any connected gamepads";
    return;
}

Ce code est pourtant tiré des exemples inclus dans Qt Creator et référencé dans la doc en ligne. C’est à m’en arracher les cheveux. :( Il semble que ne sois pas le seul à avoir eu ce problème, mais la solution proposée sur ce topic ne fonctionne pas.

Vu le temps que ça m’a pris, il est hors de question de repasser encore à la 6.3 maintenant. Je vais encore fouiller pour trouver des exemples qui fonctionnent de cette API (sans QML que je ne connais pas), sinon je vais regarder ce qui a été fait avec la SDL , le lien partagé par romantik.

J’ai "choisi" Qt 6.3, car c’est la version qu’on m’a faite installer en cours, tout simplement.

tsuruba

D’accord, donc c’est pas une vraie contrainte, c’est juste soit que ça date de l’époque où le cours a été écrit, soit qu’on a évité que vous surchargiez la connexion du bahut en téléchargeant tous plusieurs Go en même temps.

ma manette n’est pas détectée… Pourtant elle est bien connectée, elle fonctionne en jeu…

tsuruba

C’est quoi comme manette ? Dans quel jeu c’est reconnu ? Voir quel moteur de jeu la reconnais.

Vu le temps que ça m’a pris, il est hors de question de repasser encore à la 6.3 maintenant.

tsuruba

C’est pour ça qu’il faut toujours travailler avec un gestionnaire de version tel que git ;) surtout avec ce genre d’expérience. une ligne de commande et tu retrouvais ton état précédent.

je vais regarder ce qui a été fait avec la SDL

tsuruba

Exécute le code d’exemple SDL avant déjà, comme t’as fait pour Qt, sinon tu vas te taper une intégration pour rien.

+0 -0

Pas d’édit car j’ai trouvé la réponse

BON !
Windows, Windows, Windows… Cesseras-tu un jour d’être éclaté au sol ?
Je me suis dit, peut-être, que ça ne marche pas car je travaillais sur un PC Surface : Windows 11 donc. Initiative : Installons Qt sur Windows 10 ( > 2 heures ) et sur linux ( < 20 minutes ) et voyons ce qu’il se passe. Sur W10, ça ne fonctionne toujours pas. Sur Linux (disto Kubuntu) Ô Miracle ça marche ! Ave Linus ! Ave Stallman ! Vade Retro Microsoft ! :'(

En essayant d’assembler les briques de différents forums, il semble que Qt ait du mal à gérer les manettes avec DirectX comme interface… Pourquoi diable QtGroup s’embête avec DirectX qui appartient à Microsoft quand la SDL utilise une licence GNU LGPL ? :S
Je veux dire… moi j’ai commencé mon machin pour Windows, mais c’est parce que je fait un truc en lien avec le jeu vidéo, et jouer sur Linux bon voilà quoi… mais là je comprends pas ce choix. :’D

Bon bref : faut installer Qt (attention 5.15 !) sur Linux. Pour ceux qui passeront après moi, vous allez avoir un problème en faisant ça. A la première compilation, le compilateur va se plaindre de pas trouver 'lgl' ou un truc du genre. D’après un topic de Stack Overflow (j’ai pas gardé le lien) c’est parce que le compilateur n’arrive pas à trouve le chemin vers la librairie OpenGL, indispensable à Qt 5. Que faire ?

  1. Vérifier que OpenGL est installé (normalement par défaut sur les debian mais sait-on jamais) : glxinfo | grep 'version' .
  2. Localise la première ligne : locate libGL. Ca donnera une dizaine de chemins. Copier le premier.
  3. Créer un lien vers la librairie : sudo ln -s <chemin copié> /usr/lib/libGL.so.
  4. Recompiler : Qt content ! Développeur content ! <3

Pour te répondre @romantik :

  1. Oui je confirme que le réseau de mon école est une vaste blague.
  2. Manette Xbox One bluetooth officielle, reconnue dans des Assassin’s Creed, Genshin Impact… Avec ou sans fil.
  3. Alors là je vois pas comment faire… Tu penses à… mettre mon répertoire d’installation de Qt sur un dépôt git, commit & pull, puis désinstaller Qt, réinstaller en 5.15, et au cas où revenir à un état du dépôt précédent ? ça me semble archi-lourd comme procédure non ?
  4. Du coup pas la peine, ça va se faire à grand renfort de Linux… Tant pis pour le plan de base. :(

Merci pour l’aide ! :D <3

Bon bref : faut installer Qt (attention 5.15 !) sur Linux. Pour ceux qui passeront après moi, vous allez avoir un problème en faisant ça. A la première compilation, le compilateur va se plaindre de pas trouver 'lgl' ou un truc du genre.

Outre le fait que ça ressemble à une erreur de configuration du système de build plutôt qu’un vrai problème, normalement il n’y a pas besoin de compiler Qt à la main sur la vaste majorité des systèmes linux (du moins pour une version récente comme 5.15 ou 6.6). Il y a des paquets pour ça.

@adri1 je ne parle pas de compiler Qt à la main. Je parle à la première compilation d’un projet (projet exemple de l’IDE, par exemple.) J’ai mal formulé ma phrase. :)
Et oui du coup c’est une erreur de configuration (mais pas du système de build) qui, d’après le topic que j’ai lu, est courante quand un dev se fait un environnement Qt sur Linux. Mais cette erreur est résolue en faisant ce que j’ai écrit plus haut.

Si tu parles de compiler ton propre projet, alors une bibliothèque introuvable pour le linker alors qu’elle est installée est par définition une erreur de configuration du système de build. C’est à corriger avec le système de build utilisé, pas en bricolant des symlinks.

+0 -0

Pourquoi diable QtGroup s’embête avec DirectX qui appartient à Microsoft quand la SDL utilise une licence GNU LGPL ? :S

tsuruba

Parce que la SDL est un middleware qui permet aussi de faire du multiplateforme, pas un driver qui pilote la manette, et comme Qt est aussi ce genre de middleware, il va chercher à gérer en natif. M’enfin, comme je t’ai montré dans mon lien précédent, ils utilisent SDL sur les plateformes qu’ils ne supportent pas mais que peut-être SDL supporte.
Aussi, QtGroup ne s’embête pas vraiment avec QtGamepad tout court, comme le montre la mailing list dans le lien de Gabbro.

It’s not exactly a business critical project so for us it’s a passion project

Andy Nichols, mainteneur du module QtGamepad

je fait un truc en lien avec le jeu vidéo, et jouer sur Linux bon voilà quoi…

tsuruba

Si tu fais un jeu, je te conseille d’utiliser un moteur de jeu plutôt. Si tu fais un outil pour le jeu vidéo, selon ce que c’est Qt n’est peut-être pas le plus adapté non plus (et vu que ça se contrôle à la manette, j’ai des doutes).

  1. Alors là je vois pas comment faire… Tu penses à… mettre mon répertoire d’installation de Qt sur un dépôt git, commit & pull, puis désinstaller Qt, réinstaller en 5.15, et au cas où revenir à un état du dépôt précédent ? ça me semble archi-lourd comme procédure non ?
tsuruba

Ok, je croyais que ce qui t’avais pris du temps c’était de modifier ton projet pour corriger les incompatibilités Qt5/Qt6, et ça ça se gère avec git. Si c’est juste l’install qui t’as embêté, normalement tu as dû pouvoir les installer côte à côte, et si tu utilises QtCreator, passer de l’un à l’autre c’est simplement changer de "kit de compilation".

normalement il n’y a pas besoin de compiler Qt à la main sur la vaste majorité des systèmes linux (du moins pour une version récente comme 5.15 ou 6.6). Il y a des paquets pour ça.

adri1

Et même sur Windows, y’a un tas de version prebuilt, et on peut les gérer facilement avec le Qt maintenance tool.
Je suis d’accord avec adr1 qu’il y a probablement quelque chose d’étrange dans ta configuration du système de build.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte