Verwenden von QVTKWidget und QOpenGLWidget auf derselben Benutzeroberfläche?

8

Ich arbeite an einem Projekt, das eine benutzerdefinierte Unterklasse von QOpenGLWidget verwendet, um einige Renderings anzuzeigen. Am Ende der Methode paintGL() ruft sie die update() -Methode des Widgets auf, um ein Repaint-Ereignis auszulösen, wenn es sichtbar ist. Jetzt möchte ich ein zusätzliches QVTKWidget zu meinem Ui hinzufügen und tue das, indem ich etwas wie folgt benutze:

%Vor%

Das VTK-Widget wird zur ui hinzugefügt und funktioniert wie vorgesehen. Das Problem ist, dass sobald ich die layout->addWidget() Methode verwende, alle meine anderen QOpenGLWidget Objekte schwarz werden und nichts anzeigen. Auch dieses Schwarz ist nicht die Hintergrundfarbe von VTKRenderer , da die anderen Widgets immer noch schwarz sind, auch wenn ich die Hintergrundfarbe des VTK-Widgets ändere. Ich habe überprüft und der paintGL() wird immer noch in einer Schleife aufgerufen, aber es zeigt nichts an. Ich bin mir ziemlich sicher, dass ich in meiner Widget-Unterklasse keinen schlechten OpenGL-Code verwendet habe, also nehme ich an, dass es etwas mit der internen Initialisierung von QOpenGLWidget und QVTKWidget zu tun hat. Das Gleiche passiert, wenn ich alle VTK-Aufrufe weglasse und einfach die neu erstellte QVTKWidget hinzufüge.

Das Lustige ist, dass wenn ich den Aufruf layout->addWidget() weglasse, VTK den Renderer in einem separaten Fenster öffnet und alle OpenGL-Widgets ohne Probleme funktionieren. Aber natürlich möchte ich den Renderer in mein UI einbetten.

Hat jemand Erfahrung damit oder kennen Sie Fallstricke, in die ich vielleicht geraten bin oder gibt es irgendwelche allgemeinen Probleme, die das verursachen könnten?

Übrigens: Ich benutze ein OpenGL 3.3-Kernprofil mit benutzerdefinierten Shadern für meine QOpenGLWidget -Unterklasse.

BEARBEITEN: Ich habe meine Anfrage für ein 3.3-Kernprofil entfernt und verwendet nun ein 4.4 Kompatibilitätsprofil. Ich nehme an, dass es jetzt das gleiche Profil wie das VTKRenderer verwendet, so dass dies als Quelle für den Fehler ausgeschlossen werden kann.

    
w1th0utnam3 15.11.2014, 10:25
quelle

1 Antwort

11

Also ich weiß nicht, was genau das Problem verursacht hat, aber ich habe es gelöst. Zuerst habe ich herausgefunden, dass es eine zweite Widget-Klasse für VTK namens QVTKWidget2 gibt, aber unglücklicherweise ist sie nicht vollständig kompatibel zu Qt 5.4, da sie die alten QGL-Klassen verwendet (wie QGLWidget anstelle von QOpenGLWidget ). Also fing ich an, es als eine Unterklasse von QOpenGLWidget neu zu implementieren, was ziemlich einfach war. Im Folgenden finden Sie die Quelldateien für meine Klasse QVTKWidget3 , die mit Qt 5.4 für jeden, der daran interessiert ist, funktionieren. Ich habe nur begrenzte Tests gemacht (weil ich immer noch VTK lerne), aber einfache Beispiele wie das Anzeigen einer Sphäre funktionieren.

Noch einmal: Das funktioniert nur mit Qt 5.4 (beta) , da ältere Versionen die Klasse QOpenGLWidget nicht zur Verfügung stellen!

Header-Datei: qvtkwidget3.h

%Vor%

Quelldatei: qvtkwidget3.cpp

%Vor%     
w1th0utnam3 15.11.2014, 12:54
quelle

Tags und Links