Размер дочернего виджета QScrollArea, установленный в соответствии с изменением размера родителей - PullRequest
1 голос
/ 21 января 2020

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

Я приложил фотографии для лучшего понимания.

enter image description here

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

enter image description here

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

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

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

} ​​

1 Ответ

0 голосов
/ 21 января 2020

В вашем диалоге также отсутствует макет. По этой причине виджет 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 добавляется к этому макету. Надеюсь, это поможет.

...