QListWidget, что изменяет, а не свитки

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

screen shot

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

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

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

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

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

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


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

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