QSpacerItem In QFormLayout-垂直展开
QSpacerItem In QFormLayout - Vertical Expand
我想在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);
}
所以有几个不同的问题:
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
都将正确展开。
经过大量的手动操作和尝试,我想使用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
的大小是如何得到的,就很难确定。
- QScrollArea:由垂直滚动条引起的水平滚动条
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 按钮悬停在 QT 中垂直布局的选项卡小部件中不起作用
- OnVScroll : 从 CSpinButtonCtrl 或垂直滚动条调用?
- PyQT - 在 QTableWidget 单元格中显示垂直文本
- 如何确定两条直线是否(几乎)垂直/正交
- 如何使用C++获取/设置OBS中的垂直滚动过滤器属性?
- 如何在c++中仅使用for循环打印此代码的垂直直方图
- 指向纹理数据的指针-垂直翻转数据
- 特征垂直堆叠行到矩阵中
- 垂直打印文字
- 使用二叉树的关卡顺序概念的垂直顺序遍历
- 如何在以下代码中使用垂直条
- 如何将垂直纹理应用于QT Surface3D
- 在垂直和水平上缩放GTKMM小部件
- 如何让用户垂直调整大小窗口
- 垂直表显示与每个int大小相关的星星
- 如何在移动列表视图中添加滚动条?并且用户只能垂直滚动特定区域
- 清除并重新填充 QFormLayout
- QSpacerItem In QFormLayout-垂直展开