Skip to content

QOpenGLWidget #2

@ghorwin

Description

@ghorwin

Es wäre schön wenn Sie mir Example01 (GridObject) zukommen lassen
würden, wo die Basisklasse
class OpenGLWindow : public QWindow, protected QOpenGLFunctions
gegen die Basisklasse
class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
ausgetauscht ist. Sie haben geschrieben, dass ein Umstieg problemlos
möglich wäre (z.B. aus Performance-Gründen) - Ich habe es nicht geschafft.

Grundsätzlich ist ein QWindow bzw. QOpenGLWindow eigentlich nur ein
Wrapper um ein vom nativen Fenstermanager bereitgestellten Renderfenster
auf dem Desktop. QWidget bzw. QOpenGLWidget selbst haben eine Schicht
dazwischen, sodass Anwendergrafik zunächst in einem Pufferspeicher
landet und dann je nach Bedarf auf dem nativen Fenster gezeichnet wird.
Da eine xxWindow Klasse aber sonst noch keine Funktionalität zur
Eingabebehandlung etc. mitbringt, wird diese über einen Widget-Container
in einer QWidget-basierte Oberfläche eingebaut - wie das in den
Tutorials gemacht wird.

Wenn man QOpenGLWidget verwendet, dann ist in diesem Fenster die gesamte
OpenGL-Zeichen und Verwaltungsfunktion integriert (siehe beispielsweise
Tutorial 4).

class RectangleWindow :
	public QOpenGLWidget, protected QOpenGLFunctions
{
public:
	RectangleWindow(QWidget * parent = nullptr);
	virtual ~RectangleWindow() Q_DECL_OVERRIDE;

protected:
	void initializeGL() Q_DECL_OVERRIDE;
	void paintGL() Q_DECL_OVERRIDE;
}

D.h. das eigene Widget leitet von QOpenGLWidget ab. Die
protected-Vererbung der QOpenGLFunctions Schnittstelle dient dazu, dass
man ganz einfach glXXX-Befehle aufrufen kann.

Das sollte eigentlich bei Ihnen problemlos funktionieren.

Problem Nr. 2
In meinem Screenshot können Sie sehen, dass ein leeres Widget ein
Hintergrund-Bild verwendet.
...

Wenn ich das richtig verstehe, soll rasterbasiertes Zeichnen mit
OpenGL-Grafik überlagert/überblendet werden. Das ist relativ gut in

https://doc.qt.io/qt-5/qopenglwidget.html#QOpenGLWidget

beschrieben. Grundsätzlich zeichnet man die OpenGL-Grafik nicht direkt
auf den Bildschirm bzw. das native Desktopfenster, sondern erstmal (wie
in Tutorial 9 beschrieben in einen Pufferspeicher (FrameBuffer). Dann
kann man diesen Framebuffer und das Rasterbild des Widget-hintergrundes
miteinander überblenden/maskieren etc. Der Abschnitt "Relation to
QGLWidget" erläutert das etwas detaillierter.

Problem Nr. 3
Folgendes Problem bei Transparenzen kann ich mir nicht erklären. Wenn
ich nach Ihrer Anleitung den Hintergrund transparent setze, scheint der
Desktop-Hintergrund durch. Ich hätte vermutet, dass der
Widget-Background durchscheinen würde. Was wäre in diesem Fall zu tun ???

Siehe Eigenschaft "autoFillBackground", welche bei QOpenGLWidget
standardmäßig false ist. Damit wird der Widgethintergrund auch nicht
gezeichnet und man sieht den Desktop durch (das ist interessanterweise
der häufigste Grund für die Verwendung des QOpenGLWidget, um irgendwie
seltsam geformte Kontrollwidgets in Bildschirmecken etc. zu basteln).

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions