6

で拡張スペースを強制したいのですQFormLayoutQFormLayoutQSpaceItem::sizeHint(). これを回避する方法、またはこれを処理する適切な方法を知っている人はいますか?


MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
   SetupLayout();
}

void MyWidget::SetupLayout()
{
   QFormLayout * layout = new QFormLayout();

   layout->addRow("Something1", new QComboBox());
   layout->addRow("Something2", new QSpinBox());

   //Spacer
   layout->addItem(new QSpacerItem(0,10, QSizePolicy::Expanding, QSizePolicy::Expanding));

   layout->addRow(QPushButton("Something3"));

   setLayout(layout);
}
4

5 に答える 5

3

手動で多くの時間を費やし、多くの試行を重ねた後、QFormLayout を使用してやりたいことを行うことは不可能だと思います。

このレイアウトは、入力するフィールドがたくさんあるウィンドウ用に設計されていますが、そのためだけです。

フォームのセクション間に大きなスペースを追加したい場合は、スペースで区切られた QFormLayout の内部で QVBoxLayout を使用できます。この場合、各セクションには 1 列目と 2 列目の幅があるため、最適な解決策ではないことに注意してください。

もう 1 つの解決策 (いくつかのオプションをグループ化することについて話している場合) は、QFormLayouts を含むいくつかの QGroupBoxes を使用することです。グループは間隔を広げて区切られることはありませんが、非常に読みやすく、グループに名前を付けることができます。オプションのグループ化が必要な場合 - これはおそらく最も一般的で使いやすい方法です。

指摘した視覚効果のみが必要な場合-すべてのセクションで同じ幅の列でセクション間の間隔が大きくなる場合は、2つの列で QGridLayout を使用し、セクション間の行にスペーサーを追加できます。この場合、最初の列に配置する QLabel を自分で作成する必要があります。

于 2012-12-11T23:11:18.717 に答える
2

したがって、いくつかの異なる問題がありました。

  1. QFormLayout他のレイアウトのように拡張しないでください。私のウィジェット (そのうちのいくつか) はQFormLayout. これにより、それらの拡張が妨げられました。メインの親レイアウトを から に切り替えましQFormLayoutQVBoxLayout。これは私が使用しなければならなかったQLayout::setAlignment(Qt::AlignTop)
  2. これにより、他のいくつかのウィジェットが展開されないといういくつかの問題が修正されました。ただし、これらのウィジェットはQVBoxLayout. 上記のウィジェットはQFormLayout. この展開を取得するには、次の行を my で使用する必要がありましたQSpacerItem

QSpacerItem * my_spacer = new QSpacerItem(0,1000, QSizePolicy::Expanding, QSizePolicy::Expanding);


私はいくつかのサンプルコードを提供しています。目標は、階層と QFormLayout が問題を引き起こす場所を示すことです。

コード例:

//A main Widget class
void SetupLayout()
{
   QHBoxLayout * main_layout = new QHBoxLayout();

   main_layout->addWidget(Some_Widget);

   //Create a control widget
   control_widget = new QWidget();  // IMPORTANT control_widget is a member
   QVBoxLayout * layout = new QVBoxLayout(); //IMPORTANT!!!! - Here it was QFormLayout

   layout->setAlignment(Qt::AlignTop); //IMPORTANT - Needed this after switching to QVBoxLayout

   layout->addWidget(new QComboBox("stuff")); //Some combo box
   control_widget->setLayout(layout);

   main_layout->addWidget(control_widget);
}

//Later on, we have a "Put a new widget in the control area" task
void NewControlArea()
{
   if(current_control)
      control_widget->removeWidget(current_control);  //current_control is a member variable

   current_control = new MyWidget();  //FROM ABOVE
   control_widget->addWidget(current_control);
}

MyWidgetを使用する場合QFormLayout、サイズのヒントを含むスペーサーを追加しない限り、物事は展開されません。ただし、MyWidgetを使用するQVBoxLayoutと、そのQWidgets中のすべてが正しく展開されます。

于 2012-12-12T19:19:15.487 に答える
1

後世のために、私は同様の問題を抱えていました。次のような編成を使用すると、内部レイアウト (QHBoxLayout) 内のものが、QFormLayout に自分でドロップした場合のように垂直方向に拡張されないことがわかりました。

QFormLayout
-QHBoxLayout
--QListWidget

ただし、HBoxLayout を QWidget に配置して間接レイヤーを追加すると、サイズ変更は正しく機能しました。

QFormLayout
-QWidget
--QHBoxLayout
---QListWidget

そのため、そこに QWidget を追加して、スペーサーをその中に入れてみてください。

于 2014-04-09T23:21:44.980 に答える
0

MyWidgetサイズが間違っていると思います。レイアウトは、ウィジェットのサイズを使用して、独自のアイテムを最適にレイアウトする方法を決定します。これらの項目の 1 つがエキスパンド ポリシーに設定されているからといって、レイアウトによって のサイズが強制的にMyWidgetエキスパンドされるわけではありません。のサイズMyWidgetが固定されている場合、内部レイアウトでできることは何もありません。

大きくするMyWidgetと、レイアウトが希望どおりに機能することがわかります。MyWidgetおそらく、ポリシーをエキスパンドに設定して縦型レイアウトにする必要があるでしょうか? どのようにそのサイズを取得するかを知らなければMyWidget、それを確認するのは困難です。

于 2012-12-11T23:00:24.063 に答える