Виджеты в QScrollArea не занимают доступный размер
Введите: базовый код. Создает 25 QPushButtons
завернутый в QWidget
с QVBoxLayout
, который QWidget
) является единственным потомком top-QVBoxLayout, который обрабатывает размещение виджетов в нашем топе scroll_area_test-QWidget
, Второй QWidget
упаковка может показаться излишней, но пригодится позже.
#include <QVBoxLayout>
#include <QScrollArea>
#include <QWidget>
#include <QPushButton>
#include <QApplication>
/*
* This declaration actually lives in its own header file,
* but for simplicity's sake this code includes it here directly.
*/
class scroll_area_test : public QWidget {
Q_OBJECT
public:
scroll_area_test ();
};
scroll_area_test::scroll_area_test () {
QVBoxLayout *top_layout = new QVBoxLayout (this);
QWidget *contents = new QWidget (this);
top_layout->addWidget (contents);
QVBoxLayout* inner_layout = new QVBoxLayout (contents);
for (size_t i = 0; i < 25; ++i) {
QPushButton *tmp_button = new QPushButton (this);
inner_layout->addWidget (tmp_button);
}
}
int main (int argc, char **argv) {
QApplication app (argc, argv);
scroll_area_test widget;
widget.show();
return (app.exec ());
}
Это отлично работает. Это производит окно с 25 кнопками, спрятанными друг на друге. Учитывая, что у меня достаточно высокое разрешение экрана, я вижу полное окно. Все денди.
Но подождите, что если разрешение пользователя будет ниже моего? Окно было бы слишком большим, чтобы поместиться на их экранах! Увы, есть решение для таких ситуаций. Войти: QScrollArea
,
scroll_area_test::scroll_area_test () {
QVBoxLayout *top_layout = new QVBoxLayout (this);
QScrollArea *scrolling_area = new QScrollArea (this);
scrolling_area->setWidgetResizable (true);
scrolling_area->setFocusPolicy (Qt::NoFocus);
top_layout->addWidget (scrolling_area);
QWidget *contents = new QWidget (this);
//contents->setSizePolicy (QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
QVBoxLayout* inner_layout = new QVBoxLayout (contents);
//inner_layout->setSizeConstraint (QLayout::SetMinimumSize);
for (size_t i = 0; i < 25; ++i) {
QPushButton *tmp_button = new QPushButton (this);
inner_layout->addWidget (tmp_button);
}
scrolling_area->setWidget (contents);
}
Я ожидаю, что это не изменит макет в моей системе, так как есть достаточно места для отображения всех виджетов.
Тем не менее, это новый вывод:
Что я делаю неправильно? Я хочу, чтобы область прокрутки изменяла размеры до размера своего ребенка автоматически (следовательно, setWidgetResizable (true)
), ограниченный максимальным размером окна. Это не похоже на случай здесь. Размер содержащего виджета не учитывается должным образом, и поэтому область прокрутки а) меньше по высоте, чем должна быть, и б) больше ширины, чем должна быть, по сравнению с внешним видом без переноса QWidget
в QScrollArea
,
Я уже поиграл с ограничениями размера и политиками (показанными закомментированным кодом), но они ничего не изменили визуально.
NB: я столкнулся с этой проблемой в гораздо более сложной ситуации, но смог абстрагировать ее до этого примера.
1 ответ
Вам необходимо установить политику размера для вашего QScrollArea
объект.
Установите политику фиксированной как по горизонтали, так и по вертикали, как указано ниже.
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
scrolling_area->setSizePolicy(sizePolicy);