Размер дочернего виджета QScrollArea устанавливается в соответствии с изменением размера родительского элемента

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

Прилагаю картинки для лучшего понимания.

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

Черный ящик — это то место, где я хочу, чтобы мой свиток появился. Поскольку, когда мы уменьшаем размер окна, иногда полоса прокрутки не видна (как показано на рисунке ниже), она выглядит недостаточно элегантно для больших проектов.

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

Пожалуйста, помогите мне с тем же, спасибо заранее.

Вот пример кода, который я использовал, например:

int main(int argc, char *argv[]){
QApplication a(argc, argv);
QScrollPractice w;

QDialog * dlg = new QDialog(); 
//dlg->setGeometry(100, 100, 260, 260);
dlg->setMinimumSize(150, 200);

QScrollArea *scrollArea = new QScrollArea(dlg);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
scrollArea->setWidgetResizable(true);
//scrollArea->setGeometry(10, 10, 200, 200);
//scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored);
//QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
scrollArea->setSizePolicy(sizePolicy);

QWidget *widget = new QWidget(scrollArea);
scrollArea->setWidget(widget);

QVBoxLayout *layout = new QVBoxLayout(widget);
widget->setLayout(layout);

for (int i = 0; i < 10; i++)
{
    QPushButton *button = new QPushButton(QString("%1").arg(i));
    layout->addWidget(button);
    }

dlg->show();

return a.exec();

}


person Kita    schedule 21.01.2020    source источник


Ответы (1)


В вашем диалоговом окне также отсутствует макет. Вот почему виджет scrollArea не распространяется по всему диалоговому окну.

#include <QApplication>
#include <QDialog>
#include <QScrollArea>
#include <QVBoxLayout>
#include <QPushButton>

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

    QDialog* dlg = new QDialog();

    dlg->setMinimumSize(150, 200);

    QScrollArea* scrollArea = new QScrollArea(dlg);
    scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    scrollArea->setWidgetResizable(true);

    QWidget* widget = new QWidget(scrollArea);
    scrollArea->setWidget(widget);

    QVBoxLayout* dlgLayout = new QVBoxLayout();
    dlg->setLayout( dlgLayout );
    dlgLayout->addWidget( scrollArea );
    QVBoxLayout* layout = new QVBoxLayout(widget);
    widget->setLayout(layout);

    for (int i = 0; i < 10; i++)
    {
        QPushButton* button = new QPushButton(QString("%1").arg(i));
        layout->addWidget(button);
    }

    dlg->show();

    return a.exec();
}

Я изменил ваш код, чтобы он запускался и компилировался, а также добавил еще один QVBoxLayout и добавил его в диалоговое окно. Затем к этому макету добавляется scrollArea. Надеюсь это поможет.

person Taron    schedule 21.01.2020