在 Qt 中获取物理屏幕大小

Posted

技术标签:

【中文标题】在 Qt 中获取物理屏幕大小【英文标题】:Get physical screen size in Qt 【发布时间】:2012-01-25 13:39:10 【问题描述】:

我在 Qt 工作,我需要帮助来获取屏幕(显示器)的物理尺寸,

在 Qt 中,可以从QApplication 获得QDesktopWidget,我的意思是:

QDesktopWidget *mydesk = QApplication::desktop();

QDesktopwidget 有一些方法可以获取以像素为单位的分辨率,还有一些方法可以获取以 milimethers 为单位的大小:

mydesk-> widthMM(); mydesk->heightMM();

但是这和物理尺寸不对应,我用尺子测量我的屏幕时,还是有相当大的差异。

还可以获取 DPI 测量值并计算屏幕尺寸:

mydesk->physicalDpiX(); mydesk->physicalDpiY();

double Winches = (double)mydesk.width() / (double)mydesk.physicalDpiX();
double Hinches = (double)mydesk.Height() / (double)mydesk.physicalDpiY();

mydesk.width()mydesk.height() 以像素为单位给出大小(分辨率)

但是测量结果也是错误的,非常接近mydesk.widthMM()mydesk.heightMM()

我也试过mydesk.logicalDpiX(),结果相似。

【问题讨论】:

那些方法对我从来没有用过。获得真实测量结果的唯一方法是参考屏幕上的真实对象(想想角钱、尺子等)。 嗨 Sosukodo,您对“在屏幕上引用真实世界的对象”有何看法?谢谢 我一直在编写一个示例应用程序,但还没有完成。无论如何,如果您知道一角硬币的大小是 17.9 毫米,并且您向用户展示一角硬币的图片,然后让他们放大/缩小直到图片与物理硬币匹配,它基本上说:17.9 毫米 = N 个像素我的屏幕.. 从中您可以进行简单的数学计算来计算您的屏幕测量值中有多少角钱。 【参考方案1】:

这是我的(快速而肮脏的)示例。它似乎对我有用,我希望它对你有用。我假设您可以自己处理 main.cpp。我在 MacBook Air 11.6" 上执行此操作,并将一角硬币的图片替换为 OS X 附带的美国图标:

#ifndef WINDOW_H
#define WINDOW_H

#include <QtGui>

class Window : public QWidget

    Q_OBJECT

public:
    QWidget *canvas;
    QSlider *slider;
    QPixmap pixmap;

private:
    qreal zoom;
    qreal pixels;
    qreal px_width;
    qreal px_height;
    qreal mm_width;
    qreal mm_height;

public:
    Window();
    void paintEvent(QPaintEvent *);

public slots:
    void setZoom(int);
;

Window::Window()

    QHBoxLayout *layout = new QHBoxLayout;

    canvas = new QWidget;
    slider = new QSlider;
    slider->setMinimum(0);
    slider->setMaximum(100);
    slider->setValue(50);

    layout->addWidget(canvas);
    layout->addWidget(slider);

    this->setLayout(layout);

    if(!pixmap.load(":/resources/USA.gif"))
    
        qDebug() << "Fatal error: Unable to load image";
        exit(1);
    

    QObject::connect(slider, SIGNAL(valueChanged(int)), SLOT(setZoom(int)));


void Window::paintEvent(QPaintEvent *event)

    QPainter paint;
    paint.begin(this);
    paint.scale(zoom, zoom);
    paint.drawPixmap(0,0, pixmap);
    paint.end();


void Window::setZoom(int new_zoom)

    zoom = (qreal)(50+new_zoom) /50;
    pixels = pixmap.width() * zoom;

    QDesktopWidget desk;

    px_width = desk.width() / pixels;
    px_height = desk.height() / pixels;
    mm_width = px_width * 17.9;
    mm_height = px_height * 17.9;

    qDebug() << "Zoom: " << zoom;
    qDebug() << "desk.widthMM:" << desk.widthMM();
    qDebug() << "px_width: " << px_width;
    qDebug() << "px_height: " << px_height;
    qDebug() << "mm_width: " << mm_width;
    qDebug() << "mm_height: " << mm_height;

    this->repaint();


#include "moc_window.cpp"

#endif // WINDOW_H

【讨论】:

真的很好,我在上网本和自己的硬币上用过,得到了实物大小,非常感谢您的帮助。但我需要一种为我的应用程序自动获取大小的方法。 老实说,我认为这是不可能的。如果是,我很想知道它可以在哪些平台上使用!请注意 QPaintDevice::widthMM 的文档:“由于平台限制,可能无法使用此函数来确定屏幕上小部件的实际物理尺寸。”【参考方案2】:

以下方法对我有用,以获取屏幕的准确物理尺寸(以毫米为单位)。

QSizeF screenSize = QGuiApplication::primaryScreen()->physicalSize();

但是,在 Qt 文档中我发现了以下句子

取决于底层系统提供的价值信息 可能并不完全准确。

所以它可能不适用于您的系统。

【讨论】:

以上是关于在 Qt 中获取物理屏幕大小的主要内容,如果未能解决你的问题,请参考以下文章

Qt获取当前屏幕大小

Qt如何设置窗口屏幕居中显示以及设置大小

Qt 获取屏幕信息

Qt窗口屏幕居中显示以及设置大小

Flutter MediaQuery获取屏幕信息以及屏幕适配

QT 13 窗口屏幕设置大小与居中显示