Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 04:03

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: OpenGL mit GUI in C++
BeitragVerfasst: Fr Apr 29, 2011 08:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Du du dich anscheinend mit der Materie auskennst, hab ich noch ein paar Fragen. Ich will nämlich nicht damit anfangen und dann merken, dass Qt doch nicht das richtige ist:

  1. Geht durch den QTimer mit Interval auf 0 Zeit verloren, also kostet mich das Performance verglichen mit anderen Methoden (MainLoop und dann immer SwapBuffers)?
  2. Sind die Events für Tasten und Maus so, dass man sich mit einer First-Person Kamera im Raum bewegen kann? Ich habe nämlich bemerkt, dass diese mouseMoveEvent nur getriggert wird, wenn man die Maustaste drückt... Es gibt doch sicher andere Methoden dafür, oder? Sowas wie KeyDown und KeyUp hab ich glaube ich schon gesehen, wahrscheinlich ist es das beste, einen boolean zu setzen und wieder zurückzusetzen um sich zu bewegen, dann hat man diese Sekunde verzögerung nach dem ersten Tastendruck bis zu den Wiederholungen nicht.
  3. Wie verhält sich Qt mit Multithreading? Kann ich bspw. aus einem zweiten Thread den ich für Physik verwende direkt auf die Widgets zugreifen, oder muss ich da synchronisieren?
  4. Ich habe in meinem Qt-Testprogramm noch keine Shader eingebunden (es rendert im Moment nur ein Dreieck), aber als ich mit dem QPainter etwas über OpenGL zeichnen wollte (ich habe gelesen, man kann damit sehr gut Text rendern), bekomme ich in stderr einen Fehler der sagt, dass die Shader nicht kompiliert werden konnten.*
  5. Welche Einstellungsmöglichkeiten habe ich bezüglich des Kontexts? Ich habe das QGLFormat gesehen, mit dem man einiges Einstellen kann, aber wie kann ich bspw. sagen, dass ich einen GL3 Kontext haben will?

(*)
Code:
  1. Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile
  2. Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile
  3. QGLShaderProgram: shader programs are not supported
  4.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL mit GUI in C++
BeitragVerfasst: Fr Apr 29, 2011 09:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Geht durch den QTimer mit Interval auf 0 Zeit verloren, also kostet mich das Performance verglichen mit anderen Methoden (MainLoop und dann immer SwapBuffers)?

Das Signal-Slot-Konzept ist ziemlich schnell. Ich habe bisher immer einen Timer benutzt, war mir schnell genug. Es hindert dich aber niemand daran die Hauptschleife selbst zu implementieren. Du musst dann aber natürlich irgendwo Qt-Events verarbeiten. Das geht in dem du einfach selbst irgendwo in der Schleife QCoreApplication::processEvents aufrufst. Ich bin mir allerdings nicht sicher ob man da QApplication::exec() aufrufen muss oder nicht.

Zitat:
Sind die Events für Tasten und Maus so, dass man sich mit einer First-Person Kamera im Raum bewegen kann?

Ja, das geht.

Zitat:
dann hat man diese Sekunde verzögerung nach dem ersten Tastendruck bis zu den Wiederholungen nicht.

Du solltest bei den Key-Events alles ignorieren wo keyEvent->isAutoRepeat () == true ist. Ich nutze bei mir ein std::set<int> um zu speichern welche Tasten aktiv sind. Ein weiteres std::set wird für die Mausbuttons benutzt. Die eigentliche Bewegung findet dann in einer update-Funktion abhängig von der tatsächlich vergangenen Zeit statt.

Zitat:
Ich habe nämlich bemerkt, dass diese mouseMoveEvent nur getriggert wird, wenn man die Maustaste drückt...

Das kannst du für jedes Widget über die Methode setMouseTracking() einstellen.

Zitat:
Wie verhält sich Qt mit Multithreading? Kann ich bspw. aus einem zweiten Thread den ich für Physik verwende direkt auf die Widgets zugreifen, oder muss ich da synchronisieren?

Wenn bestimmte Methoden thread-safe sind ist das in der Doku explizit angegeben. Für alles andere musst du selbst synchronisieren. Qt stellt dafür aber praktische Klassen zur Verfügung, etwa den QMutexLocker.

Zitat:
Ich habe in meinem Qt-Testprogramm noch keine Shader eingebunden (es rendert im Moment nur ein Dreieck), aber als ich mit dem QPainter etwas über OpenGL zeichnen wollte (ich habe gelesen, man kann damit sehr gut Text rendern), bekomme ich in stderr einen Fehler der sagt, dass die Shader nicht kompiliert werden konnten.

Das Textrendering in Qt ist leider nicht (mehr) gut. Es war mal super, bis einschließlich Qt 4.5. Seit Qt 4.6 haben die das irgendwie umgebaut. Die renderText-Funktion des QGLWidget ist nämlich darauf angewiesen, dass du einen OpenGL 1.0 Kontext hast. Mittlerweile wird aber ein OpenGL 2.0 Kontext als Default erstellt. Das war echt ein "Spaß", siehe dieser Thread. Ich habe allerdings noch nicht versucht über den QPainter den Text zu rendern, möglich das dies geht. Möglich das es auch irgendwie anders geht.

Zitat:
aber wie kann ich bspw. sagen, dass ich einen GL3 Kontext haben will?

