QListWidget, который изменяет размеры вместо прокрутки - PullRequest
6 голосов
/ 10 сентября 2010

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

screen shot

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 10 сентября 2010

Может быть, вы могли бы это сделать без использования 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. Поэтому, если в вашем списке сотни предметов, это может быть не лучшим решением.

3 голосов
/ 10 сентября 2010

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

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

...