我想在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);
}
答案 0 :(得分:3)
所以有一些不同的问题:
QFormLayout
不像其他布局那样展开。我的小部件(其中一些)被放入QFormLayout
。这阻止了他们扩张。我将主要父级布局从QFormLayout
切换为QVBoxLayout
。这使我必须使用QLayout::setAlignment(Qt::AlignTop)
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
都会正确展开。
答案 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
如何达到它的大小的情况下,很难确定。