QT: Tasten/Maus Eingabe als Thread?
-
Tag auch!
Ich habe ein QGLWidget mit "smooth camera" welche sich so lange in geeigneter Geschwindigkeit bewegt, bis die Taste losgelassen wurde.
Ist nun aber die Darstellung langsam, blockiert offensichtlich die paintGL Methode die Eingabe. Folglich ist es in sehr großen Szenen kaum möglich präzise die Kamera zu bewegen.
Ist es generell möglich in meiner QGLWidget Klasse den Input in einen Thread zu verlagern, dass zumindest die im Hintergrund sonst weiterlaufende Kamera gestoppt werden kann?
Alternativ würde ich in dem Parent die Tastatur "grabben" und QGLWidget in einem Thread ausführen... Was haltet ihr davon?Tyvm!
-
Alles was in Qt mit grafischer Oberfläche zu tun hat, kann und darf nicht in einem anderen als dem Hauptthread passieren! Darum geht Auslagern der Zeichenfunktion in einen anderen Thread schon mal nicht.
Da die ganzen Tasten/Maus-Sachen eben auch auf dem darunter liegenden Window-System (z.B. X11) passiert, geht das Auslagern auch nicht (neben dem dass es die ganzen Events als keyPressEvent, mouseMoveEvent in der QObject-Hierarchie erst ab QWidget gibt ;)).Folglich bleiben dir 2 (einfache) Möglichkeiten:
- paintGL performanter gestalten
also keine großen images unnötig kopieren usw...
- Erstell dir einen "RenderThread" der nur Pixmaps erzeugt, die du über Signal/Slot bei Fertigstellung deinem QGLWidget übermittelst. (Wenn in deinem paintGL einige Pixmap (also Texture)-Manipulationen stattfinden.
Bei 2 gilt zu beachten, dass Signal/Slot über verschiedene Threads hinaus nur über eine QueuedConnection gehen! Dabei landen die übergebenen Parameter als Kopie ein einem Zwischenspeicher
Ist wieder ne Spaßbremse, wenn dann hier Pixmaps/Images kopiert werden. Also irgendwo in ner Liste einen Pointer ablegen und nur diesen beim emit() übergeben. Und immer brav löschen wenns nimmer gebraucht wird
- paintGL performanter gestalten
-
Hier findest du auch was zu dem Thema:
http://qtforum.de/forum/viewtopic.php?t=9465