2012-12-11 9 views
5

QFormLayoutに拡張スペースを強制したいですが、QFormLayoutにはQSpaceItem::sizeHint()しか使用しません。誰かがこれを回避する方法、またはこれを処理する適切な方法を知っていますか?QSpacerItem In QFormLayout - 垂直展開


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); 
} 

答えて

3

だから、いくつかの異なる問題がありました:

  1. QFormLayoutは、他のレイアウトのように展開されません。私のウィジェット(そのうちのいくつか)はQFormLayoutに入れられました。これは、彼らが拡大するのを妨げました。主な親のレイアウトをQFormLayoutからQVBoxLayoutに変更しました。これは私を使用する必要がありましたQLayout::setAlignment(Qt::AlignTop)
  2. これはいくつかの私の他のウィジェットのいくつかの問題を拡張しないでいくつかの問題を修正しました。しかし、これらのウィジェットはQVBoxLayoutを使用しました。上のウィジェットはQFormLayoutを使用しています。これは拡張得るために、私は私のQSpacerItemに次の行を使用していた:私はいくつかのサンプルコードを供給しています

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


。目標は、階層を表示し、QFormLayoutが問題を引き起こす場所を表示することです。

例コード:MyWidgetQFormLayoutを使用している場合、私はサイズヒントにスペーサーを追加しない限り

//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); 
} 

、物事が展開されていません。ただし、MyWidgetQVBoxLayoutが使用されている場合は、その内のQWidgetsが正しく展開されます。

0

私はMyWidgetが間違ったサイズを持っていると思われます。レイアウトは、ウィジェットのサイズを使用して、独自のアイテムをレイアウトする方法を最適化します。これらのアイテムの1つが拡張ポリシーに設定されているだけであっても、レイアウトによってサイズが強制的に拡大されるわけではありません。MyWidgetMyWidgetのサイズが固定されている場合、内部レイアウトでは何もできません。

MyWidgetを大きくすると、希望通りにレイアウトが表示されます。おそらく、MyWidgetをポリシーを展開して縦型レイアウトにする必要がありますか? MyWidgetがどのようにサイズを取得するのかわからないと、確信が持てません。

+0

問題があるとは思わない。 QMainFrameでcentralWidgetとして設定されたQFrameにQLayoutを配置しました - レイアウトはQMainWindowで拡大しますが、スペースは拡大しません。 – Yester

+0

ええ、私は通勤の家で同じことを今日考えていました...明日に取り入れて試してみるのが待ちきれない...コンストラクターでかなりです。私は 'MyWidget:setSizePolicy(QSizePolicy :: Expanding、 QSizePolicy :: Expanding) ' – Constantin

2

多くの時間を手作業でしっかりと試してみたら、QFormLayoutを使いたいと思うようにはできません。

このレイアウトは、多くのフィールドを塗りつぶすために設計されていますが、それだけです。

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

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

すべてのセクションで幅が同じでセクション間の間隔が拡大されているような視覚効果が必要な場合は、2列のQGridLayoutを使用してセクション間の行にスペーサーを追加できます。この場合、自分で最初の列に入れるためにQLabelを作成する必要があります。

+0

私はあなたの意見を理解しており、私はいくつかの場所でそれを読んだようです。私はいくつかのトリックを持っている私は明日試してみようとしている袖です。私はあなたを掲載し続けるよ!入力いただきありがとうございます。 – Constantin

1

私は同様の問題を抱えていました。私は自分自身でQFormLayoutにそれらを落としていた場合は、次のような組織を持つことは、彼らが同じように垂直方向に拡大しないように、内部レイアウト(QHBoxLayout)に何かを引き起こすことがわかった:

QFormLayout 
-QHBoxLayout 
--QListWidget 

しかし、私が追加した場合QWidgetのにHBoxLayoutを置くことによって間接の層、そしてサイズが正しく働いていた:

QFormLayout 
-QWidget 
--QHBoxLayout 
---QListWidget 

をですから、そこではQWidgetを追加し、その中にあなたのスペーサーを入れてみてください。私が何をしたか

0

はおそらく、ハッキングのビットであり、非常にエレガントではない、まだそれだけで1行のトリックでした:

addRow(" ", (QWidget*)nullptr); 

これは、この呼び出しの前と後に追加された行の間のスペースを倍増します。