Habs noch nicht probiert, aber QGLFormat::setVersion sieht viel versprechend aus. Das Format kannst du vor erzeugen des QGLWidget einstellen. Bei mir sieht die main()-Funktion so aus:
Code:
  1. QApplication app(argc,argv);
  2.  
  3. QGLFormat fmt;
  4. fmt.setAlphaBufferSize(8);
  5. fmt.setRedBufferSize(8);
  6. fmt.setGreenBufferSize(8);
  7. fmt.setBlueBufferSize(8);
  8. fmt.setOverlay(false);
  9. fmt.setDirectRendering(true);
  10. QGLFormat::setDefaultFormat(fmt);
  11.  
  12. ViewerWidget* w = new ViewerWidget(); // abgeleitet von QGLWidget
  13. w->resize(800, 600);
  14. w->show();
  15. return app.exec();

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL mit GUI in C++
BeitragVerfasst: Fr Apr 29, 2011 10:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Je nachdem wie komplex dein Editor werden soll empfehle ich auch noch über XML oder ähnliches nachzudenken.
Ist halt sehr schnell eingebaut und man kann dann prima seine Klassen darum aufbauen, lohnt sich aber wie gesagt
nur wenn du es entsprechend oft brauchst.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL mit GUI in C++
BeitragVerfasst: Fr Apr 29, 2011 10:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
yunharla hat geschrieben:
Je nachdem wie komplex dein Editor werden soll empfehle ich auch noch über XML oder ähnliches nachzudenken.
Ist halt sehr schnell eingebaut und man kann dann prima seine Klassen darum aufbauen, lohnt sich aber wie gesagt
nur wenn du es entsprechend oft brauchst.


Ich kann dir ehrlich gesagt nicht ganz folgen. Ich habe schon vor die Output-Dateien aus dem Editor mit XML-Dateien zu speichern, aber was hat das genau mit der GUI zu tun?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL mit GUI in C++
BeitragVerfasst: Fr Apr 29, 2011 10:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Qt liefert unter anderem auch ein XML-Modul mit. Brauchst du aber nur dann einbinden wenn du es auch benutzen willst, also kein Overhead. ;) Es gibt auch noch andere nützliche Module.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL mit GUI in C++
BeitragVerfasst: Fr Apr 29, 2011 11:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Jaja, ich sehe schon... Eigentlich wollte ich nur eine kleine GUI Library und am Ende überredet ihr mich das ganze Qt-Framework zu benutzen :D Hinterher braucht man noch 20MB Libraries um das Programm zu starten :mrgreen:

Ich muss mal sehen, wie sich das entwickelt. Danke auf jeden Fall für die Hilfe!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL mit GUI in C++
BeitragVerfasst: Fr Apr 29, 2011 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Markus hat geschrieben:
yunharla hat geschrieben:
Je nachdem wie komplex dein Editor werden soll empfehle ich auch noch über XML oder ähnliches nachzudenken.
Ist halt sehr schnell eingebaut und man kann dann prima seine Klassen darum aufbauen, lohnt sich aber wie gesagt
nur wenn du es entsprechend oft brauchst.


Ich kann dir ehrlich gesagt nicht ganz folgen. Ich habe schon vor die Output-Dateien aus dem Editor mit XML-Dateien zu speichern, aber was hat das genau mit der GUI zu tun?


Das kommt immer drauf an wie viel man in seiner GUI machen will. Wenn du nur deine 2-3 Buttons hast auf die man klicken kann dann ist es
kein Problem das ganze in C++ von Hand zu machen. Das wird dich aber sehr schnell in den Wahnsinn treiben sobald du deine 40-60 Buttons,
Textfelder,Slider,Bilder etc. einbaust und dann hast du vieleicht noch unterschiedliche Ansichten ......
In solchen Fällen bietet es sich dann schon an wenn man den ganzen Designkram in einer einfacheren Sprache macht und du nur noch eine Klasse
hast die daraus dann deine GUI erstellt. Im Programm siehts dann nur noch ungefähr so aus:

Code:
  1.  
  2. public class MyAlertDialog : Window{
  3.      XmlParseableTextView *message;
  4.      XmlParseableButtonView *btn_ok,*btn_cancel;
  5.      
  6.       public MyAlertDialog()
  7.       {
  8.             super();
  9.       }
  10.  
  11.       protected override onExecuteEvent(Event event)
  12.       {
  13.               if(event.sender == btn_cancel && event.message == "hallowelt")
  14.               {
  15.               }
  16.               else if(event.sender == btn_ok && event.message == "hallowelt")
  17.               {
  18.               }
  19.               else super.onExecuteEvent(event);
  20.       }
  21.  
  22. }
  23.  


Und im XML steht dann z.B.:

Code:
  1.  
  2. ...
  3. <MyAlertDialog message="do you like icecream?">
  4.     <MyAlertDialog.btn_ok  name="buttonA" content="yes" background="ff0000"/>
  5.  
  6.     <MyAlertDialog.btn_cancel>
  7.         <Button name="buttonB" content="no">
  8.           <Button.background>
  9.               <LinearGradiant StartColor="fff" EndColor="888676"/>
  10.           </Button.background>
  11.         </Button>
  12.      </MyAlertDialog.btn_cancel>
  13.      
  14.      <Trigger>
  15.           <Trigger.Conditions>
  16.                       <Condition Sender="buttonA"  Attribute="clicked" Value="true"/>
  17.                       <Condition Sender="buttonB"  Attribute="clicked" Value="true" Expression="||"/>
  18.           </Trigger.Conditions>
  19.           <Trigger.Actions>        
  20.                  <MessageAction Message="hallowelt"/>
  21.           </Trigger.Actions>      
  22.      </Trigger>
  23. </MyAlertDialog/>
  24.  
  25. ....
  26.  

_________________
Meine Homepage


Zuletzt geändert von yunharla am Fr Apr 29, 2011 16:57, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL mit GUI in C++
BeitragVerfasst: Fr Apr 29, 2011 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Das bietet Qt praktischerweise von haus aus an und liefert sogar einen Designer zum gemütlichen UI zusammenklicken mit ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]