もう迷わない!QtのQWidget::geometry徹底解説と実例で学ぶUIコントロール

2025-05-27

QWidget::geometry とは

QWidget::geometry() は、QtのGUIプログラミングにおいて、ウィジェット(画面上の部品、例えばボタン、テキストボックス、ウィンドウなど)のサイズと位置に関する情報を提供する重要な関数です。

より具体的には、geometry()QRect 型の値を返します。この QRect オブジェクトには、以下の情報が含まれています。

  • 高さ (height()): ウィジェットの高さ。
  • 幅 (width()): ウィジェットの幅。
  • Y座標 (y()): ウィジェットの左上隅のY座標。
  • X座標 (x()): ウィジェットの左上隅のX座標。

これらの座標は、親ウィジェットのクライアント領域(フレームやタイトルバーを含まない、実際に描画される領域)に対する相対座標で表現されます。もしウィジェットがトップレベルウィンドウ(親を持たないウィンドウ)である場合は、デスクトップ(スクリーン)に対する相対座標となります。

なぜ重要なのか?

QWidget::geometry は、ウィジェットのレイアウトや表示を制御する上で非常に重要です。

  • イベントハンドリング: マウスイベントなどで、ウィジェットのどの部分がクリックされたかを判断する際に、ウィジェットの幾何学的な情報が必要になることがあります。
  • サイズ調整: ウィジェットの現在のサイズを知り、それに基づいて他のウィジェットのサイズを調整したり、描画処理を行ったりする際に利用します。
  • ウィジェットの配置: 特定の場所にウィジェットを配置したい場合、setGeometry() 関数を使って geometry() が返すような QRect を設定します。

類似の関数との違い

QWidget には、geometry() の他にもウィジェットのサイズや位置に関する情報を提供する関数がいくつかありますので、混同しないように注意が必要です。

  • contentsRect(): ウィジェットのパディングやマージンを除いた、コンテンツが描画される実際の領域を QRect で返します。
  • frameGeometry(): ウィジェットのフレーム(タイトルバーやウィンドウの境界線など)を含めた全体のサイズと位置を QRect で返します。geometry() がクライアント領域のみを指すのに対し、frameGeometry() は装飾部分も含みます。特にトップレベルウィンドウの場合、geometry()frameGeometry() の返す矩形は異なります。
  • size(): ウィジェットの幅と高さのみを QSize で返します。位置は含まれません。
  • pos(): ウィジェットの左上隅の位置(X, Y座標)のみを QPoint で返します。幅と高さは含まれません。
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <iostream>

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

    // メインウィンドウを作成
    QWidget window;
    window.setWindowTitle("Geometry Example");
    window.resize(400, 300); // ウィンドウの初期サイズを設定

    // ボタンを作成し、ウィンドウを親に設定
    QPushButton button("Click Me", &window);
    button.setGeometry(50, 50, 100, 30); // ボタンの位置とサイズを設定 (親ウィンドウのクライアント領域に対する相対座標)

    // ウィンドウを表示
    window.show();

    // ウィンドウとボタンのgeometry情報を取得して出力
    QRect windowGeometry = window.geometry();
    std::cout << "Window Geometry: "
              << "X=" << windowGeometry.x()
              << ", Y=" << windowGeometry.y()
              << ", Width=" << windowGeometry.width()
              << ", Height=" << windowGeometry.height()
              << std::endl;

    QRect buttonGeometry = button.geometry();
    std::cout << "Button Geometry: "
              << "X=" << buttonGeometry.x()
              << ", Y=" << buttonGeometry.y()
              << ", Width=" << buttonGeometry.width()
              << ", Height=" << buttonGeometry.height()
              << std::endl;

    return a.exec();
}

上記のコードを実行すると、コンソールには以下のような出力が表示されます(具体的な数値は実行環境によって異なる場合がありますが、概念は同じです)。

Window Geometry: X=xxx, Y=yyy, Width=400, Height=300
Button Geometry: X=50, Y=50, Width=100, Height=30
  • button.geometry() は、親であるwindowのクライアント領域の左上からの相対位置(X=50, Y=50)と、設定した幅(100)と高さ(30)を示します。
  • window.geometry() は、デスクトップ上のウィンドウの位置とサイズを示します。初期設定で幅400、高さ300に設定した値が反映されています。


