在QScrollArea中的QVBoxLayout中为最初隐藏的窗口小部件保留空间

时间:2010-04-26 22:50:35

标签: qt layout visibility

我正在使用QVBoxLayout来安排垂直堆栈的小部件。 QVBoxLayout包含在QScrollArea中。我希望最初隐藏一些小部件,并且仅在选中复选框时显示。这是我正在使用的代码示例。

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    QVBoxLayout *layout = new QVBoxLayout(this);

    QLabel *labelLogTypes = new QLabel(tr("Log Types"));

    m_checkBoxCsv = new QCheckBox(tr("&Delimited File (CSV)"));
    m_labelDelimiter = new QLabel(tr("Delimiter:"));
    m_lineEditDelimiter = new QLineEdit(",");
    checkBoxCsv_Toggled(m_checkBoxCsv->isChecked());
    connect(m_checkBoxCsv, SIGNAL(toggled(bool)), SLOT(checkBoxCsv_Toggled(bool)));

    QHBoxLayout *layoutDelimitedChar = new QHBoxLayout();
    layoutDelimitedChar->addWidget(m_labelDelimiter);
    layoutDelimitedChar->addWidget(m_lineEditDelimiter);


    m_checkBoxXml = new QCheckBox(tr("&XML File"));
    m_checkBoxText = new QCheckBox(tr("Plain &Text File"));


    // Now that everything is constructed, put it all together
    // in the main layout.
    layout->addWidget(labelLogTypes);

    layout->addWidget(m_checkBoxCsv);
    layout->addLayout(layoutDelimitedChar);

    layout->addWidget(m_checkBoxXml);
    layout->addWidget(m_checkBoxText);

    layout->addStretch();
}


MyWidget::checkBoxCsv_Toggled(bool checked)
{
    m_labelDelimiter->setVisible(checked);
    m_lineEditDelimiter->setVisible(checked);
}

我希望m_labelDelimiterm_lineEditDelimiter最初都不可见,我希望他们的可见性与m_checkBoxCsv的状态切换。当它们变得可见时,我希望布局垂直扩展以适应它们。

此代码实现了我想要的功能,但它似乎没有为最初隐藏的两个小部件保留空间。当我选中复选框时,它们会变得可见,但是所有东西都有点碾压以适应它们。

如果我最初看到它们,那么一切都按照我希望的方式布局。有没有办法让这些小部件的QVBoxLayout保留空间,即使它们最初是不可见的?

如果我没有把这个小部件放到QScrollArea中,那么这段代码就像我想要的那样工作。与QScrollArea有什么关系?

3 个答案:

答案 0 :(得分:5)

有几种方法可以做到这一点。

1)将最初不可见的小部件添加到不同的小部件,并将其他小部件放入需要空间的位置。将外部窗口小部件设置为与内部窗口小部件相同的大小。隐藏/显示内部窗口小部件时,它不会影响外部窗口小部件的大小,因此不会导致调整任何布局的大小。

2)添加另一个小部件以及您想要隐藏的小部件,大小相同。每当您显示一个不可见的小部件时,您都会隐藏相应的可见小部件。这将有效地交换两个相同大小的小部件,因此不应该导致布局移位(尽管它将被重新计算)。

3)将一个堆叠的小部件放在您想要不可见的小部件的位置,并将不可见的小部件放在一个页面上,而在另一个页面上没有小部件。适当调整堆积小部件的大小然后,您可以根据是否要显示内部窗口小部件来更改堆叠窗口小部件的页面。请注意,这对于显示/隐藏的一个窗口小部件来说更加麻烦,但如果您有三个或更多相互排斥的选项可以显示,则开始变得更加可行。

所有这一切的重要方面是尺寸。您可以调整我的建议以便以某种方式调整大小,但如果您希望隐形窗口小部件也可以动态调整大小,则会更加困难。

答案 1 :(得分:4)

我为在原始问题中不完全清楚而道歉。事实证明,问题似乎与此小部件有关,它已包含在QScrollArea中。当我打电话给scrollArea->setWidgetResizable(true)时,事情开始变得完美。

感谢您的建议,哔叽和Caleb。

答案 2 :(得分:1)

你可以尝试在layoutDelimitedChar布局中添加一个spacer项目,预定义的最大高度为smth,如下所示:

QHBoxLayout *layoutDelimitedChar = new QHBoxLayout();

layoutDelimitedChar->addSpacerItem(new QSpacerItem(0, 33, QSizePolicy::Maximum, QSizePolicy::Maximum));

layoutDelimitedChar->addWidget(m_labelDelimiter);
layoutDelimitedChar->addWidget(m_lineEditDelimiter);

希望这有帮助,尊重