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
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