QListWidget, который изменяет размер вместо прокрутки

Как изменить поведение элемента QListWidget, чтобы он изменял свою высоту вместо того, чтобы выбирать (на первый взгляд произвольную) высоту и добавлять полосы прокрутки? Смотрите скриншот:

снимок экрана

QListView должны занимать как можно больше места по горизонтали (создавая как можно больше «столбцов», если хотите). Затем они оборачивают и создают столько рядов, сколько необходимо, чтобы поместить все элементы. Эти расчеты следует корректировать по мере изменения размера окна. Это все работает нормально.

Однако я хочу, чтобы вместо того, чтобы высота оставалась неизменной, QListView должен увеличиваться или уменьшаться по вертикали и никогда не нуждаться в полосах прокрутки. Прокрутка, при необходимости, будет выполняться на родительском элементе QWidget, в котором размещены все метки и списки. Похоже, что после того, как высота QListWidget установлена ​​(не знаю, откуда берется ее значение по умолчанию), она никогда не меняется. В некоторых случаях он слишком велик (см. второй список «Тест» выше) и слишком мал в других (см. выше первый список «пустых карт»).

В схеме выше нет ничего удивительного: две QLabel и две QListWidget в QVBoxLayout. Вот свойства, которые я установил для QListWidget:

setMovement(QListView::Static);
setResizeMode(QListView::Adjust);
setViewMode(QListView::IconMode);
setIconSize(QSize(128, 128));

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


person Dave Mateer    schedule 10.09.2010    source источник


Ответы (2)


Возможно, вы могли бы это сделать без использования QListWidget. Примеры Qt содержат новый класс макета QFlowLayout, который может быть полезен. С помощью следующего вида иерархии виджетов вы можете получить несколько групп с метками, и все они будут внутри одной области QScrollArea.

QScrollBox
  QVBoxLayout

    QLabel "Blank maps"
    QWidget
       QFlowLayout
          your own widgets showing map images and labels

    QLabel "Text"
    QWidget
       QFlowLayout
          your own widgets

Проблема в том, что такое решение создаст гораздо больше виджетов, чем решение на основе QListWidget. Поэтому, если в вашем списке сотни элементов, это может быть не лучшим решением.

person Community    schedule 10.09.2010
comment
Хорошо, это очень, очень близко. Это прекрасно работает, пока QScrollBox не отображается на картинке. Как только я добавлю это, QVBoxLayout становится настолько тонким, насколько это возможно, и настолько длинным, насколько это возможно. (Он возвращает sizeHint для QSize(197, 942). Я перепробовал все комбинации QWidget::setSizePolicy и QLayout::setSizeConstraint, о которых только мог подумать, и ничего не меняет это поведение. В чем секрет? - person Dave Mateer; 10.09.2010
comment
QScrollArea::setWidgetResizable() ЗА. . ПОБЕДА!!! Большое спасибо за вашу помощь ... Я потерял 2 дня, идя по этой QListWidget кроличьей тропе. - person Dave Mateer; 10.09.2010

Существует защищенная функция-член с именем contentsSize() в QListView. Он используется для расчета необходимых minimum(), maximum() и pageStep() для полос прокрутки (как уже упоминалось здесь).

Можете ли вы создать подкласс класса QListView и использовать эту информацию? Я предлагаю вам пересчитать размер вашего виджета в той же функции, где вы добавляете к нему содержимое. Хотя ему несколько не хватает элегантности, это кажется довольно надежным решением.

person dpq    schedule 10.09.2010
comment
Это свойство выглядит полезным, но я действительно не уверен, как его использовать. Какой метод с таким размером я могу вызвать для QListWidget, чтобы заставить его иметь это значение? (Или изменить размер подсказки?) Извините, я относительно новичок в Qt, и это мне очень непонятно. Спасибо за вашу помощь! - person Dave Mateer; 10.09.2010
comment
Вы можете установить sizeHint на этот размер и установить sizeHintPolicy на Fixed; или используйте метод setGeometry(). Отказ от ответственности: я не проверял то, что предлагаю здесь, но я почти уверен, что это сработает. - person dpq; 11.09.2010
comment
Я унаследовал QListWidget и переопределил sizeHint(), чтобы вернуть contentsSize(). Оно работает! Спасибо. - person swongu; 01.03.2011