Important: Please read the Qt Code of Conduct -

QScreen geometry & availableGeometry returns weird values

  • I have 2 4k monitors set to scale at 150% on Windows 10 and I don't think the numbers are working out right for me. Here's my code:

            int screen_idx = 1;
            QList<QScreen*> screens(QGuiApplication::screens());
            Q_FOREACH( auto screen, screens)
                const QRect screen_rect(screen->availableGeometry());
                const QRect pixel_rect(screen->geometry());
                qDebug() << "Screen #" << screen_idx << ": screen_rect: " << screen_rect << ", pixel_rect= " << pixel_rect;

    and here is the output:

    Screen # 1 : screen_rect:  QRect(0,0 2560x1400) , pixel_rect=  QRect(0,0 2560x1440)
    Screen # 2 : screen_rect:  QRect(3840,0 2560x1400) , pixel_rect=  QRect(3840,0 2560x1440)

    Now one or both of those QRect for the sizes should be 3840x2160. The docs for geometry() in specific say:

    This property holds the screen's geometry in pixels

    Those are not pixels. Those are scaled pixels (2560x1.5=3840, 1440x1.5=2160). How do I get the actual number of pixels on each display?

  • Hi, I think it depends on what DPI awareness you code (or rather your .exe file) is set to. Here's a quick way to test, create a text file called qt.conf with this contents:

    WindowsArguments = dpiawareness=1

    and place that file in the same directory as your .exe file. Restart your app, does this change the output?

  • Yes, I did realize I forgot one other piece of info. I do set a couple things:


    But still - I just want the desktop size in pixels, so I can place my windows correctly.

  • I've opened a Qt bug to track this:

Log in to reply