web-dev-qa-db-ja.com

Qtで物理的な画面サイズを取得する

私はQtで働いていますが、画面(モニター)の物理的なサイズを取得するために助けが必要です、

Qtでは、QDesktopWidgetからQApplicationを取得できます。つまり、次のようになります。

_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()を試してみましたが、同様の結果が得られました。

16
Herman

これが私の(速くて汚い)例です。それは私にとってはうまくいくようで、あなたにとってもうまくいくことを願っています。 main.cppは自分で処理できると思います。私はこれをMacBookAir 11.6 "で行い、OSXに含まれているUSAアイコンの代わりに10セント硬貨の写真を使用しました。

#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
8
user336063

次の方法で、画面の正確な物理サイズをmm単位で取得できました。

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

ただし、Qtのドキュメントで次の文を見つけました。

基盤となるシステムが提供する情報によっては、値が完全に正確でない場合があります。

そのため、システムでは機能しない可能性があります。

1
Edin Guso