Qt GUIにおけるペイントデバイスの情報取得:QPaintDevice::metric()の解説


QPaintDevice::metric() 関数は、ペイントデバイスに関する情報を取得するために使用されます。ペイントデバイスとは、描画操作の対象となるオブジェクトを表すクラスです。Qt GUIでは、様々な種類のペイントデバイスが使用されます。

機能

QPaintDevice::metric() 関数は、引数として PaintDeviceMetric 型の値を受け取ります。PaintDeviceMetric 型は、ペイントデバイスに関する様々な情報を定義する列挙型です。この関数は以下の情報を返すことができます。

  • デバイスのペイントエンジン
  • デバイスのクリップ領域
  • デバイスの物理的なDPI (ドット/インチ)
  • デバイスの論理的なDPI (ドット/インチ)
  • デバイスの物理的な高さ (ミリメートル単位)
  • デバイスの物理的な幅 (ミリメートル単位)
  • デバイスの高さ (ピクセル単位)
  • デバイスの幅 (ピクセル単位)

以下のコードは、ペイントデバイスの幅と高さを取得する例です。

QPaintDevice *device;
int width = device->metric(QPaintDevice::PaintDeviceMetric::PaintDeviceWidth);
int height = device->metric(QPaintDevice::PaintDeviceMetric::PaintDeviceHeight);

注意点

QPaintDevice::metric() 関数は、すべてのペイントデバイスでサポートされているわけではありません。サポートされていないペイントデバイスの場合、この関数は無効な値を返す可能性があります。

QPaintDevice::metric() 関数は、ペイントデバイスに関する情報を取得する以外にも、様々な用途に使用できます。例えば、デバイスのクリップ領域を調整したり、デバイスのペイントエンジンを取得したりすることができます。



#include <QApplication>
#include <QPainter>
#include <QWidget>

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

  // ウィジェットを作成
  QWidget widget;
  widget.resize(200, 100);
  widget.show();

  // ペイントデバイスを取得
  QPaintDevice *device = widget.paintDevice();

  // デバイスの幅と高さを取得
  int width = device->metric(QPaintDevice::PaintDeviceMetric::PaintDeviceWidth);
  int height = device->metric(QPaintDevice::PaintDeviceMetric::PaintDeviceHeight);

  // 取得した情報を表示
  qDebug() << "デバイスの幅:" << width;
  qDebug() << "デバイスの高さ:" << height;

  return app.exec();
}

例2: デバイスの物理的な幅と高さを取得する

#include <QApplication>
#include <QPainter>
#include <QWidget>

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

  // ウィジェットを作成
  QWidget widget;
  widget.resize(200, 100);
  widget.show();

  // ペイントデバイスを取得
  QPaintDevice *device = widget.paintDevice();

  // デバイスの物理的な幅と高さを取得
  int physicalWidth = device->metric(QPaintDevice::PaintDeviceMetric::PhysicalDeviceWidth);
  int physicalHeight = device->metric(QPaintDevice::PaintDeviceMetric::PhysicalDeviceHeight);

  // 取得した情報を表示
  qDebug() << "デバイスの物理的な幅:" << physicalWidth;
  qDebug() << "デバイスの物理的な高さ:" << physicalHeight;

  return app.exec();
}

例3: デバイスの論理的なDPIを取得する

#include <QApplication>
#include <QPainter>
#include <QWidget>

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

  // ウィジェットを作成
  QWidget widget;
  widget.resize(200, 100);
  widget.show();

  // ペイントデバイスを取得
  QPaintDevice *device = widget.paintDevice();

  // デバイスの論理的なDPIを取得
  int logicalDpi = device->metric(QPaintDevice::PaintDeviceMetric::LogicalDeviceDpiX);

  // 取得した情報を表示
  qDebug() << "デバイスの論理的なDPI:" << logicalDpi;

  return app.exec();
}
#include <QApplication>
#include <QPainter>
#include <QWidget>

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

  // ウィジェットを作成
  QWidget widget;
  widget.resize(200, 100);
  widget.show();

  // ペイントデバイスを取得
  QPaintDevice *device = widget.paintDevice();

  // デバイスのクリップ領域を取得
  QRect clipRect = device->metric(QPaintDevice::PaintDeviceMetric::ClipRect);

  // 取得したクリップ領域を表示
  qDebug() << "クリップ領域:" << clipRect;

  return app.exec();
}


QPainter::device() 関数と QPainter::property() 関数の組み合わせ

QPainter::device() 関数は、現在のペイント操作で使用されているペイントデバイスを取得します。QPainter::property() 関数は、ペイントデバイスに関する様々な属性を取得するために使用できます。この2つの関数を組み合わせることで、QPaintDevice::metric() 関数と同等の情報を取得することができます。

QPainter painter;
painter.begin(widget);

// デバイスの幅と高さを取得
int width = painter.device()->property(QPaintDevice::PaintDeviceMetric::PaintDeviceWidth).toInt();
int height = painter.device()->property(QPaintDevice::PaintDeviceMetric::PaintDeviceHeight).toInt();

// ...

painter.end();

QPaintEngine::metric() 関数

QPaintEngine::metric() 関数は、ペイントエンジンに関する情報を取得するために使用できます。ペイントエンジンは、ペイントデバイスの描画機能を提供するクラスです。QPaintDevice::metric() 関数はペイントデバイスに関する情報を取得しますが、QPaintEngine::metric() 関数はペイントエンジンの機能に特化した情報を取得することができます。

QPaintDevice *device = widget.paintDevice();
QPaintEngine *engine = device->paintEngine();

// デバイスの論理的なDPIを取得
int logicalDpi = engine->metric(QPaintEngine::PaintEngineMetric::LogicalDpiX);

デバイス固有の関数

一部のペイントデバイスは、QPaintDevice::metric() 関数で取得できない情報を提供する独自の関数を持っています。例えば、QPrinter クラスには、プリンターに関する情報を取得する printerRect() 関数があります。

QPrinter printer;

// プリンターの用紙の幅と高さを取得
int width = printer.printerRect(QPrinter::PrinterRect::PageRect).width();
int height = printer.printerRect(QPrinter::PrinterRect::PageRect).height();

外部ライブラリ

Qt以外のライブラリを使用している場合は、そのライブラリにペイントデバイスに関する情報を取得するための独自の関数がある可能性があります。