在QScrollArea中为QVBoxLayout中最初隐藏的小部件预留空间
我正在使用QVBoxLayout来安排垂直堆叠的小部件。 QVBoxLayout包含在QScrollArea中。我想要一些小部件最初隐藏起来,只有当复选框被选中时才显示出来。这里是我使用的代码的一个例子。在QScrollArea中为QVBoxLayout中最初隐藏的小部件预留空间
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的交易?
对于我原来的问题不完全清楚,我表示歉意。事实证明,这个问题似乎与QScrollArea中包含的这个小部件有关。当我打电话给scrollArea->setWidgetResizable(true)
时,事情就开始奏效了。
感谢您的建议,哔叽和迦勒。
你可以尝试添加spacer项目到您的layoutDelimitedChar布局与预定义的最大高度,水木清华这样的:
QHBoxLayout *layoutDelimitedChar = new QHBoxLayout();
layoutDelimitedChar->addSpacerItem(new QSpacerItem(0, 33, QSizePolicy::Maximum, QSizePolicy::Maximum));
layoutDelimitedChar->addWidget(m_labelDelimiter);
layoutDelimitedChar->addWidget(m_lineEditDelimiter);
希望这会有所帮助,至于
有几个方法可以做到这一点。
1)将你最初看不见的小部件添加到不同的小部件,并将其他小部件放到你需要的空间中。将外部小部件设置为与内部小部件相同的大小。当您隐藏/显示内部小部件时,它不会影响外部小部件的大小,因此不会导致任何布局调整大小。
2)添加另一个小工具旁边的那些你想要看不见,相同的大小。无论何时显示一个不可见的小部件,都会隐藏相应的可见小部件。这将有效地交换两个相同大小的小部件,所以不应该导致布局转移(尽管它将被重新计算)。
3)把一个堆叠的小部件放到你想要看不见的部件的地方,并将一个不可见的小部件放在一个页面上,在另一个页面上没有小部件。适当地调整堆叠的小部件然后,您可以根据是否希望内部窗口小部件可见,更改堆叠窗口小部件的页面。请注意,这对于显示/隐藏的一个小部件来说更麻烦,但如果您有三个或更多的互斥选项来显示内容,它开始变得更加可行。
所有这一切的大方面是大小。您也可以根据我的建议来调整大小,但是如果您希望隐藏的小部件也可以动态调整大小,则会更困难。