QWidget::geometry はウィジェットのサイズと位置を扱う上で非常に重要な概念ですが、それゆえに誤解や間違いも発生しやすい部分です。ここでは、よくある問題とその解決策を説明します。

レイアウト(QLayout)を使っているのに setGeometry() が効かない

よくある間違い
レイアウト(QVBoxLayout, QHBoxLayout, QGridLayout など)を使用しているウィジェットに対して、setGeometry() を呼び出してサイズや位置を設定しようとする。

問題の発生理由
Qtのレイアウトシステムは、ウィジェットのサイズと位置を自動的に管理します。一度ウィジェットがレイアウトに追加されると、そのウィジェットのジオメトリはレイアウトによって決定されます。そのため、手動でsetGeometry()を呼び出しても、レイアウトによって上書きされてしまい、意図したように動作しません。

トラブルシューティング

  • レイアウトを一時的に無効にする: レアケースですが、レイアウトの自動管理を一時的に停止して手動でジオメトリを設定する必要がある場合は、layout()->setEnabled(false) のようにレイアウトを無効にすることもできますが、これは推奨されません。通常はレイアウトシステムを正しく利用すべきです。
  • setFixedSize()setMinimumSize() を使用する: 特定のウィジェットに固定サイズや最小サイズを設定したい場合は、setFixedSize()setMinimumSize() を使用します。これらはレイアウトの制約として機能し、レイアウトがそのウィジェットのサイズを決定する際に考慮されます。
  • レイアウトを使用する: レイアウトを使用している場合は、setGeometry() を直接呼び出すのではなく、レイアウトの持つ機能(例: addStretch(), setContentsMargins(), setSpacing(), setAlignment() など)や、ウィジェットのサイズポリシー (setSizePolicy()) を利用して、望むレイアウトを実現します。

ウィジェットが表示されない、または期待しない位置に表示される

よくある間違い

  • トップレベルウィンドウと子ウィジェットのジオメトリの違いを理解していない。
  • 親ウィジェットとの相対座標を誤解している。
  • show() を呼び出す前に setGeometry() を呼び出している。

問題の発生理由

  • トップレベルウィンドウの場合、geometry() はクライアント領域のサイズと位置を返しますが、frameGeometry() はタイトルバーやフレームを含んだ全体のサイズと位置を返します。この違いを考慮しないと、計算が狂うことがあります。
  • geometry() が返す値は親ウィジェットのクライアント領域に対する相対座標です。親がいない場合はデスクトップに対する相対座標になります。この相対関係を誤解していると、意図しない位置に表示されます。
  • ウィジェットが実際に画面に描画される前にジオメトリを設定しても、OSやウィンドウシステムによって初期化される際に設定が上書きされることがあります。

トラブルシューティング

  • QApplication::processEvents() の利用: 特定の状況下で、setGeometry() の呼び出し後にすぐに変更が反映されない場合、QApplication::processEvents() を呼び出すことで、イベントキューを処理し、再描画を強制することができます。ただし、これはデバッグ目的や非常に特殊なケースに限るべきで、頻繁な使用はパフォーマンスに影響を与えます。
  • 座標系の理解:
    • QWidget::geometry(): 親ウィジェットのクライアント領域に対する相対座標。
    • QWidget::frameGeometry(): 親ウィジェットのクライアント領域に対する相対座標で、ウィジェットのフレーム部分(タイトルバー、ボーダーなど)を含んだ全体のサイズと位置。
    • QWidget::pos(): geometry().topLeft() と同じ。
    • トップレベルウィンドウの場合、geometry() はデスクトップに対する相対座標、frameGeometry() もデスクトップに対する相対座標でフレームを含む。
  • show() の後に設定する: show() を呼び出した後、またはshowEvent() をオーバーライドしてその中でジオメトリを設定すると、より確実に反映される場合があります。

ウィジェットのサイズが動的に変更されない(resizeEvent の問題)

