Transparentes Label über 2D bzw 3D Widgets
Verfasst: 11. Juni 2009 15:47
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.
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.