PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QPixmap löschen, nicht mit Farbe füllen



axeljaeger
11-05-2003, 17:18
Hallo zusammen,
ich möchte einen OnScreen-Text auf dem Bildschirm anzeigen, etwa wie SIM das macht, oder auch der Logitech Treiber unter Windows, wenn man auf einen der Multimediabuttons drückt. Das ganze soll unter KDE laufen, deswegen hab ich das erstmal mit Qt-Bordmitteln angefangen. Ich hab mir überlegt, ich zeichne meinen Text in eine QPixmap, nehme davon die Maske und setze diese Maske als Maske für ein Toplevelwidget ein. Ich hab also eine QPixmap genommen, diese Pixmap mit Rot gefüllt und dann meinen Text reingemalt. Ich hab rot genommen, weil die Schrift schattiert sein soll, also erst schwarz und dann weis, aber um ein paar Pixel nach nordwest versetzt. Dann mit QPixmap::createHeuristicMask() die Maske geholt und als Maske für mein Widget gesetzt. Das funktioniert aber nur halb, weil zum Beispiel die Öffnung in einem kleinen "e" oder auch das Loch im "o" nicht "ausgestanzt" werden. Ich habe in der Qt Dokumentation gelesen, das bei createAlphaMask() die Pixmap erst in ein QImage umgewandelt wird und wieder zurück. Einfacher scheint es nicht zu gehen, aber wenn ich schon den Overhead habe, würde ich lieber createAlphaMask() verwenden. Davon verspreche ich mir eine bessere Qualität, außerdem ist es nicht so gebastelt. Das Problem ist nur, das ich in ein leeres QImage nicht so ohne weiteres etwas(Schrift) reinzeichnen kann. Wenn ich erst in eine QPixmap was reinzeichne, muß ich diese QPixmap vorher mit irgendeinem Farbton füllen, um nicht irgendwelchen Speicherschrott da drinn zu haben. Es scheint in Qt nicht vorgesehen zu sein, eine QPixamp zu löschen, und zwar so, das dann alle Pixel auf Alphawert 0 zu setzen. Ich würde auch KDE-Librarys verwenden, um das Problem zu lösen. Leider gibt es die classref von KDE 3.1 nicht zum Download. Ich hab die 2.2.2er hier, aber dort konnte ich keine hilfreiches Klassen finden. Außerdem wäre ich an dem Code interessiert, mit dem in KDE die transparenten Menüs gemacht sind, um mein Zielwidget erstmal mit dem Hintergrund zu füllen, um dann ordentliches AntiAliasing mit dem Hintergrund machen zu können. Ich habe hier einen Code, um gefakte Transparenz zu machen, aber der nimmt sich nur den Desktophintergrund und nicht die Fenster, die evtl. davor sind

anda_skoa
11-05-2003, 19:48
Hmm, vielleicht QPainter::setBackgroundColor und QPainter::erase

Ciao,
_

axeljaeger
12-05-2003, 10:46
Das Problem dabei ist, das in QColor gar kein Alphachannel vorgesehen ist. Außerdem einen Bereich mit transparenz füllen geht gar nicht (Was passiert, wenn man mit einem Pinsel ohne Farbe mahlt?). Da hab ich dann immer noch den Windowsystem-Schrott drinn. In der Qt-Doku steht ja, das QPainter::erase das gleiche ist wie Hintergrundfarbe setzen und Rechteck füllen

anda_skoa
12-05-2003, 11:24
Ja, aber beim erstellen der Mask wir der die Hintgerundfarbe berücksichtigen, oder?

Oder hattest du schon Rot als Hintergrundfarbe gesetzt gehabt?

Ciao,
_

axeljaeger
12-05-2003, 17:08
Ich wollte jetzt weniger eine Bitmap als Maske. Ein richtiger alphachannel wäre mir lieber. Oder hat die QPixmap keinen Alphachannel, so das beim Konvertieren nach QImage und umgekehrt, der Alphachannel verloren geht? Das wäre aber armselig, wie könnte man sonst transparente PNGs vernünftig in eine QPixmap packen? Außerdem gibt es doch sehr wohl WindowSysteme, die halbtransparente PaintDevices haben. Es sollte also funktionieren, wenn ich das QPixmap nicht lösche, weil in der Maske steht, das die Bereiche, wo noch nicht reingemalt wurde, auch transparent sind, beim Umwandeln in QImage?

Edit:

Aber ich wusste gar nicht, dass die QPainter-Methoden die Maske auch nur irgendwie beeinflussen

anda_skoa
12-05-2003, 18:30
Original geschrieben von axeljaeger
Aber ich wusste gar nicht, dass die QPainter-Methoden die Maske auch nur irgendwie beeinflussen

Ist auch nur eine Vermutung.

Der ICQ client SIM hat glaub ich ein transparentes Onscreen Display und ich glaube die benutzen auch Qt.
Vielleicht kann man dort nachsehen, wie es gemacht wird.

Ciao,
_

jwebworks
13-05-2003, 07:59
Habe ich dafür nicht mal "xosd"
http://freshmeat.net/projects/xosd/?topic_id=861
benötigt, um das zu kompilieren? Bin mir
nicht sicher, aber diese Bibliothek dürfte
Dir helfen.

cu, stop.h

anda_skoa
06-06-2003, 19:26
Durch die Frage von Tec hab ich mich an diesen Thread erinnert.

QDesktopWidget könnte helfen, wenn man ein OSD machen will.

Ciao,
_