代码之家  ›  专栏  ›  技术社区  ›  Stephen

在qscrollarea内的qvboxlayout中为最初隐藏的小部件保留空间

  •  3
  • Stephen  · 技术社区  · 15 年前

    我使用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中,那么这个代码就完全按照我的要求工作。你跟克斯克罗拉雷亚有什么交易?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Caleb Huitt - cjhuitt    15 年前

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

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

    2)在你想看不见的东西旁边添加另一个同样大小的小部件。无论何时显示不可见的小部件,都会隐藏相应的可见小部件。这将有效地交换相同大小的两个小部件,因此不应导致布局发生变化(尽管将重新计算)。

    3)把一个堆叠的小部件放在你希望不可见的地方,把不可见的小部件放在一个页面上,在另一个页面上没有小部件。适当调整堆叠小部件的大小。然后,您可以根据是否希望内部小部件可见来更改堆叠小部件的页面。注意,对于只显示/隐藏一个小部件来说,这会更麻烦,但是如果您有三个或更多相互排斥的选项来显示什么,它就会变得更加可行。

    这一切的最大特点是尺寸。您也可以调整我的建议以考虑大小,但如果您希望不可见的小部件也动态调整大小,则会更困难。

        2
  •  4
  •   Stephen    15 年前

    我很抱歉在我最初的问题中没有说清楚。结果发现,这个问题似乎与这个小部件包含在qscrollarea中有关。当我打电话的时候 scrollArea->setWidgetResizable(true) ,一切开始完美。

    谢谢你的建议,谢尔盖和卡莱布。

        3
  •  1
  •   serge_gubenko    15 年前

    你可以尝试添加 spacer 在LayoutDelimitedChar布局中输入具有预定义最大高度的项,smth如下:

    QHBoxLayout *layoutDelimitedChar = new QHBoxLayout();
    
    layoutDelimitedChar->addSpacerItem(new QSpacerItem(0, 33, QSizePolicy::Maximum, QSizePolicy::Maximum));
    
    layoutDelimitedChar->addWidget(m_labelDelimiter);
    layoutDelimitedChar->addWidget(m_lineEditDelimiter);
    

    希望这有帮助,问候