3

私は C++ Qt 4.6.3 で小さなゲームを開発していますが、レイアウトの問題に遭遇しました。私が探しているレイアウトは、中央のセル (1,1) がメイン ウィジェット (ボード ゲーム) を保持する 3x3 QGridLayout です。(0,1)-セルは、誰の番かを表示する QLabel を保持する必要があります。(1,0) および (1,2) セルは、最大 3 つのスコアボードを保持するために QVBoxLayouts に分割され、(2,1) -cell は、ある種の QLabel も保持します。

レイアウトイメージ

これは私がこれまでに得たものです:

QGridLayout *mainLayout = new QGridLayout(this);
QVBoxLayout *leftLayout = new QVBoxLayout;
QVBoxLayout *rightLayout = new QVBoxLayout;  
mainLayout->addLayout(leftLayout,   1, 0, AlignTop);
mainLayout->addWidget(topText,      0, 1, AlignCenter);
mainLayout->addWidget(board,        1, 1);
mainLayout->addLayout(bottomText,   2, 1, AlignCenter);
mainLayout->addLayout(rightLayout,  1, 2, AlignTop);

さて、MS Windows(私のGFのラップトップ)で、resizeEvent()関数を再実装することでこれを解決しました:

void Game::resizeEvent(QResizeEvent *)
{
    mainLayout->setRowMinimumHeight(1, 0.8 * height());
    mainLayout->setColMinimumWidth(1, 0.8 * height());
    // some other stuff
}

これはうまくいきました!ただし、Unix では問題があるようです (または、バージョンの違いが原因でしょうか? 4.6 と 4.8)。メソッドを呼び出すとsetRowMininmumHeight()、別のサイズ変更イベントが発行され、再帰呼び出しが発生したようです! アプリケーションを両方のプラットフォームで動作させたいので、明らかに別のソリューションを見つける必要がありました。setRowStretch()私はandをいじりましsetColStretch()たが、どちらも望ましい結果にはなりませんでした。あらゆる組み合わせを試しましたが、今はかなり行き詰まっています...

この一見簡単な問題を解決できる人はいますか?

4

1 に答える 1

4

この問題を解決するには、最小サイズではなくストレッチを使用する必要があります。ウィジェットをレイアウトに追加した後、次のコードを実行して、高さの 80% を中央の行に割り当てます。

mainLayout->setRowStretch(0, 1); // 10% for top row
mainLayout->setRowStretch(1, 8); // 80% for middle row
mainLayout->setRowStretch(2, 1); // 10% for bottom row

含まれているウィジェットの最小サイズの制約は引き続き考慮されることに注意してください (サイズ ポリシーを無視するように設定しない限り)。したがって、高さ全体から行 0 と 2 の 2 つの最小サイズを引いたものを割り当てたい場合 (「できるだけ小さくする必要がある」と言っているように)、中央の行に 100% を割り当て、行 0 に 0% を割り当てます。そして2; 彼らはまだ最小サイズを尊重しています:

mainLayout->setRowMinimumHeight(0, 20); // 20px for top row
mainLayout->setRowMinimumHeight(2, 20); // 20px for bottom row
mainLayout->setRowStretch(0, 0);
mainLayout->setRowStretch(1, 1); // remaining height for middle row
mainLayout->setRowStretch(2, 0);
于 2012-05-31T17:08:09.450 に答える