Ste*_*hen 3 layout qt 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);
}
Run Code Online (Sandbox Code Playgroud)
我希望m_labelDelimiter
并且m_lineEditDelimiter
两者最初都是不可见的,我希望它们的可见性与m_checkBoxCsv的状态切换.当它们变得可见时,我希望布局垂直扩展以适应它们.
这段代码实现了我想要的功能,但它似乎没有为最初隐藏的两个小部件保留空间.当我选中复选框时,它们会变得可见,但是所有东西都有点紧凑以容纳它们.
如果我最初看到它们,那么一切都按照我希望的方式布局.有没有办法让这些小部件的QVBoxLayout保留空间,即使它们最初是不可见的?
如果我没有把这个小部件放到QScrollArea中,那么这段代码就像我想要的那样工作.与QScrollArea有什么关系?
有几种方法可以做到这一点.
1)将最初不可见的小部件添加到不同的小部件,并将其他小部件放入需要空间的位置.将外部窗口小部件设置为与内部窗口小部件相同的大小.隐藏/显示内部窗口小部件时,它不会影响外部窗口小部件的大小,因此不会导致任何布局调整大小.
2)添加另一个小部件以及您想要隐藏的小部件,大小相同.每当您显示一个不可见的小部件时,您都会隐藏相应的可见小部件.这将有效地交换两个相同大小的小部件,因此不应该导致布局移位(尽管它将被重新计算).
3)将一个堆叠的小部件放在您想要不可见的小部件的位置,并将不可见的小部件放在一个页面上,而在另一个页面上没有小部件.适当调整堆积小部件的大小 然后,您可以根据是否要显示内部窗口小部件来更改堆叠窗口小部件的页面.请注意,这对于显示/隐藏的一个窗口小部件来说更加麻烦,但如果您有三个或更多相互排斥的选项可用于显示,则开始变得更加可行.
所有这一切的重要方面是尺寸.您可以调整我的建议以便以某种方式调整大小,但如果您希望隐形窗口小部件也是动态调整大小的话,则会更加困难.