ボックスレイアウト

ボタンやラベルの配置を決めるのにsetGeometry関数で配置してしまうとウインドウの大きさが変えられた時に配置が大きく崩れることがあります。

そこでここではレイアウトクラスのうちでQBoxLayoutクラスを使ってみます。

QBoxLayoutクラスは1つの箱の中に部品を配置するレイアウトのことです。詳しくは下のQVBoxLayoutQHVoxLayoutの例を見てください。

QVBoxLayoutクラス

QVBoxLayoutのレイアウト例を紹介します。以下のソースとヘッダファイルを見てください。

MainWin_H.h
class MainWin : public QWidget
{
public:
    MainWin();

    void setBoxLay();
};

次がソースファイルです。

MainWin.cpp
#include "MainWin_H.h"

MainWin::MainWin()
{
    setWindowTitle("layout window");
    
    setGeometry(200, 200, 200, 300);
    QLabel* label1 = new QLabel("label1");
    QLabel* label2 = new QLabel("label2");
    QVBoxLayout* vbox = new QVBoxLayout;
    vbox->addWidget(label1);
    vbox->addWidget(label2);
    setLayout(vbox);
    show();
}

コンストラクタにレイアウトの記述をしました。では簡単にこのソースの説明をします。

初めにQVBoxLayoutですが、このクラスは部品を垂直な箱の中に配置するクラスです。メンバ関数である addWidget関数 により追加したい部品を追加します。また、レイアウトを適用するには setLayout にレイアウトクラスを渡します。

QHBoxLayoutクラス

QHBoxLayoutは部品を平行な箱に一列に並べるレイアウトクラスで、その点以外を除けばQVBoxLayoutクラスと使い方は全く同じです。

なので今紹介したソースのQVBoxLayoutQHBoxLayoutに変えるだけでレイアウトが垂直方向から平行方向に変更されます。

複数のレイアウト

setLayoutでウインドウにレイアウトを設定できるのですが、1つ問題があります。

それはsetLayoutでは1つのレイアウトしか設定できないことです。試しにsetLayout関数を2回呼び、2つのレイアウトクラスを渡すと、1つめのレイアウトしか適用されません。そこでここでは複数のレイアウトを指定してみたいと思います。

複数のレイアウトを設定するにはまず1つ1つのレイアウトオブジェクトを作り、それらをある1つのレイアウトクラスに渡すことで実現します。言葉だと分かりにくいので以下のMainWin.cppを見てください。

#include "MainWin_H.h"

MainWin::MainWin()
{
    setWindowTitle("layout window");
    
    setGeometry(200, 200, 200, 300);

    //QVBoxLayoutの作成
    QLabel* label1 = new QLabel("vertical");
    QLabel* label2 = new QLabel("vertical");
    QVBoxLayout* vbox = new QVBoxLayout;
    vbox->addWidget(label1);
    vbox->addWidget(label2);

    //QHBoxLayoutの作成
    QLabel* label3 = new QLabel("horizon");
    QLabel* label4 = new QLabel("horizon");
    QHBoxLayout* hbox = new QHBoxLayout;
    hbox->addWidget(label3);
    hbox->addWidget(label4);

    QBoxLayout* topLayout = new QBoxLayout(QBoxLayout::RightToLeft);
        //topLayoutがすべてのレイアウトの核になる。
    topLayout->addLayout(vbox, 0);
        //レイアウトを加える。
    topLayout->addLayout(hbox, 0);

    setLayout(topLayout);
    show();
}

ソースを見て分かるように初めに2つのレイアウトオブジェクトvboxとhboxを作り、それをQBoxLayoutクラスのaddLayoutに渡しています。これだけで2つのボックスレイアウトを一度に実現できます。

またQBoxLayoutのコンストラクタにRightToLeftという定数を渡していますが、これはレイアウトの方向を表す定数でこの例では右から左に沿ってレイアウトクラスを並べます。つまり、hvoxの方がvboxより右に設置されるということです。

関連項目
プライバシーポリシー