QSpormLIout中的QSpacerItem - 垂直展开

Con*_*tin 6 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);
}
Run Code Online (Sandbox Code Playgroud)

Con*_*tin 4

所以有几个不同的问题:

  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);
}
Run Code Online (Sandbox Code Playgroud)

如果MyWidget使用 a QFormLayout,除非我添加带有大小提示的间隔符,否则内容不会扩展。但是,如果MyWidget使用 a QVBoxLayout,则其中的任何QWidgets内容都会正确扩展。