よくある間違い
ウィジェットのサイズが変更されたときに、子ウィジェットのレイアウトや描画を適切に更新しない。

問題の発生理由
親ウィジェットのサイズが変更された場合、その子ウィジェットのジオメトリは自動的に更新されません。特にカスタムウィジェットを作成している場合、resizeEvent() をオーバーライドして、その中で子ウィジェットのsetGeometry()を呼び出したり、描画ロジックを更新したりする必要があります。

トラブルシューティング

  • update() または repaint() の呼び出し: 描画内容もサイズ変更に合わせて更新する必要がある場合は、update()(イベントループで再描画をスケジュール)または repaint()(即座に再描画)を呼び出します。通常は update() が推奨されます。
  • resizeEvent(QResizeEvent *event) のオーバーライド: カスタムウィジェットで、親ウィジェットのサイズ変更に対応して子ウィジェットの配置を調整する必要がある場合は、resizeEvent をオーバーライドし、その中で setGeometry() や再計算ロジックを実装します。

DPIスケール(高DPIディスプレイ)での問題

よくある間違い
ピクセル単位で固定値を設定しているため、高DPIディスプレイでUIが小さすぎたり、ぼやけて表示されたりする。

問題の発生理由
Retinaディスプレイなどの高DPI環境では、物理ピクセルと論理ピクセル(デバイス非依存ピクセル)が異なります。Qtはデフォルトで高DPIスケーリングに対応していますが、明示的にピクセル値を指定すると、スケーリングが正しく行われないことがあります。

トラブルシューティング

  • QScreen::devicePixelRatio() の利用: 必要に応じて、現在のスクリーンのデバイスピクセル比率を取得し、それに基づいてサイズや座標を調整します。ただし、これは最後の手段として考慮すべきです。
  • レイアウトを優先する: 手動でsetGeometry()を設定するよりも、レイアウトを使用してウィジェットを配置する方が、高DPI環境でのスケーリングが正しく行われやすくなります。
  • QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); の設定: アプリケーションの開始時にこの属性を設定することで、Qtが高DPIスケーリングを自動的に有効にします。

setGeometry() が QWidget::show() の前に動作しない、または奇妙な動作をする

よくある間違い
ウィジェットがまだ表示されていない状態で、setGeometry() を呼び出しても、その変更が即座に反映されない、または予測できない挙動をする。

問題の発生理由
Qtのウィジェットは、show() が呼び出されて初めて、OSのウィンドウシステムに自身の存在を通知し、実際に描画可能な状態になります。それ以前にジオメトリを設定しても、内部的な状態がまだ不安定なため、意図したように適用されないことがあります。

トラブルシューティング

  • adjustSize() の利用: ウィジェットの内容に基づいて最適なサイズに調整したい場合は、adjustSize() を呼び出すことができます。これはウィジェットの sizeHint() に基づいてサイズを設定します。
  • show() の後にジオメトリを設定する: 可能な限り、show() を呼び出した後に setGeometry() を使用するようにします。

QWidget::geometry のトラブルシューティングのほとんどは、レイアウトシステムの理解不足座標系の誤解ウィジェットのライフサイクル(特に show()resizeEvent())への意識不足に起因します。



QWidget::geometry はウィジェットの位置とサイズを管理するための中心的な機能です。ここでは、その様々な使い方を示すコード例を挙げます。

ウィジェットの初期位置とサイズを手動で設定する

これは最も基本的な使用例です。レイアウトマネージャーを使用せず、ウィジェットの表示位置とサイズを直接指定します。

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <iostream>

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

    // メインウィンドウを作成
    QWidget mainWindow;
    mainWindow.setWindowTitle("Manual Geometry Example");
    // mainWindow.setGeometry(100, 100, 600, 400); // ウィンドウの位置とサイズを直接設定

    // 注: QWidget::show() の前にsetGeometry()を呼ぶと、
    // OSのウィンドウマネージャーによって初期位置が調整されることがあります。
    // そのため、ウィンドウの初期表示位置を厳密に制御したい場合は、
    // show() の後に move() を使うか、frameGeometry() との兼ね合いを考慮する必要があります。
    mainWindow.show(); // 先にウィンドウを表示

    // ウィンドウの左上隅をスクリーン座標で(100, 100)に移動し、サイズを600x400に設定
    // show() の後に呼び出すことで、より確実に反映されます。
    mainWindow.setGeometry(100, 100, 600, 400); 

    // ボタンを作成し、親をmainWindowに設定
    QPushButton *button1 = new QPushButton("Button 1", &mainWindow);
    // ボタンの位置とサイズをmainWindowのクライアント領域に対する相対座標で設定
    button1->setGeometry(50, 50, 120, 40); 

    QPushButton *button2 = new QPushButton("Button 2", &mainWindow);
    button2->setGeometry(200, 100, 150, 50);

    // ウィンドウのジオメトリ情報を取得して出力
    QRect mainWinGeo = mainWindow.geometry();
    std::cout << "Main Window Geometry: X=" << mainWinGeo.x() 
              << ", Y=" << mainWinGeo.y() 
              << ", Width=" << mainWinGeo.width() 
              << ", Height=" << mainWinGeo.height() << std::endl;

    QRect button1Geo = button1->geometry();
    std::cout << "Button 1 Geometry: X=" << button1Geo.x() 
              << ", Y=" << button1Geo.y() 
              << ", Width=" << button1Geo.width() 
              << ", Height=" << button1Geo.height() << std::endl;

    return a.exec();
}

ウィンドウのリサイズイベントで子ウィジェットのジオメトリを動的に変更する

カスタムウィジェットや、レイアウトマネージャーを使わずに複雑なUIを構築する場合、親ウィジェットのサイズ変更に合わせて子ウィジェットのジオメトリを調整する必要があります。これはresizeEventをオーバーライドすることで実現します。

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QResizeEvent>
#include <iostream>

// カスタムウィジェット
class ResizableWidget : public QWidget {
public:
    ResizableWidget(QWidget *parent = nullptr) : QWidget(parent) {
        // 2つのボタンを作成
        button1 = new QPushButton("Top-Left", this);
        button2 = new QPushButton("Bottom-Right", this);

        setWindowTitle("Resizable Widget Example");
        setMinimumSize(200, 150); // 最小サイズを設定
    }

protected:
    // リサイズイベントをオーバーライド
    void resizeEvent(QResizeEvent *event) override {
        // 親クラスのresizeEventを呼び出す(推奨)
        QWidget::resizeEvent(event);

        // 新しいサイズを取得
        int newWidth = event->size().width();
        int newHeight = event->size().height();

        // ボタンのジオメトリを新しいサイズに基づいて設定
        // 左上のボタン: 常に左上隅に固定、サイズは固定
        button1->setGeometry(10, 10, 100, 30); 

        // 右下のボタン: ウィジェットの右下隅に追従、サイズは固定
        // 右端から20px、下端から20pxの余白
        button2->setGeometry(newWidth - 120, newHeight - 50, 110, 40); 

        std::cout << "Widget resized to: " << newWidth << "x" << newHeight << std::endl;
        std::cout << "Button 1 pos: (" << button1->x() << ", " << button1->y() << ")" << std::endl;
        std::cout << "Button 2 pos: (" << button2->x() << ", " << button2->y() << ")" << std::endl;
    }

private:
    QPushButton *button1;
    QPushButton *button2;
};

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

    ResizableWidget widget;
    widget.resize(400, 300); // 初期サイズを設定
    widget.show();

    return a.exec();
}

このコードを実行し、ウィンドウをリサイズすると、コンソールに新しいサイズとボタンの位置が出力され、ボタンがウィンドウの隅に追従する様子が確認できます。

geometry() と他のジオメトリ関連関数の比較

