Как я могу поместить QFormLayout в scrollArea?

Моя программа имеет главное окно, которое создает виджет с именем wdg. Этот виджет имеет QFormLayout со 193 строками. Я хочу иметь возможность прокручивать QFormLayout. Я попытался создать QScrollArea и интегрировать его с макетом и виджетом, но это приводит к тому, что виджет не отображается или полоса прокрутки не отображается. Я думаю, что это как-то связано с тем, что высота нового окна кажется такой же длинной, как и полный макет, и выходит за пределы экрана. Я попытался установить геометрию виджета на ограниченный размер, но он просто изменил положение, а не размер. Результаты в виджете не отображаются:

QWidget *wdg = new QWidget;
QScrollArea *scroll = new QScrollArea;
QFormLayout *formLayout = new QFormLayout(wdg);
int lenght = keys.size();
        for(int x=0; x<=lenght-1; x++)
{

            QComboBox* combo = new QComboBox;
            combo->addItem("Present");
            combo->addItem("Present and Voting");
            combo->addItem("Absent");
            combo->addItem("Absent from Commitee");
            combo->setProperty("MyIndex", x);
            combo->setCurrentIndex(status[x]);
 formLayout->addRow(keys.at(x),combo);
connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(roll(int)));

}
scroll->setWidget(wdg);
 wdg->setLayout(formLayout);

wdg->show();

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

QWidget *wdg = new QWidget;
QScrollArea *scroll = new QScrollArea(wdg);
QFormLayout *formLayout = new QFormLayout();
int lenght = keys.size();
        for(int x=0; x<=lenght-1; x++)
{

            QComboBox* combo = new QComboBox;
            combo->addItem("Present");
            combo->addItem("Present and Voting");
            combo->addItem("Absent");
            combo->addItem("Absent from Commitee");
            combo->setProperty("MyIndex", x);
            combo->setCurrentIndex(status[x]);
 formLayout->addRow(keys.at(x),combo);
 connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(roll(int)));

}
scroll->setLayout(formLayout);


wdg->show();

person Abhi Garg    schedule 04.03.2018    source источник
comment
Еще одна вещь, которую я заметил, это то, что даже без области прокрутки всякий раз, когда я пытаюсь увеличить высоту виджета, он исчезает, и я не могу заставить его снова появиться без перезапуска программы.   -  person Abhi Garg    schedule 04.03.2018
comment
Вы проверили этот сообщение .. это может помочь   -  person Mohammad Kanan    schedule 04.03.2018


Ответы (1)


Вы должны создать виджет, который содержит QFormLayout, а затем установить этот виджет в QScrollArea, а QScrollArea вы должны установить его в виджете wdg через другой макет:

QWidget *wdg = new QWidget;
QScrollArea *scroll = new QScrollArea;

QWidget *content_widget = new QWidget;

QFormLayout *formLayout = new QFormLayout(content_widget);

QStringList items{"Present", "Present and Voting", "Absent", "Absent from Commitee"};

for(int x=0; x < keys.size(); x++)
{

    QComboBox *combo = new QComboBox;
    combo->addItems(items);
    combo->setProperty("MyIndex", x);
    combo->setCurrentIndex(status[x]);
    formLayout->addRow(keys.at(x),combo);
    connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(roll(int)));
}

scroll->setWidget(content_widget);
wdg->setLayout(new QVBoxLayout);
wdg->layout()->addWidget(scroll);
wdg->show();

Выход:

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

в следующей ссылке есть пример.

person eyllanesc    schedule 04.03.2018
comment
Большое спасибо. Есть ли причина, по которой это работает с компилятором MSVC, а не с MINGW? - person Abhi Garg; 05.03.2018
comment
@AbhiGarg Вы получаете сообщение об ошибке? Что значит не работает? У вас одинаковая версия Qt для обоих компиляторов? - person eyllanesc; 05.03.2018
comment
Он не показывает ошибку, он просто показывает контурную рамку внутри виджета и не формирует макет. У меня одинаковая версия для обоих компиляторов - person Abhi Garg; 05.03.2018
comment
@AbhiGarg Я думаю, это ошибка, проверьте правильность установки, я пробовал это с mingw в Linux и Windows, и все работает нормально. - person eyllanesc; 05.03.2018