Anzeige:
Ergebnis 1 bis 8 von 8

Thema: QPixmap löschen, nicht mit Farbe füllen

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719

    QPixmap löschen, nicht mit Farbe füllen

    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

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hmm, vielleicht QPainter::setBackgroundColor und QPainter::erase

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    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

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ja, aber beim erstellen der Mask wir der die Hintgerundfarbe berücksichtigen, oder?

    Oder hattest du schon Rot als Hintergrundfarbe gesetzt gehabt?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    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
    Geändert von axeljaeger (12-05-2003 um 16:15 Uhr)

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    05.06.2002
    Ort
    Hof
    Beiträge
    154
    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

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Durch die Frage von Tec hab ich mich an diesen Thread erinnert.

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

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •