アイコンのサイズを自由自在に操る魔法の杖:Qt GUIプログラミングにおけるQIconEngine::actualSize()


QIconEngine::actualSize()は、Qt GUIにおけるアイコンエンジンが指定されたサイズ、モード、状態に対して提供する実際のアイコンサイズを返します。アイコンエンジンは、アイコンの描画を担当するクラスです。各アイコンには対応するアイコンエンジンがあり、要求されたサイズ、モード、状態に基づいてアイコンを描画します。

引数

  • state: アイコンの状態(QIcon::OffQIcon::OnQIcon::Disabledなど)
  • mode: アイコンのモード(QIcon::NormalQIcon::SelectedQIcon::Activeなど)
  • size: 要求されたアイコンサイズ

戻り値

実際のアイコンサイズ

デフォルト実装

デフォルトの実装では、渡されたサイズをそのまま返します。つまり、アイコンエンジンはサイズの変更を行いません。

使用例

QSize requestedSize(32, 32);
QIcon::Mode mode = QIcon::Normal;
QIcon::State state = QIcon::Off;

QIconEngine *engine = new MyIconEngine();
QSize actualSize = engine->actualSize(requestedSize, mode, state);

// actualSize contains the actual size of the icon provided by the engine

この例では、MyIconEngineというクラスのインスタンスを作成し、actualSize()を使用して、要求されたサイズ、モード、状態に対してエンジンが提供する実際のアイコンサイズを取得しています。

  • QIconEngine::actualSize()は、アイコンを描画する前に実際のアイコンサイズを確認するために使用できます。これにより、スケーリングや配置を適切に行うことができます。
  • アイコンエンジンは、必要に応じてアイコンのスタイルとサイズを生成します。例えば、QIcon::Disabled状態のアイコンは、提供されたピクセルマップの1つをグレーアウトすることで生成される場合があります。


#include <QCoreApplication>
#include <QIcon>
#include <QIconEngine>
#include <QPainter>

class MyIconEngine : public QIconEngine
{
public:
    MyIconEngine() {}

    virtual QSize actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state) override
    {
        // 実際のアイコンサイズを計算する
        QSize actualSize = size;

        // モードや状態に応じて実際のアイコンサイズを調整する
        if (mode == QIcon::Selected) {
            actualSize *= 1.2;
        } else if (state == QIcon::Disabled) {
            actualSize *= 0.8;
        }

        return actualSize;
    }

    virtual void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) override
    {
        // アイコンを描画する
        painter->setPen(Qt::black);
        painter->drawRect(rect);

        // モードや状態に応じてアイコンを描画を調整する
        if (mode == QIcon::Selected) {
            painter->setBrush(Qt::red);
        } else if (state == QIcon::Disabled) {
            painter->setBrush(Qt::gray);
        }

        painter->fillRect(rect, painter->brush());
    }
};

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

    // アイコンエンジンを作成する
    QIconEngine *engine = new MyIconEngine();

    // アイコンを作成する
    QIcon icon(engine);

    // 要求されたサイズ、モード、状態を指定する
    QSize requestedSize(32, 32);
    QIcon::Mode mode = QIcon::Normal;
    QIcon::State state = QIcon::Off;

    // 実際のアイコンサイズを取得する
    QSize actualSize = engine->actualSize(requestedSize, mode, state);

    // 実際のアイコンサイズを出力する
    qDebug() << "Actual icon size:" << actualSize;

    // アイコンを描画する
    QPainter painter;
    painter.begin(QPixmap(actualSize));
    icon.paint(&painter, QRect(0, 0, actualSize));
    painter.end();

    // 描画されたアイコンを画面に表示する
    QLabel label;
    label.setPixmap(painter.pixmap());
    label.show();

    return app.exec();
}
  1. MyIconEngineというクラスを定義します。このクラスは、QIconEngineクラスを継承しており、actualSize()paint()という2つの仮想関数をオーバーライドしています。
  2. actualSize()関数では、要求されたサイズ、モード、状態に基づいて実際のアイコンサイズを計算します。この例では、モードがQIcon::Selectedの場合はアイコンサイズを1.2倍に、状態がQIcon::Disabledの場合は0.8倍に調整します。
  3. paint()関数では、アイコンを描画します。この例では、アイコンを黒色の四角形で囲み、モードがQIcon::Selectedの場合は赤色、状態がQIcon::Disabledの場合は灰色で塗りつぶします。
  4. main()関数では、MyIconEngineのインスタンスを作成し、アイコンエンジンとアイコンを作成します。次に、要求されたサイズ、モード、状態を指定し、実際のアイコンサイズを取得します。その後、実際のアイコンサイズとアイコンを描画し、画面に表示します。


QPixmap::scaledSize()`を使用する

QPixmap::scaledSize()は、ピクセルマップを指定されたサイズにスケーリングしたときのサイズを返します。アイコンをピクセルマップとして取得してから、この方法を使用して実際のサイズを取得できます。

QIcon icon(...);
QPixmap pixmap = icon.pixmap();
QSize actualSize = pixmap.scaledSize(requestedSize);

QPainter::boundingRect()`を使用する

QPainter::boundingRect()は、描画された図形の境界矩形を返します。アイコンを描画してから、この方法を使用して実際のサイズを取得できます。

QIcon icon(...);
QPainter painter;
QRect rect(0, 0, requestedSize);
painter.begin(&pixmap);
icon.paint(&painter, rect);
painter.end();
QSize actualSize = painter.boundingRect().size();

アイコンのサイズを直接設定する

アイコンのサイズを直接設定することもできます。ただし、この方法を使用すると、アイコンが異なるサイズで表示されたときにぼやけてしまう可能性があります。

QIcon icon(...);
icon.setSize(requestedSize);

それぞれの方法の利点と欠点

方法利点欠点
QIconEngine::actualSize()シンプルで使いやすい常に最適なサイズを返さない場合がある
QPixmap::scaledSize()常に正確なサイズを返すアイコンがぼやけてしまう可能性がある
QPainter::boundingRect()アイコンがぼやけない計算量が多い
アイコンのサイズを直接設定するシンプルで効率的アイコンがぼやけてしまう可能性がある

QIconEngine::actualSize()は、多くの場合において便利な方法ですが、状況によっては他の方法の方が適切な場合があります。それぞれの方法の利点と欠点を理解し、状況に応じて最適な方法を選択してください。

  • アイコンがぼやけてしまうのが気になる場合は、QPixmap::scaledSize()を使用するのがおすすめです。
  • アイコンのサイズがそれほど重要ではない場合は、アイコンのサイズを直接設定するのが最も効率的な方法です。
  • アイコンのサイズを正確に取得する必要がある場合は、QIconEngine::actualSize()を使用するのがおすすめです。