获取Qt中物理屏幕大小

17

我正在使用Qt,需要帮助获取屏幕(显示器)的物理尺寸。

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

QDesktopWidget *mydesk = QApplication::desktop();

QDesktopwidget有一些方法可以获取屏幕的像素分辨率和毫米尺寸:

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(),它也有类似的结果。


这些方法从未对我起过作用。获取真实测量值的唯一方法是参考屏幕上的真实物体(比如硬币、尺子等)。 - user336063
嗨Sosukodo,你提到的“在屏幕上引用真实世界的对象”是什么意思?谢谢。 - Hermandroid
我一直在编写一个示例应用程序,但我还没有完成它。无论如何,如果您知道一枚硬币的尺寸是17.9毫米,并向用户显示一张硬币的图片,然后让他们缩放图片直到其与实际硬币的大小相匹配,那么基本上就是说: 17.9毫米=屏幕上的N像素..从这里您可以进行简单的数学计算,以计算有多少枚硬币适合您的屏幕测量中。 - user336063
2个回答

8
这是我的(简单粗糙的)示例。它对我有效,希望对你也有效。我假设你可以自己处理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

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

3
以下方法对我来说有效,可以获取屏幕的准确物理尺寸(毫米为单位)。
QSizeF screenSize = QGuiApplication::primaryScreen()->physicalSize();

然而,在Qt文档中我发现了以下句子:
根据底层系统提供的信息不一定完全准确。
因此,它可能无法适用于您的系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接