【问题标题】:Having a QScrollArea dynamically fit its parent but does not expand for its children让 QScrollArea 动态适合其父级,但不会为其子级扩展
【发布时间】:2014-10-16 09:28:21
【问题描述】:

我似乎在从QScrollArea 获得我想要的行为时遇到问题。就目前而言,每当我将某些内容添加到设置为滚动区域目标的小部件的布局中时,它都会选择扩展整个窗口而不是适合滚动。

这是我目前的设置:

QSplitter * mainArea = new QSplitter( Qt::Vertical );

QWidget * containment = new QWidget;
containment->setLayout( new QVBoxLayout );

currentStructures = new QWidget;
currentStructures->setLayout( new QVBoxLayout );
currentStructures->layout()->setAlignment( Qt::AlignTop );

QScrollArea * scroll = new QScrollArea();
scroll->setWidget( currentStructures );

containment->layout()->addWidget( currentStructures );
mainArea->addWidget( containment );

mainArea->addWidget( new QWidget ); //TODO: create preview bar

this->layout()->addWidget( mainArea );

这使得滚动区域只会扩展而不会显示滚动条。

通过插入这一行:

containment->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Ignored );

我可以让该区域忽略其子项的大小,但它也不会占用所需的空间,也不会显示滚动条——它只是压缩其中的小部件。

我对使用 Qt 有点陌生,但我想知道如何实现我需要的行为:我希望滚动区域贪婪地占用其父布局中可用的区域,但不是添加时垂直扩展包含布局,但实际上显示滚动条。我计划允许大量调整大小,因此它需要实际缩放到父级,而不仅仅是固定大小。我不知道应该如何着手解决我的 GUI 的这方面问题。感谢您的宝贵时间。

如果您想直观地解决这个问题,这里有一个可以使用的线束。非常感谢您的帮助。

#include <QtWidgets\qapplication.h>
#include <QtWidgets\qsplitter.h>
#include <QtWidgets\qlayout.h>
#include <QtWidgets\qscrollarea.h>
#include <QtWidgets\qpushbutton.h>
#include <QtWidgets\qlabel.h>
#include <QtWidgets\qsizepolicy.h>

int main( int argc, char * argv[] )
{
    QApplication app( argc, argv );

    QWidget * testWidget = new QWidget;
    testWidget->setLayout( new QVBoxLayout );

    //////////////////CODE IN QUESTIION//////////////////////
    QSplitter * mainArea = new QSplitter( Qt::Vertical );

    QWidget * containment = new QWidget;
    containment->setLayout( new QVBoxLayout );

    //containment->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Ignored );

    QWidget * currentStructures = new QWidget;
    currentStructures->setLayout( new QVBoxLayout );
    currentStructures->layout()->setAlignment( Qt::AlignTop );

    QScrollArea * scroll = new QScrollArea();
    scroll->setWidget( currentStructures );

    containment->layout()->addWidget( currentStructures );
    mainArea->addWidget( containment );
    ///////////////////////////////////////////////////////////

    QPushButton * pushIntoLayout = new QPushButton( "Add Element to Widget" );
    QWidget::connect( pushIntoLayout, &QPushButton::clicked, [currentStructures](){ currentStructures->layout()->addWidget( new QLabel( "A generated label" ) ); } );
    mainArea->addWidget( pushIntoLayout );
    currentStructures->setStyleSheet(
        "QWidget {"
            "background-color: #FAA;"
        "}" 
    );


    testWidget->layout()->addWidget( mainArea );

    testWidget->show();
    return app.exec();
}

【问题讨论】:

  • 能否提供测试代码,不能重复您的问题。
  • 好的,我会做一个快速简洁的测试用例并尽快追加问题。

标签: c++ qt qscrollarea


【解决方案1】:

即使在复制并粘贴我的代码以制作测试工具之后,我也没有注意到我的严重错误。我错误地将currentStructures 小部件推送到容器的布局,而不是scroll,这是给它孩子之后的滚动区域。

摘自 Qt docs 上的 void QScrollArea::setWidget( QWidget * widget ) 给不熟悉的人:

widget 成为滚动区域的子项,并在删除滚动区域或设置新的widget 时销毁。

感谢所有查看它的人。

对于那些想知道的人,固定代码如下所示:

QSplitter * mainArea = new QSplitter( Qt::Vertical );

QWidget * containment = new QWidget;
containment->setLayout( new QVBoxLayout );

QWidget * currentStructures = new QWidget;
currentStructures->setLayout( new QVBoxLayout );
currentStructures->layout()->setAlignment( Qt::AlignTop );

QScrollArea * scroll = new QScrollArea();
scroll->setWidget( currentStructures );
scroll->setWidgetResizable( true );

containment->layout()->addWidget( scroll );
mainArea->addWidget( containment );

mainArea->addWidget( new QWidget ); //TODO: create preview bar

this->layout()->addWidget( mainArea );

干杯!

【讨论】:

  • 非常感谢,解决了我的问题!这让我很沮丧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多