QGlWidget-children machen nicht was ich will!

Alles rund um die Programmierung mit Qt
Antworten
Jules
Beiträge: 9
Registriert: 1. Mai 2006 23:18
Kontaktdaten:

QGlWidget-children machen nicht was ich will!

Beitrag von Jules »

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.
Dateianhänge
Noch 'n Screenshot: <br />Das Fensterchen das mit &amp;quot;Konfigurator&amp;quot; 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
Noch 'n Screenshot:
Das Fensterchen das mit &quot;Konfigurator&quot; 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) 3241 mal betrachtet
Nihil agere delectat.
Jules
Beiträge: 9
Registriert: 1. Mai 2006 23:18
Kontaktdaten:

Nachtrag

Beitrag von Jules »

Damit das besser Vorstellbar ist, hab ich noch ein kleines Beispielprogrämmchen gebastelt.

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 &quot;ready to compile&quot;.
(4.66 KiB) 123-mal heruntergeladen
Nihil agere delectat.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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.
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.
Jules
Beiträge: 9
Registriert: 1. Mai 2006 23:18
Kontaktdaten:

Fragen über Fragen:

Beitrag von Jules »

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? (Ich 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.
Nihil agere delectat.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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.
Dateianhänge
bild.jpg
bild.jpg (16.8 KiB) 3218 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.
Jules
Beiträge: 9
Registriert: 1. Mai 2006 23:18
Kontaktdaten:

Wahh!!

Beitrag von Jules »

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.
Nihil agere delectat.
Jules
Beiträge: 9
Registriert: 1. Mai 2006 23:18
Kontaktdaten:

Was ich vielleicht noch hätte anfügen sollen...

Beitrag von Jules »

So sieht das nämlich bei mir aus:
Dateianhänge
Bild 1.png
Bild 1.png (19.45 KiB) 3214 mal betrachtet
Nihil agere delectat.
Jules
Beiträge: 9
Registriert: 1. Mai 2006 23:18
Kontaktdaten:

Lösung (nicht wirklich leider)

Beitrag von Jules »

Hallo!

Ich steig auf Cocoa um (wollte eh schon länger wieder mal was neues programmieren).

Trotzdem Danke für die Hilfe!
Nihil agere delectat.
Antworten