QSplitter
の幅の調整に問題があります。 Qt DesignerでUIを準備しましたが、次のようになりました。
デザイナービュー:
そして、これが私のオブジェクトインスペクターです:
私の質問は、QSplitter
の幅を左右の領域に均等に分割する方法です。この効果を初期サイズにして、お客様がやりたいことができるようにしたいと思います。
私が欲しい効果は次のとおりです:
他の世界では、左右の領域のスプリッターの初期分割をウィンドウ幅の50%/ 50%として指定する方法を探しています。それを取得するオプションはありますか?
あなたの助けに感謝し、許してください、私はちょうどQtを学び始めました。
短い答え:
splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));
説明
この場合、QSpacer
は必要ありません。スペーサーの目的は、使用可能なすべてのスペースを埋めることです。
QSplitter
は、子のサイズを指定する2つのメソッドを提供します: setStretchFactor
および setSizes
:
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でレイアウト管理を操作するときに役立つ可能性のある追加のリソースをいくつか提供したいと思います。
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 });
_