高DPIディスプレイ時代の必須スキル:QPaintDevice::physicalDpiX()でデバイス解像度を賢く使いこなす


QPaintDevice::physicalDpiX()関数は、Qt GUIにおける描画デバイスの物理的な水平解像度(ドット数/インチ)を取得するために使用されます。これは、画面のピクセル密度や印刷時の解像度などを考慮する際に役立ちます。

構文

int QPaintDevice::physicalDpiX() const;

戻り値

デバイスの物理的な水平解像度(ドット数/インチ)を整数値で返します。

詳細

physicalDpiX()関数は、デバイスの物理的な解像度を取得します。これは、画面のピクセル密度や印刷時の解像度などを考慮する際に役立ちます。例えば、高解像度の画面では、低解像度の画面よりも多くのピクセルが詰め込まれているため、physicalDpiX()関数はより大きな値を返します。

注意点

  • すべてのデバイスがphysicalDpiX()関数をサポートしているわけではありません。サポートされていないデバイスの場合は、0を返します。
  • physicalDpiX()関数は、デバイスの論理的な解像度(logicalDpiX()関数で取得可能)とは異なる場合があります。論理的な解像度は、オペレーティングシステムの設定などによって変更される可能性があるためです。
QPaintDevice *device;

int physicalDpiX = device->physicalDpiX();

if (physicalDpiX > 200) {
    // 高解像度のデバイスの場合
    // ...
} else {
    // 低解像度のデバイスの場合
    // ...
}


#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QLabel label("Hello, World!");
    label.setFont(QFont("Arial", 12)); // 初期フォントサイズ

    int physicalDpiX = label.paintDevice()->physicalDpiX();
    double fontScaleFactor = (double)physicalDpiX / 96.0; // 96dpiを基準とする

    QFont font = label.font();
    font.setPointSize(font.pointSize() * fontScaleFactor);
    label.setFont(font);

    label.show();

    return app.exec();
}

例2:印刷時の解像度に基づいて画像をスケーリングする

この例では、QPaintDevice::physicalDpiX()関数を使用して印刷時の解像度を取得し、それに基づいて画像をスケーリングします。

#include <QPainter>
#include <QImage>
#include <QPrinter>

int main() {
    QImage image("image.png");
    QPrinter printer;

    int physicalDpiX = printer.physicalDpiX();
    double scaleFactor = (double)physicalDpiX / image.physicalDpiX();

    QPainter painter(&printer);
    painter.scale(scaleFactor, scaleFactor);
    painter.drawImage(0, 0, image);

    painter.end();

    return 0;
}

これらの例はあくまでも基本的なものであり、状況に応じて様々な応用が可能です。

  • デバイス依存的なレイアウトを作成したい場合
  • 印刷時に画像の品質を維持したい場合
  • 異なるデバイス間でフォントサイズを統一したい場合


代替方法

  • デバイス固有の関数: 一部のデバイスは、physicalDpiX()関数とは異なる名前の関数で物理的な解像度を取得することができます。
  • QPrinter::physicalDpiX(): プリンターの物理的な水平解像度(ドット数/インチ)を取得します。印刷時に画像をスケーリングする必要がある場合などに役立ちます。
  • QScreen::logicalDpiX(): 画面の論理的な水平解像度(ドット数/インチ)を取得します。これは、オペレーティングシステムの設定などによって変更される可能性があるため、必ずしも物理的な解像度と一致するとは限りません。

各代替方法の詳細

  • QScreen::logicalDpiX(): この関数は、現在の画面の論理的な水平解像度を返します。論理的な解像度は、オペレーティングシステムの設定や画面のスケーリング設定によって変更される可能性があるため、必ずしも物理的な解像度と一致するとは限りません。しかし、画面全体にわたって一貫した解像度を取得したい場合は、この関数を使用するのが一般的です。
int logicalDpiX = QScreen::availableGeometry().logicalDpiX();
  • QPrinter::physicalDpiX(): この関数は、現在のプリンターの物理的な水平解像度を返します。印刷時に画像をスケーリングする必要がある場合は、この関数を使用してプリンターの解像度に合わせることができます。
int physicalDpiX = printer.physicalDpiX();
  • デバイス固有の関数: 一部のデバイスは、physicalDpiX()関数とは異なる名前の関数で物理的な解像度を取得することができます。例えば、QAndroidDevice クラスには、physicalDpi()関数があります。
int physicalDpi = QAndroidDevice::physicalDpi();

どの代替方法を使用すべきか

どの代替方法を使用するべきかは、状況によって異なります。

  • デバイス固有の解像度を取得する必要がある場合は、デバイス固有の関数を使用します。
  • 印刷時に画像をスケーリングする必要がある場合は、QPrinter::physicalDpiX()関数を使用します。
  • 画面全体にわたって一貫した解像度を取得したい場合は、QScreen::logicalDpiX()関数を使用します。

#include <QApplication>
#include <QLabel>
#include <QScreen>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QLabel label("Hello, World!");
    label.setFont(QFont("Arial", 12)); // 初期フォントサイズ

    // 画面解像度に基づいてフォントサイズを調整
    int logicalDpiX = QScreen::availableGeometry().logicalDpiX();
    double fontScaleFactor = (double)logicalDpiX / 96.0; // 96dpiを基準とする

    QFont font = label.font();
    font.setPointSize(font.pointSize() * fontScaleFactor);
    label.setFont(font);

    label.show();

    return app.exec();
}
  • デバイス固有の関数は、デバイスによって異なる名前や引数を持つ場合があります。詳細は、デバイスのドキュメントを参照してください。
  • すべてのデバイスがphysicalDpiX()関数とすべての代替方法をサポートしているわけではありません。サポートされていないデバイスの場合は、0を返します。