QGlWidget-children machen nicht was ich will!
Verfasst: 9. Juli 2007 23:15
Ich grüße euch!
Folgende Problemstellung:
Ich habe ein QGlWidget, und ich will ein (selbstgebasteltes) Kontroll-Widget darüberlegen.
Eigenartigerweise wird das Widget (und im allgemeinen auch keine anderen Widgets *) nicht angezeigt, wenn ich es einfach ein Child vom GLWidget mache.
Also habe ich was anderes versucht: Ich habe ein Widget, dass das zur Hälfte vom GLWidget ausgefüllt wird, und in dass ich das Kontrollwidget einfüge. Jetzt wird zwar das Widget dargestellt, aber sämtliche Transparenz fehlt, der Hindergrund wird weiß dargestellt. Das passiert übrigens nur über dem GLWidget, der Hintergrund des Kontrollwidgets wird nur über dem GLWidget weiß gefüllt, daneben ist er ganz normal transparent.
Mir fallen folgende Möglichkeiten ein, das Problem zu lösen:
1. Das GLWidget selbst nicht darstellen und mit renderPixmap() ein Pixmap erstellen, das ich dann zeichne. (Das dürfte aber ziemlich langsam sein; Ich brauche aber den Speed).
2. Mit grabWidget() einen "Screenshot" vom Kontrollwidget machen, den dann nach dem "Overpainting Example" auf dem GLWidget malen, und mouseEvents zu dem echten Kontrollwidget umleiten. (irgendwie ein ziemliches Gemurks...)
3. Das Kontrollwidget als eigenes Fenster darstellen. Das geht aber äußerst schlecht, weil man Fenster nicht ordentlich transparent machen kann (setMask() nimmt ja nur Bitmaps und setTransparency() legt die Transparenz für das gesamte Fenster fest, nicht nur für Bereiche - ich kann zB. keinen Teil 20% transparent machen und gleichzeitig einen anderen 80%; das funktioniert - soweit ich das mitbekommen habe - bei Widgets, nicht bei Windows).
4. Nach dem "Overpainting Example" das Kontrollwidget vollständig neu selbst implementieren (also nicht von QWidget erben) - das geht aber ein bisschen am Sinn der Sache vorbei.
Ich finde ein bisschen eigenartig, dass sich das GLWidget so anders als normale Widgets verhält... aber es ist nun mal so.
Es wäre wirklich sehr super wenn es da eine einfachere Lösung gäbe; wenn es eine gibt, sagt es mir bitte! Und wenn nicht, sagt mir, welche meiner Lösungen ihr für am Besten haltet!
Danke im Voraus!
Ich nutze übrigens Mac OS X 10.4.10 und Qt 4.2.2. Code habe ich keinen dabei, weil das - obwohl es nicht so aussieht - ein paar tausend Zeilen sind, die damit zusammenhängen. Wenn das jemand will, kann ich aber gerne ein demonstratives Progrämmchen schreiben.
* zB. das QLabel und QFrame; ich habe zwar nicht alle Widgets probiert; aber ich habe den fehlgeschlagenen Versuch mit den zwei Widgets als induktive Grundlage für die Behauptung als ausreichend empfunden.
Folgende Problemstellung:
Ich habe ein QGlWidget, und ich will ein (selbstgebasteltes) Kontroll-Widget darüberlegen.
Eigenartigerweise wird das Widget (und im allgemeinen auch keine anderen Widgets *) nicht angezeigt, wenn ich es einfach ein Child vom GLWidget mache.
Also habe ich was anderes versucht: Ich habe ein Widget, dass das zur Hälfte vom GLWidget ausgefüllt wird, und in dass ich das Kontrollwidget einfüge. Jetzt wird zwar das Widget dargestellt, aber sämtliche Transparenz fehlt, der Hindergrund wird weiß dargestellt. Das passiert übrigens nur über dem GLWidget, der Hintergrund des Kontrollwidgets wird nur über dem GLWidget weiß gefüllt, daneben ist er ganz normal transparent.
Mir fallen folgende Möglichkeiten ein, das Problem zu lösen:
1. Das GLWidget selbst nicht darstellen und mit renderPixmap() ein Pixmap erstellen, das ich dann zeichne. (Das dürfte aber ziemlich langsam sein; Ich brauche aber den Speed).
2. Mit grabWidget() einen "Screenshot" vom Kontrollwidget machen, den dann nach dem "Overpainting Example" auf dem GLWidget malen, und mouseEvents zu dem echten Kontrollwidget umleiten. (irgendwie ein ziemliches Gemurks...)
3. Das Kontrollwidget als eigenes Fenster darstellen. Das geht aber äußerst schlecht, weil man Fenster nicht ordentlich transparent machen kann (setMask() nimmt ja nur Bitmaps und setTransparency() legt die Transparenz für das gesamte Fenster fest, nicht nur für Bereiche - ich kann zB. keinen Teil 20% transparent machen und gleichzeitig einen anderen 80%; das funktioniert - soweit ich das mitbekommen habe - bei Widgets, nicht bei Windows).
4. Nach dem "Overpainting Example" das Kontrollwidget vollständig neu selbst implementieren (also nicht von QWidget erben) - das geht aber ein bisschen am Sinn der Sache vorbei.
Ich finde ein bisschen eigenartig, dass sich das GLWidget so anders als normale Widgets verhält... aber es ist nun mal so.
Es wäre wirklich sehr super wenn es da eine einfachere Lösung gäbe; wenn es eine gibt, sagt es mir bitte! Und wenn nicht, sagt mir, welche meiner Lösungen ihr für am Besten haltet!
Danke im Voraus!
Ich nutze übrigens Mac OS X 10.4.10 und Qt 4.2.2. Code habe ich keinen dabei, weil das - obwohl es nicht so aussieht - ein paar tausend Zeilen sind, die damit zusammenhängen. Wenn das jemand will, kann ich aber gerne ein demonstratives Progrämmchen schreiben.
* zB. das QLabel und QFrame; ich habe zwar nicht alle Widgets probiert; aber ich habe den fehlgeschlagenen Versuch mit den zwei Widgets als induktive Grundlage für die Behauptung als ausreichend empfunden.