LINUX.ORG.RU

Qt4 QScrollArea скроллинг


0

0

Имеется некий аналог плейлиста в видеоплеере.

scrollArea = new QScrollArea();
scrollAreaWidgetContents = new QWidget();
scrollArea->setWidget(scrollAreaWidgetContents);

После этого добавляю в layout scrollAreaWidgetContents (QVBoxLayout) много виджетов.

Каким образом сделать так, чтобы QScrollArea прокрутилась до нужного мне виджета?

Пока делаю так:

MyWidget *selectedWidget = findWidget(id);
selectedWidget->mark();
_ui->scrollArea->ensureWidgetVisible(selectedWidget , 0, 0);

После этого видно, что данный виджет стал «выбранным» (после mark()), но QScrollArea до него не прокрутилась.


Попробуйте после добавления много виджетов в лейоут вызвать:

scrollArea->widget()->adjustSize();
Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Это не помогло. Видимо дело в другом.

uKCuH
() автор топика

У меня была похожая проблема, в мануале написано нечто странное на эту тему - что вроде как бы

scrollArea->setWidget(scrollAreaWidgetContents);
надо вызывать уже после того, как дочерние виджеты напиханы в scrollAreaWidgetContents. Хотя это, конечно, странно.

master1312
()
Ответ на: комментарий от master1312

По идее, не обязательно дочерние виджеты заранее пихать, нужно только layout заранее устанавливать:

Note that You must add the layout of widget before you call this function; if you add it later, the widget will not be visible - regardless of when you show() the scroll area. In this case, you can also not show() the widget later.

Хотя у ТС scrollAreaWidgetContents видим почему-то.

dt1 ★★
()
Ответ на: комментарий от master1312

Да, сделал чтобы дочерние элементы добавлялись в первую очередь. А затем парент виджет устанавливаю в QScrollArea и всё работает как надо. :)

uKCuH
() автор топика
Ответ на: комментарий от dt1

Возможно из-за того, после того как все дочерние элементы довлялись, я вызывал:

_ui->scrollAreaWidgetContents->show();

uKCuH
() автор топика
Ответ на: комментарий от uKCuH

Только что проверил, поведение отличается в зависимости добавлять ли виджеты перед QScrollArea::setWidget() или после. Подозрение, что сам QScollArea навешивает фильтры событий на виджет. В предыдущем проекте достаточно было сделать scrollArea->widget()->resize( ... ) и всё нормально работало.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.