Seite 1 von 1

Widget mit absoluter Position und render-to-pixmap

Verfasst: 5. Dezember 2017 21:31
von th3AddY
Hallo,

Ich habe ein QGLWidget, welches meine Szene rendert. Jegliche GUI soll nun in eine Textur gerendert werden, die dann auf einem Camera-aligned-quad angezeigt wird. Das funktioniert wunderbar, solange alles an Layouts ausgerichtet ist.

Folgender Aufbau bis jetzt:

Code: Alles auswählen

QGLWidget
  |- QGridLayout
       |- VirtualOverlay
Das VirtualOverlay erbt von QWidget und hat folgende Attribute:

Code: Alles auswählen

virtualOverlay->setAttribute(Qt::WA_DontShowOnScreen);
virtualOverlay->setAttribute(Qt::WA_TranslucentBackground);
Das Rendering des VirtualOverlays geschieht in QGLWidget::paintGL() vor dem Rendering der restlichen Szene und funktioniert in etwa so:

Code: Alles auswählen

QPixmap pix(width, height);
pix.fill(QColor(0,0,0,0));

virtualOverlay->render(&pix);
Bis hierhin funktioniert alles, wie ich es erwarte. Aus der Pixmap mache ich eine Textur, die dann auf dem Quad via OpenGL gerendert wird. Tastatur- und Mausevents kommen an, sodass Buttons etc. auch klickbar sind.

Jetzt zu dem Problem:

Ich möchte, dass Position und Größe des VirtualOverlay absolut angegeben werden können, sodass auch mehrere VirtualOverlays angezeigt werden können, die sich ggf. auch überlappen und unabhängig voneinander sind.
Dazu verzichte ich auf das QGridLayout und sage:

Code: Alles auswählen

virtualOverlay->setParent(glWidget);
virtualOverlay->setGeometry(x, y, width, height);
Das Problem ist nun, dass das VirtualOverlay zwar korrekt gerendert wird. Jedoch kommen keine Tastatur- und Mausevents mehr an. Buttons sind nicht mehr bedienbar etc...

Gibt es eine Möglichkeit, das irgendwie zu umgehen? Was genau ist die Ursache, dass bei absoluter Positionierung des Widgets die GUI events verschluckt werden?

Grüße
Daniel

Re: Widget mit absoluter Position und render-to-pixmap

Verfasst: 5. Dezember 2017 22:28
von th3AddY
Ich habe den Fehler gefunden. Wenn ein Widget keinem Layout zugeordnet ist, muss QWidget::show() explizit aufgerufen werden. :roll: