Почему размер QScrollArea ограничен?

К моему настраиваемому виджету, унаследованному от QWidget, я добавил QScrollArea следующим образом:

MainWindow::MainWindow(QWidget *parent) :
    QWidget(parent)//MainWindow is a QWidget
{
    auto *scrollArea = new QScrollArea(this);
    auto *widget = new QWidget(this);

    widget->setStyleSheet("background-color:green");

    scrollArea->setWidget(widget);
    scrollArea->setWidgetResizable(true);
    scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    QVBoxLayout *parentLayout = new QVBoxLayout(widget);

    this->setStyleSheet("background-color:blue");

    for(int i=0;i<12;i++){
        QHBoxLayout* labelLineEdit = f1();
        parentLayout->addStretch(1);
        parentLayout->addLayout(labelLineEdit);
    }

    parentLayout->setContentsMargins(0,0,40,0);
}

QHBoxLayout* MainWindow::f1()
{

    QHBoxLayout *layout = new QHBoxLayout;

    QLabel *label = new QLabel("Movie");
    label->setStyleSheet("background-color:blue;color:white");
    label->setMinimumWidth(300);
    label->setMaximumWidth(300);

    layout->addWidget(label);

    QLineEdit *echoLineEdit = new QLineEdit;
    echoLineEdit->setMaximumWidth(120);
    echoLineEdit->setMaximumHeight(50);
    echoLineEdit->setMinimumHeight(50);

    echoLineEdit->setStyleSheet("background-color:white");

    layout->addWidget(echoLineEdit);

    layout->setSpacing(0);

    return layout;
}

Это создает окно, которое выглядит следующим образом:

введите описание изображения здесь

Проблема в том, что я хочу, чтобы scrollArea занимал все окно, но это не так. Он также не изменяется, когда я изменяю размер окна.

Как я мог это исправить?


person adi    schedule 14.08.2018    source источник
comment
Почему ваш MainWindow наследуется от QWidget, а не от QMainWindow?   -  person scopchanov    schedule 14.08.2018
comment
добавьте в конец конструктора MainWindow (после parentLayout->setContentsMargins(0,0,40,0);) следующее: auto *l = new QVBoxLayout(this); l->addWidget(scrollArea);   -  person scopchanov    schedule 14.08.2018
comment
@scopchanov Ваш вопрос не имеет смысла, то есть класс MainWindow обязательно должен наследовать от QMainWindow, где это указано?   -  person eyllanesc    schedule 14.08.2018
comment
@eyllanesc, я спрашиваю, есть ли особая причина не наследовать от QMainWindow.   -  person scopchanov    schedule 14.08.2018
comment
@eyllanesc, потому что, если он унаследовал от QMainWindow, решением было бы просто добавить: setCentralWidget(scrollArea);.   -  person scopchanov    schedule 14.08.2018
comment
@scopchanov ммм, но это было бы изменение того, что хочет спрашивающий, не так ли? Решение состоит в том, чтобы просто установить макет для виджета и в этом макете установить QScrollArea, который похож на setCentralWidget.   -  person eyllanesc    schedule 14.08.2018
comment
@eyllanesc, ты прав. Вот почему мой следующий комментарий предлагал это решение с макетом.   -  person scopchanov    schedule 14.08.2018
comment
@scopchanov Я тоже думаю, что этот вопрос задавали много раз, позже буду искать дубликат. :)   -  person eyllanesc    schedule 14.08.2018
comment
@eyllanesc, поэтому я не тороплюсь начинать составлять ответ;)   -  person scopchanov    schedule 14.08.2018
comment
Позвольте нам продолжить это обсуждение в чате.   -  person scopchanov    schedule 14.08.2018
comment
Приведенный выше код является частью настраиваемого виджета, поэтому я унаследовал QWidget, а не QMainWindow.   -  person adi    schedule 14.08.2018
comment
@adi, а у тебя решение работает?   -  person scopchanov    schedule 14.08.2018
comment
@ scopchanov..Это рабочий ... извиняюсь за задержку с ответом .. не могли бы вы добавить это в качестве ответа ..   -  person adi    schedule 14.08.2018
comment
@ scopchanov .. не могли бы вы добавить это в качестве ответа, чтобы я мог отметить это и кратко рассказать о значении этих строк, чтобы я мог правильно понять решение ....   -  person adi    schedule 14.08.2018
comment
@scopchanov: Если вы не возражаете, не могли бы вы взглянуть на это stackoverflow.com/questions/52426751/ вопрос !!   -  person adi    schedule 20.09.2018


Ответы (1)


Проблема в том, что я хочу, чтобы scrollArea занимала все окно, но это не так. Он также не изменяется, когда я изменяю размер окна.

Причина в том, что вы не установили какой-либо макет для управления позиционированием самого виджета QScrollArea, поэтому он просто предоставляется его собственным устройствам (и поэтому он просто выбирает для себя размер и расположение по умолчанию и остается в тот размер и расположение).

Простое исправление - добавить эти строки в конец вашего MainWindow конструктора:

QBoxLayout * mainLayout = new QVBoxLayout(this);
mainLayout->setMargin(0);
mainLayout->addWidget(scrollArea);
person Jeremy Friesner    schedule 16.08.2018