geometry(), frameGeometry(), pos(), size(), rect() の違いを理解するための例です。

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QLabel>
#include <QDebug> // qApp->postEvent を使うために必要

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

    QMainWindow mainWindow;
    mainWindow.setWindowTitle("Geometry Comparison");
    mainWindow.setGeometry(100, 100, 500, 300); // メインウィンドウの位置とサイズを設定

    QLabel *label = new QLabel("Hello Qt!", &mainWindow);
    label->setGeometry(50, 50, 200, 50); // ラベルの位置とサイズを設定

    mainWindow.show();

    // QMainWindow はトップレベルウィジェットなので、フレームを含んだジオメトリとそうでないものが異なります。
    // QLabel は子ウィジェットなので、frameGeometry() と geometry() は通常同じになります。

    qDebug() << "--- Main Window Geometry ---";
    qDebug() << "geometry():    " << mainWindow.geometry();      // クライアント領域 (x,y,width,height)
    qDebug() << "frameGeometry():" << mainWindow.frameGeometry(); // フレームを含む全体 (x,y,width,height)
    qDebug() << "pos():         " << mainWindow.pos();           // 左上隅の座標 (x,y)
    qDebug() << "size():        " << mainWindow.size();          // サイズ (width,height)
    qDebug() << "rect():        " << mainWindow.rect();          // (0,0,width,height) - クライアント領域の矩形

    qDebug() << "\n--- Label Geometry (Child Widget) ---";
    qDebug() << "geometry():    " << label->geometry();
    qDebug() << "frameGeometry():" << label->frameGeometry(); // 子ウィジェットの場合、通常 geometry() と同じ
    qDebug() << "pos():         " << label->pos();
    qDebug() << "size():        " << label->size();
    qDebug() << "rect():        " << label->rect();

    return a.exec();
}

このコードを実行すると、コンソールにそれぞれの関数の出力が表示され、QMainWindow(トップレベルウィジェット)とQLabel(子ウィジェット)で、ジオメトリ関連の関数がどのように異なる値を示すかがわかります。

  • rect() は常に(0,0,width,height)を返します。これはウィジェット自身のローカル座標系における矩形を表します。
  • QLabel の場合、geometry()frameGeometry() は同じ結果を返します。これは、子ウィジェットには独自のウィンドウフレームがないためです。
  • QMainWindow の場合、geometry()frameGeometry()x, yは通常、タイトルバーとフレームの厚さ分異なります。width()height()も異なります。


QWidget::geometry はウィジェットの絶対的な位置とサイズを設定する際に使用されますが、多くのQtアプリケーションでは、以下の代替手段が推奨されます。

レイアウトマネージャー (QLayout クラスとその派生クラス)

主なクラス

  • QStackedLayout: 複数のウィジェットを重ねて表示し、一度に1つだけを表示する。
  • QFormLayout: ラベルと入力フィールドのペアなど、フォーム形式のレイアウトに適している。
  • QGridLayout: ウィジェットをグリッド(行と列)形式で並べる。
  • QHBoxLayout: ウィジェットを水平方向に並べる。
  • QVBoxLayout: ウィジェットを垂直方向に並べる。

利点

  • 国際化対応
    テキストの長さが変わってもレイアウトが自動調整されます。
  • クロスプラットフォーム対応
    OSやデスクトップ環境の違いによるUIのずれを吸収します。
  • 保守性の向上
    開発者が手動で座標計算を行う必要がなくなり、コードが簡潔になります。
  • レスポンシブデザイン
    ウィンドウのリサイズやフォントサイズの変更など、様々な環境の変化に自動的に対応します。

使用例

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QLabel>

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

    QWidget window;
    window.setWindowTitle("Layout Manager Example");

    // 垂直ボックスレイアウトを作成
    QVBoxLayout *mainLayout = new QVBoxLayout(&window); // window に直接設定

    // 水平ボックスレイアウトを作成し、ボタンを追加
    QHBoxLayout *buttonLayout = new QHBoxLayout();
    buttonLayout->addWidget(new QPushButton("OK"));
    buttonLayout->addWidget(new QPushButton("Cancel"));

    // メインレイアウトにウィジェットとレイアウトを追加
    mainLayout->addWidget(new QLabel("Enter your name:"));
    mainLayout->addWidget(new QLineEdit());
    mainLayout->addLayout(buttonLayout); // 作成した水平レイアウトを追加

    // setGeometry() は不要。レイアウトが自動的にサイズと位置を決定
    window.show(); 

    return a.exec();
}

