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.
QGlWidget-children machen nicht was ich will!
QGlWidget-children machen nicht was ich will!
- Dateianhänge
-
- Noch 'n Screenshot:
Das Fensterchen das mit "Konfigurator" beschriftet ist ist das Kontrollwidget von dem ich geredet habe. Man kann gut sehen, dass es neben dem GLWidget transparent ist, über dem GLWidget aber nicht (die weißen Striche scheine - Screenshot.png (48.35 KiB) 3254 mal betrachtet
Nihil agere delectat.
Nachtrag
Damit das besser Vorstellbar ist, hab ich noch ein kleines Beispielprogrämmchen gebastelt.
Anbei ist ein zip mit den Sourcefiles.
Anbei ist ein zip mit den Sourcefiles.
- Dateianhänge
-
- OGLWidget.zip
- Das GLWidget stammt zu großen Teilen aus dem QT-Beispiel.
In window.cpp hab ich zwei Labels eingebaut die das Problem demonstrieren.
Die ganze Sache ist natürlich "ready to compile". - (4.66 KiB) 124-mal heruntergeladen
Nihil agere delectat.
Erstens, es ist nicht ready to compile.
Zweitens, ich seh nicht worauf Du hinaus willst. Es passiert auch nichts wenn ich die Fenstergröße ändere. Alles so wie ich es erwarten würde.
Zweitens, ich seh nicht worauf Du hinaus willst. Es passiert auch nichts wenn ich die Fenstergröße ändere. Alles so wie ich es erwarten würde.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Fragen über Fragen:
ad erstens: Unter "ready to compile" verstehe ich halt auch qmake... wir haben ja alle andere OSe hier. (Oder hat was anderes gehapert? Bei mir hat's hingehaun).
ad zweitens: Das finde ich sehr eigenartig. Hast du dir meinen Screenshot angesehen? Das ist genau das Gegenteil von dem was ich erwartet hätte. Was hättest du dir erwartet?
ch nämlich, dass das Label grün auf schwarz ist und nicht grün auf weiß auf schwarz.); außerdem dass das Label nicht immer wieder, ohne den Hintergrund zu löschen, gezeichnet wird (was dazu führt, dass sich Antialiasing ad absurdum führt und der Text fetter aussieht - das passiert nämlich wenn ich die Fenstergröße ändere.)
Welches OS hast du? Vll liegt da ein Unterschied.
Ganz kurz zusammengefasst: Ich will darauf hinaus, dass ich ein transparentes Widget über meinem GLWidget liegt. Ohne weiß gefüllten Hintergrund.
Danke für's anschauen jedenfalls.
ad zweitens: Das finde ich sehr eigenartig. Hast du dir meinen Screenshot angesehen? Das ist genau das Gegenteil von dem was ich erwartet hätte. Was hättest du dir erwartet?
Welches OS hast du? Vll liegt da ein Unterschied.
Ganz kurz zusammengefasst: Ich will darauf hinaus, dass ich ein transparentes Widget über meinem GLWidget liegt. Ohne weiß gefüllten Hintergrund.
Danke für's anschauen jedenfalls.
Nihil agere delectat.
qmake habe ich benutzt, aber nur um mir ein Projekt für Visual Studio zu erstellen 
Dein makeObject muss einen Wert zurück geben, aber Du hattest alles auskommentiert. Gab bei mir einen Compilerfehler. Nichts wildes, war ja schnell gefunden.
Bei mir sind die Label grün auf schwarz. Wenn ich die Fenstergröße ändere, dann werden die Texte dünner. War aber erst nach deinem Hinweis zu erkennen.
Bild habe ich mal angefügt. OS ist übrigens XP, aber ob es daran liegt oder an der Grafikkarte, kann ich nicht sagen.
Dein makeObject muss einen Wert zurück geben, aber Du hattest alles auskommentiert. Gab bei mir einen Compilerfehler. Nichts wildes, war ja schnell gefunden.
Bei mir sind die Label grün auf schwarz. Wenn ich die Fenstergröße ändere, dann werden die Texte dünner. War aber erst nach deinem Hinweis zu erkennen.
Bild habe ich mal angefügt. OS ist übrigens XP, aber ob es daran liegt oder an der Grafikkarte, kann ich nicht sagen.
- Dateianhänge
-
- bild.jpg (16.8 KiB) 3231 mal betrachtet
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Wahh!!
Ich verzweifle!!! Bei dir funktioniert das ja!
Wuhuhu... und ich hab so gehofft, dass es ein Fehler von mir ist... was mach ich jetzt?
PS. Verzeih meinen akuten Gefühlsausbruch...
PPS. Ah, was bei dir einen Compilefehler liefert, liefert bei mir nur eine Warnung, weil die Funktion sowieso nicht verwendet wird (wenn mich jetzt nicht alles täuscht).
Danke für die schnell Antwort.
Wuhuhu... und ich hab so gehofft, dass es ein Fehler von mir ist... was mach ich jetzt?
PS. Verzeih meinen akuten Gefühlsausbruch...
PPS. Ah, was bei dir einen Compilefehler liefert, liefert bei mir nur eine Warnung, weil die Funktion sowieso nicht verwendet wird (wenn mich jetzt nicht alles täuscht).
Danke für die schnell Antwort.
Nihil agere delectat.
Was ich vielleicht noch hätte anfügen sollen...
So sieht das nämlich bei mir aus:
- Dateianhänge
-
- Bild 1.png (19.45 KiB) 3227 mal betrachtet
Nihil agere delectat.
Lösung (nicht wirklich leider)
Hallo!
Ich steig auf Cocoa um (wollte eh schon länger wieder mal was neues programmieren).
Trotzdem Danke für die Hilfe!
Ich steig auf Cocoa um (wollte eh schon länger wieder mal was neues programmieren).
Trotzdem Danke für die Hilfe!
Nihil agere delectat.