.ui
ファイルから作成された出力は、常にレイアウトと子ウィジェットを既存のウィジェットにインストールします。setupUiまたはuic出力を使用して親ウィジェットのない独立したレイアウトを作成するにはどうすればいいですか?
#include "ui_form.h"
QWidget widget;
Ui::Form ui;
ui.setupUi(&widget);
悲しいかなは、時々介在ウィジェットは不要である:あなたがwidget
上で直接レイアウト/子を追加しようとするとき、これは素晴らしい作品。あなたはレイアウトにUi::Form
の内容を挿入する場合、あなたは余白をリセットする必要がありますので、まず、ウィジェットのレイアウトは、非ゼロのマージンを持っている:
QWidget top;
QVBoxLayout layout{&top};
QWidget widget;
Ui::Form ui;
ui.setupUi(&widget);
widget.layout()->setContentsMargins(0,0,0,0);
layout.addWidget(&widget);
また、この場合に介入ウィジェットは完全に不要です。 setupUi
がトップレベルのウィジェットを必要としないと仮定します(Qt 5.7ではnullptrを渡すとクラッシュします)。
QWidget top;
QVBoxLayout layout{&top};
Ui::Form ui;
ui.setupUi(nullptr);
layout.addLayout(ui.layout); // assuming `layout` is the top-level layout there
私はuic
を視察したのだが、トップレベルのウィジェットなしでコードを発するサポートしていません:次のように我々はそれを使用することができます。必要なパッチがほんのわずかであることは事実です。
しかし、Qtのにパッチを適用せずにsetupUi
を-accepting nullptr
の効果に何かを実装する方法はありますか?
誰かがこれがメークアップ問題だと思わないように、この質問には部分的にthis code from YUViewが表示されました。そこで、setupUi
に渡されたparentWidget
には既にレイアウトがあり、目的はsetupUi
の後に別のレイアウトにフォームのレイアウトを追加することです。 QWidget::setLayout
はsetupUi
の内部から呼び出され、新しいレイアウトの設定を拒否し、警告を発し、それにもかかわらず動作します。コードは、Qtコードが目的の結果につながる正しい方法を壊しているため、脆いです。
これは素晴らしいです。残念ですが、このウィジェットが必要でないということ以外に、 'setContentsMargins(0,0,0,0); 'で介在するウィジェットを使用する場合の短所はありますか?これが介在するウィジェットを作成するオーバーヘッドについては、答えは基本的に一時ウィジェットを作成し、そのレイアウトを取るか?だから、私はそれがパフォーマンスに関するものではないと思う。したがって、介在するウィジェット(余白を '0'に設定)でこれを設定し、代わりにこのウィジェットをレイアウトに追加する際の短所は何ですか? – Mike
私は通常、このような問題に対処する際に私が介入するウィジェットのアプローチを使用するため、これを求めています。 – Mike
不要な迷惑メールを含まないようにアイテムの階層が好きです。一時ウィジェットは永遠に保持して再利用することができます。唯一の追加料金については、一時的なラッパーのレイアウトが作成され、すぐに破棄されます。それは何のためにも大したことではないかもしれない、ああ。 –