QSpacerItem In QFormLayout-垂直展开

QSpacerItem In QFormLayout - Vertical Expand

本文关键字:垂直 QFormLayout- In QSpacerItem      更新时间:2023-10-16

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

所以有几个不同的问题:

  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会在哪里引起问题。

示例代码:

//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都将正确展开。

经过大量的手动操作和尝试,我想使用QFormLayout不可能实现您想要的功能。

这种布局是为有很多字段要填充的窗口而设计的,但仅限于此。

如果你想在表单的各个部分之间增加更大的间距,你可以使用QVBoxLayout,里面有几个QFormLayout,用空格隔开。注意,在这种情况下,每个部分都有自己的第一列和第二列宽度,所以这可能不是最好的解决方案。

另一个解决方案(如果我们谈论的是对一些选项进行分组)是使用两个带有QFormLayouts的QGroupBoxes。这些组不会被不断增加的间距分隔,但它将非常可读,并且您可以命名您的组。如果你想对选项进行分组,那么这可能是最常见和用户友好的方法。

如果你只想看到你所指的视觉效果——每个节中宽度相同的列,节之间的间距不断增加,你可以使用2列的QGridLayout,并在节之间的行中添加间隔符。在这种情况下,您必须创建QLabel,以便自己放入第一列。

为了子孙后代,我也遇到了类似的问题。我发现,拥有以下这样的组织会导致内部布局(QHBoxLayout)中的任何内容无法像我自己将其放入QFormLayout那样垂直扩展:

QFormLayout
-QHBoxLayout
--QListWidget

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

QFormLayout
-QWidget
--QHBoxLayout
---QListWidget

所以你可以试着在里面加一个QWidget,然后把你的垫片放进去

我所做的可能有点黑客攻击,不是很优雅,但它只在一行中完成了任务:

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

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

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

如果你把MyWidget做得更大,你应该看到布局如你所愿。也许您需要将MyWidget放在一个垂直布局中,并将其策略设置为扩展?如果不知道MyWidget的大小是如何得到的,就很难确定。