Kriege Joystick mit SDL/Qt nicht zum Laufen



  • Hallo,
    bevor ich ins Detail gehe und ggf. später Code poste, erst mal ein paar Fragen zum eigenen Verständnis und zum Zweck:
    Hier in meinem letztem Post habe ich also das SDL eingebunden.
    Für mein Cockpitsimulator-Projekt (C++ und Qt) habe ich in der main ein Start-Window mit einer Auswahl versehen, welche ein MainWindow (QWidget) öffnet und diesem ein std::string aus der Auswahl übergeben wird. In diesem MainWindow findet das gesamte (mit weiteren Qt-Widgets) Cockpitleben statt.
    Ich habe verschiedene Quellen im Internet gefunden und habe für das "Joystickleben" erst einmal separate Projekte erstellt, bei denen aber keine Reaktion auf das Bewegen der Joystick-Achsen erfolgt. Deshalb wird es erst dann ins "große" Projekt eingebunden wenn ich weiß wie es funktioniert bzw. funktionieren könnte.
    Mir ist nicht klar, ob es möglich ist die SDL 2 erst im MainWindow zu Initialisieren? Ich möchte mit meinem Joystick nur die X- und Y-Achse sowie einen bestimmten Button nutzen.
    Alternativ ist QGamepad zwar schön und gut, habe aber gelesen, dass dieses auch SDL benötigt und aus der Qt Doku geht nicht hervor, wie dieses in diesem Zusammenhang zu verwenden ist.
    Und noch eine Frage zu SDL: Kann man folgendes Schema auch ins MainWindow legen oder wo gehört das hin, damit es funktioniert:

    Edit: Steht im Konstruktor:
    MainWindow.cpp

        joyobj = new Joystick(this);
    
        //connect ???
    
        SDL_Init(SDL_INIT_JOYSTICK);
        SDL_JoystickEventState(SDL_ENABLE);
    
        SDL_Event e;
        while (SDL_PollEvent(&e))
        {
            switch (e.type)
            {
            case SDL_JOYDEVICEADDED:
                joyobj->OnJoystickConnected(e.jdevice);
                break;
    
            case SDL_JOYDEVICEREMOVED:
                joyobj->OnJoystickDisconnected(e.jdevice);
                break;
    
            case SDL_JOYAXISMOTION:
                joyobj->OnJoystickAxisMove(e.jaxis);
                break;
    
            default:
                break;
            }
        }
    

    Ich bastele schon seit ein paar Tagen daran herum, bringe es aber einfach nicht zum laufen 😞
    Vielen Dank für hilfreiche Antworten...



  • Hast du schon die QtGamepad Examples angeschaut.

    Und falls du es damit nicht hinbekommst (bzw. dein Joystick nicht erkannt wird), kannst du auch mal QJoysticks (welches auf SDL basiert) ausprobieren bzw. dessen Sourcen + Example Code anschauen.

    So wie dein Code bis jetzt ist, kann es nicht funktionieren, da du dann zwei ineinander verschachtelte GUI-Message-Loops hättest (von Qt und SDL).



  • @Th69 Danke sehr. Aber hier hat wohl jemand (oder noch jemand, den ich flüchtig kenne) vergessen, dass ich nicht mit Qt Creator sondern NUR mit dem Visual Studio 2019 mit Qt programmiere, also cmake nicht qmake...
    Hast du zu
    "So wie dein Code bis jetzt ist, kann es nicht funktionieren, da du dann zwei ineinander verschachtelte GUI-Message-Loops hättest (von Qt und SDL)."
    einen Lösungsvorschlag?



  • In SDL_Joysticks.cpp wird der SDL Code als Qt Timer Funktion ausgeführt.

    Hatte mich aber bei deinem Code vertan, du verwendest ja SDL_PollEvent() und nicht SDL_WaitEvent(), so daß es zwar nicht blockiert, aber die Schleife sofort verlassen wird (sie muß aber regelmäßig aufgerufen werden, um die Joystick-Aktionen auszuführen -> daher der QTimer).

    Daher mein Rat: benutze die QJoysticks library, anstatt es selber zu programmieren.



  • @Th69 Ok, werde ich mal versuchen. Herzlichen Dank!



  • @Th69 sagte in Kriege Joystick mit SDL/Qt nicht zum Laufen:

    Daher mein Rat: benutze die QJoysticks library, anstatt es selber zu programmieren.

    Ich habe mir den Code von diesem Beispiel angeschaut und verstanden wie es (mit dem Signal-Slot-Prinzip) grundsätzlich läuft. Da ich für meine Zwecke nur einen Bruchteil des Codes brauche, habe ich mir basierend auf diesem Beispiel doch relativ schnell und kompakt etwas eigenes aufgebaut. Und es funktioniert wie gewünscht!


Anmelden zum Antworten