6

我想在我的 . 中强制扩大空间QFormLayout,但无论如何QFormLayout只能使用QSpaceItem::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 做你想做的事情是不可能的。

此布局适用于需要填充大量字段的窗口,但仅用于此目的。

如果您想在表单的各个部分之间添加更大的间距,您可以使用 QVBoxLayout,其中有几个 QFormLayout,由间距分隔。请注意,在这种情况下,每个部分都有自己的第一列和第二列宽度,因此这可能不是最佳解决方案。

另一种解决方案(如果我们正在讨论对某些选项进行分组)是使用几个 QGroupBoxes 和 QFormLayouts 。这些组不会通过增加间距来分隔,但它会非常易读,您可以命名您的组。如果分组选项是您想要做的 - 这可能是最常见且用户友好的方式。

如果您只想要您指出的视觉效果 - 每个部分中具有相同宽度的列和部分之间的间距增加,您可以使用带有 2 列的 QGridLayout 并在部分之间的行中添加间隔。在这种情况下,您必须自己创建 QLabel 放入第一列。

于 2012-12-11T23:11:18.717 回答
2

所以有几个不同的问题:

  1. QFormLayout不要像其他布局一样扩展。我的小部件(其中一些)被放入QFormLayout. 这阻止了他们的扩张。我将我的主要父布局从 切换QFormLayoutQVBoxLayout. 这让我不得不使用QLayout::setAlignment(Qt::AlignTop)
  2. 这解决了我的一些其他小部件没有扩展的一些问题。但是这些小部件使用QVBoxLayout。上面的小部件使用QFormLayout. 为了得到这个扩展,我必须在我的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使用 a QFormLayout,除非我添加带有大小提示的垫片,否则不会扩展。但是,如果MyWidget使用 a 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 回答
1

我所做的可能有点骇人听闻,而且不是很优雅,但它仅在一行中就成功了:

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

这将在此调用之前和之后添加的行之间的空间加倍。

于 2017-06-27T09:27:24.580 回答
0

我怀疑MyWidget尺寸不对。布局将使用小部件的大小来确定如何最好地布局自己的项目。仅仅因为其中一项设置为扩展策略并不意味着布局将强制MyWidget扩展的大小。如果 的大小MyWidget是固定的,则内部布局无能为力。

如果你做得MyWidget更大,你应该看到布局如你所愿。也许您需要将MyWidget其策略设置为扩展的垂直布局?在不知道如何MyWidget获得它的大小的情况下,很难确定。

于 2012-12-11T23:00:24.063 回答