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