【发布时间】:2011-02-12 15:12:10
【问题描述】:
我正在使用 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_labelDelimiter 和 m_lineEditDelimiter 最初都是不可见的,并且我希望它们的可见性随着 m_checkBoxCsv 的状态而切换。当它们变得可见时,我希望布局垂直扩展以容纳它们。
这段代码实现了我想要的功能,但它似乎没有为最初隐藏的两个小部件保留空间。当我选中复选框时,它们变得可见,但一切都被挤压以适应它们。
如果我让它们最初可见,一切都会按照我想要的方式布置。有没有办法让 QVBoxLayout 为这些小部件保留空间,即使它们最初是不可见的?
如果我不将此小部件放入 QScrollArea,那么此代码将完全按照我的意愿工作。 QScrollArea 是怎么回事?
【问题讨论】:
标签: qt layout visibility