6

ウィンドウを(すべてコードで)レイアウトしようとしていますQGridLayout. ウィジェットをレイアウトに追加してウィンドウに表示することはできますが、サイズを適切に変更する方法がわかりません。これが私が欲しいものです

[Leftmost][--------Center---------][Rightmost]

これらは、私のウィンドウの 3 つの「ペイン」です (3 つすべてにリストがあります)。左と右のものは静的な幅で、それぞれの側面を包み込む必要があり、中央はウィンドウが拡大 (または縮小) するにつれて幅を埋めるように拡張する必要があります。

いくつかのコード:

// Create the subviews, add them to a grid layout, and set the layout to the window.
QTableView *list = new QTableView(0);
list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QTableView *flashList = new QTableView(0);
flashList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

QPushButton *infoButton = new QPushButton("Info!");
QPushButton *flashFeedsButton = new QPushButton("Flashfeeds");

QGridLayout *gridLayout = new QGridLayout;



// Set the minimum widths for all three columns of the grid
gridLayout->setColumnMinimumWidth(GridColumnFirst, 300);
gridLayout->setColumnMinimumWidth(GridColumnSecond, 300);
gridLayout->setColumnMinimumWidth(GridColumnThird, 300);

// Set the minimum heights for all rows of the grid
int headerFooterHeight = 44;
gridLayout->setRowMinimumHeight(GridRowFirst, headerFooterHeight);
gridLayout->setRowMinimumHeight(GridRowSecond, 200);
gridLayout->setRowMinimumHeight(GridRowThird, headerFooterHeight);


// Set the stretch factors
gridLayout->setColumnStretch(GridColumnFirst, 1);
gridLayout->setColumnStretch(GridColumnFirst, 2);
gridLayout->setColumnStretch(GridColumnThird, 1);

gridLayout->addWidget(list, 1, 0, Qt::AlignLeft);
gridLayout->addWidget(flashList, 1, 1, Qt::AlignCenter);
gridLayout->addWidget(infoButton, 0, 3, Qt::AlignRight);
gridLayout->addWidget(flashFeedsButton, 0, 1, Qt::AlignLeft);

_mainWindow->setLayout(gridLayout);

GridRowSecond(お分かりかもしれませんが、これは最終的には 9x9 のグリッドになりますが、要点は残ります。中央の行 ( ) に伸縮性のある列を持たせようとしています)。

行自体は問題なく展開されます。問題は、各セルのウィジェットを拡張して、それらを含むスペースを占有しているようです。どうすればいいですか?(また、垂直方向にはリストが適切に拡張されていますが、水平方向には拡張されていません)。

4

3 に答える 3

9

QGridLayout::AddWidgetのドキュメントを見てください:

デフォルトの配置は 0 です。これは、ウィジェットがセル全体を埋めることを意味します。

しかし、次のものがあります。

gridLayout->addWidget(list, 1, 0, Qt::AlignLeft);
gridLayout->addWidget(flashList, 1, 1, Qt::AlignCenter);
gridLayout->addWidget(infoButton, 0, 3, Qt::AlignRight);
gridLayout->addWidget(flashFeedsButton, 0, 1, Qt::AlignLeft);

したがって、ウィジェットをセルの左、中央、右、左にそれぞれ配置することをグリッド レイアウトに具体的に伝えました。あなたの場合、デフォルトの配置を使用して、ウィジェットがセルを埋め、それぞれのサイズ ポリシーに従うことをお勧めします。

于 2011-10-13T19:07:17.717 に答える
4

ウィジェットに適切なサイズポリシーを設定するだけです。したがって、左右のボタンは次のようになります。

button->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );

真ん中のボタン

button->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );

ここで、最初の引数は水平サイズポリシーを定義し、2番目の引数は垂直サイズポリシーを定義します。

サイズポリシーのドキュメントも参照してください

于 2011-10-13T18:49:50.063 に答える
2

ここには多くの変数があります (さまざまなウィジェット、ウィジェットのさまざまなサイズ ポリシー、レイアウト自体に作用するサイズ ポリシーなど)。

1) まず、1 種類のウィジェットだけで目的を達成してみてください。たとえば、すべてのエキスパンド サイズ ポリシーを持つすべての QLabel です。2) ウィジェットのサイズ ポリシーのみを調整します。グリッド レイアウトに要素を追加すると、混乱が生じることがわかりました。ウィジェットのサイズ ポリシーのストレッチ ファクターは正常に機能するはずです。3) ストレッチ ファクターのさまざまな比率を試すことを恐れないでください。

これは、Qt Designer (Creator) がこれらの問題を解決するのに役立つことの 1 つであることを発見しました。Designer で調整してサイズを変更する方が、コンパイル サイクルを実行するよりもはるかに高速です。そこで問題を解決したら、見つけたプロパティを取得して、編集、コンパイル、実行の代わりにコードに入れることができます。

于 2011-10-13T18:50:51.007 に答える