1

次の最小限のサンプルコードがあります。

main.cpp:

#include <QApplication>
#include "qt.h"

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    MyDialog mainWin;
    mainWin.show();
    return app.exec();
}

qt.cpp:

#include <QLabel>
#include "qt.h"

void MyDialog::setupUi()
{
    setCentralWidget(new QWidget);
    mainLayout = new QVBoxLayout( centralWidget() );
    centralWidget()->setLayout(mainLayout);

    // show the add new effect channel button
    QPushButton* newKnobBtn = new QPushButton("new", this );
    connect( newKnobBtn, SIGNAL(clicked()), this, SLOT(addNewKnob()));
    mainLayout->addWidget( newKnobBtn, 0, Qt::AlignRight );

    containerWidget = new QWidget(this);
    scrollArea = new QScrollArea(containerWidget);
    mainLayout->addWidget(containerWidget);

    scrollLayout = new QVBoxLayout(scrollArea);
    scrollArea->setLayout(scrollLayout);

    /*
    QSizePolicy pol;
    pol.setVerticalPolicy(QSizePolicy::Expanding);
    setSizePolicy(pol);
    */

    addNewKnob(); // to fit size initially
}

void MyDialog::addNewKnob()
{
    scrollLayout->addWidget(new QLabel("Hello World", this));
    /*
    containerWidget->adjustSize();
    adjustSize();
    */
}

qt.h:

#include <QMainWindow>
#include <QVBoxLayout>
#include <QScrollArea>
#include <QPushButton>

class MyDialog : public QMainWindow
{
    Q_OBJECT
private slots:
    void addNewKnob();
private:
    void setupUi();
    QVBoxLayout* mainLayout;
    QScrollArea* scrollArea;
    QVBoxLayout* scrollLayout;
    QWidget* containerWidget;
public:
    MyDialog( ) { setupUi(); }
};

コンパイル:すべてを 1 つのディレクトリに入れ、次のように入力します。

qmake -project && qmake && make

ここから解決策がありadjustSize()ますが、機能しません: (リンク)。私がコメントアウトしたものはすべて、私が試したものの役に立たなかったものです。

新しいラベルが に追加されているときに、正しく作成containerWidgetおよび成長するにはどうすればよいですか?scrollLayoutscrollLayout

4

2 に答える 2

2

これが私のために働く簡略化されたバージョンです:

qt.cpp:

#include <QLabel>
#include <QPushButton>
#include <QScrollArea>
#include "qt.h"

MyDialog::MyDialog()
{
    QWidget * mainWidget = new QWidget;
    QBoxLayout * mainLayout = new QVBoxLayout(mainWidget);
    setCentralWidget(mainWidget);

    // show the add new effect channel button
    QPushButton* newKnobBtn = new QPushButton("new");
    connect( newKnobBtn, SIGNAL(clicked()), this, SLOT(addNewKnob()));
    mainLayout->addWidget( newKnobBtn, 0, Qt::AlignRight );

    QScrollArea * scrollArea = new QScrollArea;
    scrollArea->setWidgetResizable(true);
    mainLayout->addWidget(scrollArea);

    QWidget * labelsWidget = new QWidget;
    labelsLayout = new QVBoxLayout(labelsWidget);
    scrollArea->setWidget(labelsWidget);

    addNewKnob(); // to fit size initially
}

void MyDialog::addNewKnob()
{
    labelsLayout->addWidget(new QLabel("Hello World"));
}

qt.h:

#include <QMainWindow>
#include <QBoxLayout>

class MyDialog : public QMainWindow
{
    Q_OBJECT

public:
    MyDialog( );

private slots:
    void addNewKnob();

private:
    QBoxLayout * labelsLayout;
};
于 2013-07-28T02:42:39.543 に答える
0

あなたはcontainerWidgetそれを1つだけ含んでいますQScrollArea。なぜこれが必要なのかわかりません。ただし、何らかの理由でこれが必要な場合は、レイアウトを機能させるために、このウィジェットにレイアウトを追加する必要があります。のレイアウトも作成しないでくださいQScrollArea。すでに内部的にレイアウトが実装されています。scrollLayout代わりに、スクロール領域のviewport()ウィジェットに追加する必要があります。

レイアウトを構築してウィジェットをそのコンストラクターに渡すと、レイアウトは渡されたウィジェットに自動的に割り当てられます。それ以降は電話してはいけませんsetLayout。このアクションは効果がなく、コンソール警告が生成されます。

于 2013-07-27T20:30:07.857 に答える