Wie führe ich ein sanftes Downscaling von Hintergrundbildern in Qt-Stilen durch?

8

Standardmäßig verwendet Qt eine sehr einfache, schnelle und hässliche Art der Skalierung von Bildern, Qt::FastTransformation , wahrscheinlich eine Interpolation des nächsten Nachbarn oder etwas sehr ähnliches.

Bei einem QPixmap kann man eine visuell bessere Skalierung wählen, zum Beispiel

%Vor%

Was können wir jedoch tun, wenn sich das Bild nicht in einem QPixmap -Objekt befindet, sondern einfach den Hintergrund einer Schaltfläche oder eines anderen Widgets?

Im Folgenden finden Sie eine sehr einfache Möglichkeit zum Erstellen einer automatisch skalierbaren, vollständig angepassten Schaltfläche, die sich für eine auflösungsunabhängige Anwendung eignet, wenn sie mit Layouts und setStretch() verwendet wird.

%Vor%

Ich habe border-image anstelle von background-image wegen einem Mangel in den Qt Style Sheets.

Wie kann ich mit Bildern in Stylesheets glatter skalieren?

Die gleiche Sache mit Pixmaps zu implementieren, ist viel weniger elegant. Ich muss immer Resize-Ereignisse abfangen, die neuen Größen aller meiner Widgets neu berechnen und sie manuell neu streichen.

Bearbeiten:

Interessanterweise funktioniert die Glättungsskalierung mit Stylesheets, wenn das Bild vergrößert wird, aber nicht, wenn es verkleinert wird.

Im folgenden Beispiel wird in der ersten Zeile ein 32 * 32-Symbol und in der zweiten Zeile ein einheitliches Raster verwendet, das größer als 2000 * 2000 ist.

    
vsz 17.01.2017, 06:36
quelle

1 Antwort

1

Intern verwendet Qt QPainter zum Zeichnen der Stile und QPainter verwendet bilineare Interpolation beim Zeichnen von skalierten Pixmaps. Dies hat einen großen Nachteil in Bezug auf die Qualität, wenn der Downscaling-Faktor klein genug ist, siehe diesen Fehlerbericht . Für beste Qualität sollte das Hintergrundquellbild immer innerhalb von [0,5, 2,0] Faktor der Zielgröße liegen. AFAICT gibt es keinen einfachen Weg aus dieser Beschränkung.

    
arhzu 25.01.2017, 08:06
quelle

Tags und Links