Hallo allerseits,
zunächst,
Qt 4.5, Microsoft Visual Studio 2008, Hoops, Acis
ich habe das folgende Problem:
ich möchte ein transparentes Label über eine komplexes 3D-Widget legen, um Textinformationen über die in dem 3D-Widget dargestellten Objekten einzublenden.
Als erstes habe ich versucht, in paintevent von dem 3D-Widget so etwas wie
QPainter p;
......
p.drawText(....);
Das funktioniert nicht, weil nicht QT sondern HOOPS das Zeichnen dieses Widgets übernimmt. Die geladenen Objekte, die in dem 3D-Widget dargestellt werden sind sehr groß (> 10 MB) und die Darstellung aufwendig.
Dann versuchte ich ein Label zu erzeugen, wo ich dann mit setText die Textinfo übergab und in paintevent folgendes tat:
void threeDWidgetInfo::paintEvent(QPaintEvent *e)
{
QPixmap pixmap(size());
pixmap.fill(Qt::transparent);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRedirected(this, &pixmap);
QLabel::paintEvent(e);
painter.restoreRedirected(this);
setMask(pixmap.mask());
}
das klappt zwar einigermaßen, aber der Text sieht trotz einiger antialiasing-settings sehr pixelig und unklar aus.
dann versuchte ich folgendes:
ich erzeugte ein Label, welches ein Bild beinhaltet, wessen Hintergrundfarbe einen sehr niedrigen Alphawert hat, quasi fast durchsichtig.
Da ich nicht weiß, wie ich dem 3D Widget sagen soll, dass es auch die von dem Label überdeckte Fläche zeichnen soll, so dass ich nur noch das semi-transparente Label an der Stelle drüberlegen kann, versuchte ich es so:
void threeDWidget::paintEvent(QPaintEvent *e)
{
hideThreeDWidgetInfoLabel();
modifyChanges() // das ist hoops
showThreeDWidgetInfoLabel();
}
das heißt ich versuchte bei jeden update() aufruf des 3D widgets das darüber liegende label zu verstecken, dann das 3D widget zu zeichnen wo auch die von dem label überdeckte fläche gezeichnet wird um dann das label mit dem niedrigen alphawerd draufzuklatschen.
klappt auch nicht.
Weiß vielleicht jemand von euch, wie ich dem parent-widget sagen kann, dass es auf jeden fall auch die von den children überdeckte flächen zeichnen soll?
oder habt ihr anregungen, einen anderen ansatz etc?
ich bin ein Qt newBee und arbeite mich seit erst kurzer zeit da ein. für eure antworten wäre ich sehr dankbar und falls ich noch wichtige details bei der beschreibung des problems ausgelassen habe, bitte um rückmeldung. danke im voraus.
Transparentes Label über 2D bzw 3D Widgets
Wegen dem pixeligen Text.
Dein 3D-Widget wird OpenGL zum Zeichnen her nehmen.
Da hilft dir QPainter::Antialiasing wenig weiter.
Nimm QPainter::HighQualityAntialiasing.
Oder mal doch mit Hoost (k.A. was das ist) oder direkt mit opengl-Funktionen den Text, da du ja im OpenGL-Kontext die korrekten Positionen deiner Objekte hast (kann man die rotieren, verschieben usw?)
Ansonsten gibt es auch in den Demos/Examples zu Qt4 ein Beispiel mit nem Overlay.
// edit
und bitte nimm
Dein 3D-Widget wird OpenGL zum Zeichnen her nehmen.
Da hilft dir QPainter::Antialiasing wenig weiter.
Nimm QPainter::HighQualityAntialiasing.
Oder mal doch mit Hoost (k.A. was das ist) oder direkt mit opengl-Funktionen den Text, da du ja im OpenGL-Kontext die korrekten Positionen deiner Objekte hast (kann man die rotieren, verschieben usw?)
Ansonsten gibt es auch in den Demos/Examples zu Qt4 ein Beispiel mit nem Overlay.
// edit
und bitte nimm
Code: Alles auswählen
-Tags für deinen Code. Kann man besser lesen.
// edit2:
Das ist das overpainting-example:
http://doc.qtsoftware.com/4.5/opengl-overpainting.html
Kompletter Source via Qt4-4.5-sources (auf qtsoftware.com) oder vllt. schon in deiner Installation.hallo franzf, danke für die schnelle antwort.
mit hoops kann ich kein label anzeigen, zumindest kein normales. ich kann z.b. beim laden des objektes sagen, dass das wort "zentrum" an der stelle (0,0,0) gezeichnet werden soll. allerdings muss ich das tun, während das objekt in die hoops-datenbank geladen wird und nur dann. aber die info, die ich darstellen möchte hab ich zu der zeit noch nicht, da erst später viel berechnet wird, was dann letztenendes dargestellt werden soll.
ich schaue mir gerade das GL-beispiel an, vielleicht habe ich glück.
nochmals danke für die schnelle antwort
mit hoops kann ich kein label anzeigen, zumindest kein normales. ich kann z.b. beim laden des objektes sagen, dass das wort "zentrum" an der stelle (0,0,0) gezeichnet werden soll. allerdings muss ich das tun, während das objekt in die hoops-datenbank geladen wird und nur dann. aber die info, die ich darstellen möchte hab ich zu der zeit noch nicht, da erst später viel berechnet wird, was dann letztenendes dargestellt werden soll.
ich schaue mir gerade das GL-beispiel an, vielleicht habe ich glück.
nochmals danke für die schnelle antwort
ich habe mir das beispiel mit gl angesehen, es klappt nicht so ganz. wie gesagt es das 3D Widget ist zwar ein GL-Widget, jedoch wird das zeichnen nicht von Qt durchgeführt. Im Prinzip ist 3D-Widget eine Klasse, die von QWidget erbt, aber Qt nicht benutzt um zu zeichnen.
Wenn irgend jemand wüßte, wie ich einem QWidget sagen kann, dass es bei jeden update() aufruf seine komplette fläche zeichnen soll, auch den von dem transparenten label bedeckten abschnitt, würde mir das enorm weiterhelfen.
Wenn irgend jemand wüßte, wie ich einem QWidget sagen kann, dass es bei jeden update() aufruf seine komplette fläche zeichnen soll, auch den von dem transparenten label bedeckten abschnitt, würde mir das enorm weiterhelfen.