QSpormLIout中的QSpacerItem - 垂直展开

时间:2012-12-11 21:18:05

标签: c++ qt

我想在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);
}

5 个答案:

答案 0 :(得分:3)

所以有一些不同的问题:

  1. QFormLayout不像其他布局那样展开。我的小部件(其中一些)被放入QFormLayout。这阻止了他们扩张。我将主要父级布局从QFormLayout切换为QVBoxLayout。这使我必须使用QLayout::setAlignment(Qt::AlignTop)
  2. 这解决了我的一些其他小部件没有扩展的一些问题。但是这些小部件使用了QVBoxLayout。上面的小部件使用QFormLayout。要进行此展开,我必须在QSpacerItem中使用以下行:
  3. 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都会正确展开。

答案 1 :(得分:2)

经过大量时间手动以及大量尝试后,我猜我们无法使用QFormLayout做你想做的事。

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

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

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

如果您只想要视觉效果,则指向每个部分中宽度相同且部分之间间距增大的列,您可以将QGridLayout与2列一起使用,并在各部分之间的行中添加间隔符。在这种情况下,您必须创建QLabel以自行放入第一列。

答案 2 :(得分:1)

对于子孙后代,我遇到了类似的问题。我发现像下面这样的组织会导致内部布局(QHBoxLayout)中的任何内容不会像我将它们自己放入QFormLayout那样垂直扩展:

QFormLayout
-QHBoxLayout
--QListWidget

但是,如果我通过将HBoxLayout放入QWidget添加了一层间接,那么大小调整是正确的:

QFormLayout
-QWidget
--QHBoxLayout
---QListWidget

所以你可以尝试在那里添加一个QWidget并将你的垫片放在里面。

答案 3 :(得分:1)

我所做的可能是一些黑客攻击并且不是很优雅,但它只是在一行中完成了这个技巧:

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

这会使此次调用之前和之后添加的行之间的空间加倍。

答案 4 :(得分:0)

我怀疑MyWidget的大小不正确。布局将使用窗口小部件的大小来确定如何最好地布局自己的项目。仅仅因为其中一个项目设置为扩展策略并不意味着布局将强制MyWidget的大小扩展。如果MyWidget的大小是固定的,那么内部布局就无法做到。

如果你让MyWidget更大,你应该看到布局正常工作。也许您需要将MyWidget置于垂直布局中,并将其策略设置为扩展?在不知道MyWidget如何达到它的大小的情况下,很难确定。