2010-04-26 65 views
3

我正在使用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_labelDelimiterm_lineEditDelimiter既要最初不可见的,我希望自己的知名度与m_checkBoxCsv的状态切换。当它们变得可见时,我希望布局能够垂直扩展以适应它们。

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

如果我最初看到它们,那么所有事情都按照我想要的方式布置。是否有任何方法可以为这些小部件创建QVBoxLayout预留空间,即使它们最初是不可见的?

如果我不把这个小部件放到QScrollArea中,那么这段代码就像我想要的那样工作。什么是QScrollArea的交易?

回答

4

对于我原来的问题不完全清楚,我表示歉意。事实证明,这个问题似乎与QScrollArea中包含的这个小部件有关。当我打电话给scrollArea->setWidgetResizable(true)时,事情就开始奏效了。

感谢您的建议,哔叽和迦勒。

1

你可以尝试添加spacer项目到您的layoutDelimitedChar布局与预定义的最大高度,水木清华这样的:

QHBoxLayout *layoutDelimitedChar = new QHBoxLayout(); 

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

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

希望这会有所帮助,至于

5

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

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

2)添加另一个小工具旁边的那些你想要看不见,相同的大小。无论何时显示一个不可见的小部件,都会隐藏相应的可见小部件。这将有效地交换两个相同大小的小部件,所以不应该导致布局转移(尽管它将被重新计算)。

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

所有这一切的大方面是大小。您也可以根据我的建议来调整大小,但是如果您希望隐藏的小部件也可以动态调整大小,则会更困难。