web-dev-qa-db-ja.com

QSplitterの幅を均等に分散する方法

QSplitterの幅の調整に問題があります。 Qt DesignerでUIを準備しましたが、次のようになりました。

デザイナービュー

enter image description here

そして、これが私のオブジェクトインスペクターです:

enter image description here

私の質問は、QSplitterの幅を左右の領域に均等に分割する方法です。この効果を初期サイズにして、お客様がやりたいことができるようにしたいと思います。

私が欲しい効果は次のとおりです:

enter image description here

他の世界では、左右の領域のスプリッターの初期分割をウィンドウ幅の50%/ 50%として指定する方法を探しています。それを取得するオプションはありますか?

あなたの助けに感謝し、許してください、私はちょうどQtを学び始めました。

6
drewpol

短い答え

splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));

説明

この場合、QSpacerは必要ありません。スペーサーの目的は、使用可能なすべてのスペースを埋めることです。

QSplitterは、子のサイズを指定する2つのメソッドを提供します: setStretchFactor および setSizes

  • stretch factorは、子ウィジェットの相対的なサイズを指定するために探しているもののように見えるかもしれませんが、あなたの場合には、係数は、子ウィジェットの初期サイズに関連しています。

stretchは有効なストレッチファクターではありません。有効なストレッチ係数は、ウィジェットの初期サイズを取得し、それをstretchで乗算することによって計算されます。

したがって、両方の子のストレッチファクターを同じ値に設定します(例:1)うまく機能しません:

splitter->setStretchFactor(0, 1);
splitter->setStretchFactor(1, 1);
  • 相対的なサイズのみが重要であるため、より良い代替手段はsetSizesを使用することです。

スプリッターウィジェットの全体的なサイズは影響を受けません。代わりに、追加/欠落したスペースは、サイズの相対的な重みに従ってウィジェット間で分散されます。

したがって、両方のサイズを1に設定すると、合計サイズが両方の子に均等に分散されると考えることができます。

splitter->setSizes(QList<int>({1, 1}));

いいえ、小さすぎる値を最小サイズに置き換えることで最小サイズポリシーが適用されることを考慮に入れる必要があるため、次のようになります。

ウィジェットのサイズポリシーは保持されます。つまり、それぞれのウィジェットの最小サイズのヒントよりも小さい値は、ヒントの値に置き換えられます。

したがって、子の最小サイズよりも大きい値を使用する必要があります。たとえば、intで表すことができる最大数、つまりINT_MAX

splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));

さらに読む

ほとんどの場合、Qtはすべてのウィジェットに適切なサイズを与えるのに適していますが、調整が非常に難しくなり、試行錯誤が必要になる場合があります。したがって、Qtでレイアウト管理を操作するときに役立つ可能性のある追加のリソースをいくつか提供したいと思います。

19
m7913d

m7913d's に基づく

スプリッターを均等に分割するには、_QSplitter::setSizes_を使用し、リスト内の各サイズが等しくなければなりません。 QWidget::minimumSizeHint()を使用して、使用するサイズを決定します。スプリッターに追加したすべてのウィジェットの最大幅(水平スプリッターの場合)または最大高さ(垂直スプリッターの場合)を使用します

_// Example for a horizontal splitter
splitter = new QSplitter(Qt::Horizontal, this);
splitter->addWidget(widgetLeft);
splitter->addWidget(widgetRight);
auto equalWidth = std::max(widgetLeft->minimumSizeHint().width(), 
                           widgetRight->minimumSizeHint().width());
splitter->setSizes({ equalWidth, equalWidth });
_
_// Example for a vertical splitter
splitter = new QSplitter(Qt::Vertical, this);
splitter->addWidget(widgetTop);
splitter->addWidget(widgetBottom);
auto equalHeight = std::max(widgetTop->minimumSizeHint().height(),
                            widgetBottom->minimumSizeHint().height());
splitter->setSizes({ equalHeight, equalHeight });
_
1
Seamus Boyle