2

から必要な動作を取得する際に問題が発生しているようです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();
}
4

1 に答える 1

3

Even after copying and pasting my code to make a test harness I had not noticed my grievous error. I had mistakenly pushed the currentStructures widget to the container's layout rather than scroll, the scrolling area after giving it its child.

An excerpt from the Qt docs on void QScrollArea::setWidget( QWidget * widget ) for those unfamiliar:

The widget becomes a child of the scroll area, and will be destroyed when the scroll area is deleted or when a new widget is set.

Thanks to everyone who looked it over.

For those wondering, the fixed code would look like the following:

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 );

Cheers!

于 2014-10-16T01:28:21.710 に答える