4

2 x(n)グリッドのボタンを保持するドッキング可能なツールバー(Photoshopで使用するものと同様)を作成しようとしています。私の考えは、QDockWidgetに追加される空白のQWidgetを親とするQGridLayoutを使用し、QGridLayoutにボタンを追加することです。これは、位置合わせを除いて機能しているようです。

ボタンの位置合わせを設定しました...

myLayout->addWidget(button1,0,0,1,1,Qt::AlignTop);
myLayout->addWidget(button2,0,1,1,1,Qt::AlignTop);
myLayout->addWidget(button3,1,0,1,1,Qt::AlignTop);
myLayout->addWidget(button4,1,1,1,1,Qt::AlignTop);

...ただし、以下に示すように、グリッドはQDockWidgetの高さ全体に拡張されています。 ここに画像の説明を入力してください

ボタンも水平方向に拡大し、スペース全体を埋めます。水平方向にサイズを変更する機能を制限できると思います(これが可能な場合)。

親ウィジェットの幅/高さ全体を満たすようにGridLayoutを制限するために、ドキュメントで見落としている関数はありますか?また、副次的な質問として、QDOckWidgetが特定の方向にサイズ変更されないようにする方法はありますか?

4

3 に答える 3

4

ドキュメントから:

QGridLayoutは、 (親レイアウトまたはparentWidget()によって)使用可能になったスペースを取得し、それを行と列に分割し、管理する各ウィジェットを正しいセルに配置します。

列と行は同じように動作します。列について説明しますが、行には同等の関数があります。

各列には、最小幅と伸縮係数があります。最小幅は、setColumnMinimumWidth()を使用したそのセットの最大幅と、その列の各ウィジェットの最小幅です。ストレッチファクターはsetColumnStretch()を使用して設定され、列が必要な最小値を超えて使用可能なスペースの量を決定します。

したがって、最も簡単な方法は、固定サイズのドッキング可能なウィジェットQWidget::setFixedSizeを使用することです。一般的に、私はそれをお勧めしません(レイアウトの管理)が、以下の理由であなたのケースに最適です:

  • すべてのボタンのサイズは同じであるため、ボタンの数に応じてツールバーのサイズが大まかにわかります。
  • レイアウトの動作を管理する必要はありません。
  • どちらかの次元、または両方でそれを行うことができます

たとえば、ボタンを追加するとき

  void addButton(QWidget* w,QGridLayout* wl, QButton* button, posParams...){
       // w is the widget inside the QDockWidget (edit)
       //wl is w layout
       //break the constraints, the widget can be resized
       w->setFixedSize(QSize(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX));
       // only line to change if you want to hide, remove widget
       wl->addWidget(button, params);
       //fit to contents 
       w->adjustSize();
       // can be swapped to w->setFixedHeight, setFixedWidth
       w->setFixedSize(w->size());
  }

試してみて、変更後にウィジェットをドッキングおよびドッキング解除するときに問題が発生しないことを確認してください。制約を解除すると、レイアウトの制約も解除されることに注意してください。

一般に、QLayout :: SizeConstraintQWidget :: minimumSizeHintQWidget :: minimumSizeの間に階層があり、ドキュメントで見つけることができます。

  • QWidget::minimumSizeデフォルトでは設定されていません。あるとき、それは勝ちます QWidget::minimumSizeHint
  • QWidget::minimumSizeHintウィジェットがレイアウトにない場合(つまり、マウスで0にサイズ変更できる場合)は無効です。それ以外の場合は、レイアウトで定義されているウィジェットを使用します。
  • QLayout::SizeConstraint*直接*管理するウィジェットのデフォルトのレイアウト動作を保持します。Aレイアウト内にレイアウトをネストするとB、に追加されたすべてのウィジェットAがそのプロパティを使用します。また、ウィジェットが独自のレイアウトWを定義している場合、このレイアウト制約はウィジェットに適用される制約です。BW
于 2012-02-06T10:19:21.023 に答える
2

最初にQGridLayoutを追加し、次に次のようにストレッチを追加するQVBoxLayoutを使用します。

my_vboxlayout->addLayout( my_gridlayout );
my_vboxlayout->addStretch( 1 );

または、QGridLayoutに、最後の行を最大サイズに拡張するように指示することもできます。これにより、ボタンが押し上げられます。
あなたの場合は次のようになります。

mygridlayout->setRowStretch( 2, 1 ); // give 3rd row maximum space

ドキュメントへのリンク:
QBoxLayout
QGridLayout

于 2012-02-06T10:20:11.467 に答える