サイズポリシー (QSizePolicy)

主な設定値

  • QSizePolicy::Ignored: レイアウトがサイズを無視し、利用可能なスペースをすべて使用しようとする。
  • QSizePolicy::MinimumExpanding: MinimumExpanding の組み合わせ。
  • QSizePolicy::Expanding: 利用可能なスペースを最大限に利用しようとし、他のExpandingウィジェットとスペースを分け合う。
  • QSizePolicy::Preferred: sizeHint() が好ましいサイズだが、拡大・縮小可能。
  • QSizePolicy::Maximum: sizeHint() と同じサイズだが、それ以下に縮小可能。
  • QSizePolicy::Minimum: sizeHint() と同じサイズだが、それ以上に拡大可能。
  • QSizePolicy::Fixed: ウィジェットの sizeHint() が返す固定サイズ。

利点

  • ウィジェットの伸縮性を定義できる。
  • レイアウトマネージャーの動作をより細かく制御できる。

使用例

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QPushButton>

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

    QWidget window;
    window.setWindowTitle("Size Policy Example");

    QHBoxLayout *layout = new QHBoxLayout(&window);

    QPushButton *btn1 = new QPushButton("Fixed Button");
    btn1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); // 固定サイズ

    QPushButton *btn2 = new QPushButton("Expanding Button");
    btn2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); // 可能な限り広がる

    QPushButton *btn3 = new QPushButton("Preferred Button");
    btn3->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // 優先サイズ

    layout->addWidget(btn1);
    layout->addWidget(btn2);
    layout->addWidget(btn3);

    window.show();

    return a.exec();
}

この例では、btn2 がウィンドウのリサイズに合わせて伸縮するのに対し、btn1 は固定サイズを保ちます。

サイズヒント (sizeHint()) と最小・最大サイズ (minimumSizeHint(), setMinimumSize(), setMaximumSize())

  • setFixedSize(): 最小サイズと最大サイズを同じ値に設定することで、固定サイズにします。
  • setMaximumSize(): ウィジェットの最大サイズを明示的に設定します。これより大きくはなりません。
  • setMinimumSize(): ウィジェットの最小サイズを明示的に設定します。これより小さくはなりません。
  • minimumSizeHint(): ウィジェットが機能するために必要な最小サイズを返します。

利点

  • ウィジェットが不適切なサイズになるのを防ぐ。
  • ウィジェットのコンテンツに合わせて最適なサイズを自動的に調整できる。

使用例

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QLabel>

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

    QWidget window;
    window.setWindowTitle("Size Hint Example");

    QVBoxLayout *layout = new QVBoxLayout(&window);

    QLabel *label1 = new QLabel("A relatively short text.");
    // デフォルトでQLabelはsizeHint()を適切に実装しているため、明示的な設定は不要なことが多い
    // label1->sizeHint() はテキストの長さに応じたサイズを返す

    QLabel *label2 = new QLabel("This is a much longer text that will wrap if the width is too small.");
    label2->setWordWrap(true); // テキストを折り返す設定

    QPushButton *button = new QPushButton("Fixed Size Button");
    button->setFixedSize(150, 40); // ボタンのサイズを固定

    layout->addWidget(label1);
    layout->addWidget(label2);
    layout->addWidget(button);

    window.show();

    // QLabelのsizeHint()は、テキストの内容に基づいて決定される
    // 例: label1->sizeHint()は短文なので小さく、label2->sizeHint()は長く、折り返し設定によって高さが調整される可能性がある。
    // button->sizeHint()はQPushButtonのデフォルトサイズだが、setFixedSize()で上書きされている。

    return a.exec();
}

イベントハンドリング (moveEvent, resizeEvent)

利点

  • カスタム描画や子ウィジェットの再配置など、特定の状況下での調整が可能。
  • ウィジェットの動的な振る舞いを実装できる。

使用例
(上記「2. ウィンドウのリサイズイベントで子ウィジェットのジオメトリを動的に変更する」の例を参照)