Qt GUIプログラミング:QIcon::availableSizes()でアイコンのサイズを自由自在に取得する方法


QIcon::availableSizes()は、QIconオブジェクトが持つピクセルマップの利用可能なサイズをリストで返します。この関数は、QIconオブジェクトがどのようにスケーリングされるかを理解するのに役立ちます。

戻り値

QIcon::availableSizes()は、QSize型のリストを返します。リスト内の各要素は、ピクセルマップの幅と高さを表します。

引数

QIcon::availableSizes()は、以下の2つの引数を取ります。

  • state: QIcon::State型の値。この値は、ピクセルマップの状態を指定します。デフォルト値はQIcon::Offです。
  • mode: QIcon::Mode型の値。この値は、ピクセルマップのモードを指定します。デフォルト値はQIcon::Normalです。

QIcon icon(":/images/icon.png");
QList<QSize> sizes = icon.availableSizes();

for (const QSize& size : sizes) {
    qDebug() << size.width() << size.height();
}

このコードは、"icon.png"という名前のアイコンファイルからQIconオブジェクトを作成し、その利用可能なサイズをすべてコンソールに出力します。

  • QIconオブジェクトから特定サイズのピクセルマップを取得するには、QIcon::pixmap()関数を使用します。
  • QIcon::availableSizes()は、ピクセルマップの実際のサイズを返します。QIconオブジェクトがスケーリングされると、ピクセルマップのサイズは変更される可能性があります。
  • QIcon::availableSizes()は、すべてのQIconオブジェクトで利用できるとは限りません。たとえば、SVGアイコンの場合は、この関数が空のリストを返す場合があります。


#include <QApplication>
#include <QIcon>

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

    QIcon icon(":/images/icon.png");
    QList<QSize> sizes = icon.availableSizes();

    for (const QSize& size : sizes) {
        qDebug() << size.width() << size.height();
    }

    return app.exec();
}

例2:特定サイズのピクセルマップを取得する

#include <QApplication>
#include <QIcon>
#include <QLabel>

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

    QIcon icon(":/images/icon.png");
    QSize desiredSize(32, 32);

    if (icon.hasSize(desiredSize)) {
        QLabel label;
        label.setPixmap(icon.pixmap(desiredSize));
        label.show();
    } else {
        qDebug() << "Icon does not have size" << desiredSize;
    }

    return app.exec();
}

このコードは、"icon.png"という名前のアイコンファイルからQIconオブジェクトを作成し、32x32ピクセルのピクセルマップを取得します。ピクセルマップが存在する場合は、ピクセルマップをQLabelウィジェットに設定して表示します。

例3:利用可能なサイズのリストをフィルタリングする

#include <QApplication>
#include <QIcon>
#include <QDebug>

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

    QIcon icon(":/images/icon.png");
    QList<QSize> sizes = icon.availableSizes();

    QList<QSize> filteredSizes;
    for (const QSize& size : sizes) {
        if (size.width() == size.height()) {
            filteredSizes.append(size);
        }
    }

    qDebug() << "Available square sizes:";
    for (const QSize& size : filteredSizes) {
        qDebug() << size;
    }

    return app.exec();
}

このコードは、"icon.png"という名前のアイコンファイルからQIconオブジェクトを作成し、利用可能な四角いサイズのリストを出力します。

これらの例は、QIcon::availableSizes()関数を使用して、QIconオブジェクトが持つピクセルマップの利用可能なサイズを処理する方法を示しています。

  • 利用可能なサイズに基づいてピクセルマップをスケーリングする
  • 利用可能な最大サイズまたは最小サイズを取得する
  • 特定のモードまたは状態の利用可能なサイズを取得する


  • ピクセルマップの実際のサイズを返します。QIconオブジェクトがスケーリングされると、ピクセルマップのサイズは変更される可能性があります。
  • すべてのQIconオブジェクトで利用できるとは限りません。たとえば、SVGアイコンの場合は、この関数が空のリストを返す場合があります。

これらの制限を回避するために、QIcon::availableSizes()の代替方法をいくつか検討することができます。

QPixmap::scaledSize()を使用する

QIcon::availableSizes()の代わりに、QIconオブジェクトからピクセルマップを取得し、QPixmap::scaledSize()関数を使用して利用可能なサイズを計算することができます。この方法は、すべてのQIconオブジェクトで利用でき、スケーリングされたピクセルマップのサイズも考慮することができます。

QIcon icon(":/images/icon.png");
QPixmap pixmap = icon.pixmap();

QList<QSize> sizes;
for (int width = 16; width <= 256; width *= 2) {
    for (int height = width; height <= width; height *= 2) {
        sizes.append(pixmap.scaledSize(QSize(width, height), Qt::KeepAspectRatio));
    }
}

このコードは、"icon.png"という名前のアイコンファイルからQIconオブジェクトを作成し、16x16ピクセルから256x256ピクセルまでのすべての利用可能なサイズをリストに格納します。

カスタムロジックを使用する

QIcon::availableSizes()の代替方法として、カスタムロジックを使用することもできます。この方法は、より柔軟性がありますが、複雑になる可能性もあります。

たとえば、アイコンをさまざまなサイズにスケーリングする必要がある場合は、次のようなカスタムロジックを使用できます。

QList<QSize> availableSizes;

for (int width = 16; width <= 256; width *= 2) {
    for (int height = width; height <= width; height *= 2) {
        QImage image = icon.pixmap().toImage();
        QImage scaledImage = image.scaled(QSize(width, height), Qt::KeepAspectRatio);
        availableSizes.append(scaledImage.size());
    }
}

サードパーティのライブラリを使用する

QIcon::availableSizes()は、便利な関数ですが、いくつかの制限があります。これらの制限を回避するために、QPixmap::scaledSize()を使用する、カスタムロジックを使用する、サードパーティのライブラリを使用するなどの代替方法を検討することができます。