Qt - QScrollArea - выравнивание добавленных виджетов вверху

У меня есть 150x450 QScrollArea с VBoxLayout. Я должен динамически (во время воспроизведения видео, кадр за кадром) добавлять неопределенное количество QLabels, от нуля до сотен.

Когда я начинаю добавлять, QLabels начинают появляться ровно посередине. Затем, когда появляется другой, они сдвигаются так, что середина оказывается точно между ними. Так далее и тому подобное.

Как я могу заставить их появляться с самого верха и просто спускаться вниз? Без смены позиций и покачивания?


person Petersaber    schedule 12.06.2015    source источник
comment
Используйте растяжку: doc.qt.io/qt-5.4/qboxlayout.html#addStretch   -  person Amartel    schedule 12.06.2015
comment
Может быть, QVBoxLayout::addStretch(1) в нижней части макета поможет? Это подтолкнет весь контент наверх.   -  person vahancho    schedule 12.06.2015
comment
@vahancho, который начинается снизу, и они все еще сильно трясутся каждый раз, когда добавляются. Но это толчок в правильном направлении, я покопаюсь в этом.   -  person Petersaber    schedule 12.06.2015
comment
@Petersaber, вам нужно разместить растяжку внизу макета: layout->addWidget(w1); layout->addWidget(w2); [..] layout->addWidget(w100); layout->addStretch(1);. С другой стороны, если вы хотите постепенно добавлять новые элементы, почему бы вам не использовать QTableView или QTableWidget?   -  person vahancho    schedule 12.06.2015
comment
@vahancho, я действительно забыл упомянуть. Я добавляю эти QLabels в прямом эфире, пока воспроизводится видео, из разных потоков... так что это решение невозможно.   -  person Petersaber    schedule 12.06.2015
comment
@Petersaber, почему нельзя? Вы не можете добавлять новые строки в таблицу во время выполнения? Также обратите внимание, что наличие сотен меток в приложении будет стоить вам много памяти и производительности.   -  person vahancho    schedule 12.06.2015
comment
@vahancho это потому, что в вашем решении метки будут выравниваться сверху ПОСЛЕ того, как видео будет воспроизведено, а не один за другим. Мне пришлось бы добавлять растяжку после каждого кадра в макете, созданном с помощью конструктора, а не строки кода, и по какой-то причине он отказывается прокручиваться (новые метки в конечном итоге перекрывают друг друга). Я действительно не хочу перемещать функцию из одного cpp в другой только для того, чтобы komunikatyLayout (созданный из кода, а не Designer) был обнаружен QtCreator (в противном случае он выдает ошибку)   -  person Petersaber    schedule 12.06.2015
comment
@vahancho, ты не шутил о влиянии на производительность. Мне придется все переосмыслить. Может быть, иметь не более 15 меток, которые очищаются после заполнения поля, что устраняет необходимость в полосе прокрутки. Или, может быть, есть другой, менее требовательный к производительности способ отображения сотен ошибок..... Я все еще новичок в Qt   -  person Petersaber    schedule 12.06.2015
comment
Я согласен с последней идеей @vahancho. Я настоятельно рекомендую использовать QTableView или здесь даже QListview. У них уже есть такое поведение макета, и вы сможете без особых проблем стилизовать их по своему вкусу.   -  person Bowdzone    schedule 12.06.2015
comment
@vahancho с использованием listView было прекрасной идеей. Спасибо! Не стесняйтесь опубликовать это как ответ   -  person Petersaber    schedule 12.06.2015


Ответы (1)


Наличие сотен меток в приложении и размещение их в области прокрутки будет стоить вам много памяти и производительности. С другой стороны, Qt имеет ряд выделенных классов для обработки нескольких элементов в области прокрутки, таких как: QTableWidget, QListWidget, QTableView и т. д. Все эти классы предназначены для обработки рядов элементов и имеют все соответствующие функции. Их использование избавит вас от забот о макетах, прокрутке и так далее.

person vahancho    schedule 12.06.2015