c + + - Hvad er den bedste måde at skalere billeder på for højt DPI i Qt5?

Indlæg af Hanne Mølgaard Plasc

Problem



Vi har forskellige billeder i vores ansøgning (vist fra en QPixmap i en QLabel), der vises med en rimelig størrelse på ikke-høje DPI skærme, men er krympet på højt DPI. De andre UI-elementer ser fint ud.


Jeg har kigget på funktionen devicePixelRatioF (), men den vender altid tilbage 1. På mit system har jeg 150\% skalering aktiveret, så hvis jeg hardcode 1.5 som skaleringsfaktoren, så er billederne af de forventede dimensioner i forhold til vinduet. Spørgsmålet er , hvordan kan jeg få systemskalafaktoren, så jeg kan få applikationen til at være ensartet på tværs af systemer med forskellig DPI/skalering? I tillæg til Windows er applikationen bygget til Linux.


Jeg vil sætte pris på nogen rådgivning.

Bedste reference


Dette problem slog mig også. Det er også rapporteret i Qt's fejltracker her. [6]


Problemet er, at 150\% skalering på Windows er ikke udført ved at skalere alle pixels med en faktor på 1,5, men snarere skalere skrifttyperne og 'justere' brugergrænsefladen tilsvarende. Derfor ser afstanden og layoutene meget underligt, når en 150\% skalering er valgt.


Da devicePixelRatio () spørger det faktiske pixelforhold, og det er uændret, når det indstilles til 150\% på Windows, returnerer det stadig 1.


Hvis du virkelig har brug for 1,5 værdien til at skala dine pixmaps korrekt, kan du selv beregne selve faktoren ved at spørge skærmens DPI (se dokumentationen her). [7]

Andre referencer 1


Om høje DPI-skærme : Jeg synes, du skal se på ejendommen QScreen::devicePixelRatio, som [8]



  holder skærmens forhold mellem fysiske pixels og
  enhedsuafhængige pixels



og brug den returnerede værdi til at indstille pixmap forholdet med QPixmap::setDevicePixelRatio. [9]


For eksempel:


#include <QApplication>
#include <QDebug>
#include <QScreen>
#include <QPixmap>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPixmap p(32, 32);
    QScreen * screen = a.primaryScreen();
    p.setDevicePixelRatio(screen->devicePixelRatio());

    //...

    return a.exec();
}


Om systemskalering kan du få et fingerpeg om at teste QScreen::logicalDotsPerInch egenskaben, f.eks .:


int scaling\_percent = (screen->logicalDotsPerInch() / 96) * 100;