Нахождение высоты QWidget перед вставкой - PullRequest
8 голосов
/ 17 сентября 2011

У меня есть виджет для вставки, который выглядит следующим образом

+--------------------+
| +-------++-------+ |
| |       ||       | |
| |       ||       | |
| |       || Label | |
| | Label || Label | |
| |       ||       | |
| |       ||       | |
| +-------++-------+ |
+--------------------+

Элемент QWidget, содержащий два QVBoxLayouts, каждый из которых содержит один или несколько QLabels.
Этот виджет будет вставлен в вертикальный макету которого есть растягивающаяся ячейка, поэтому все виджеты этого типа перейдут наверх и уменьшатся до минимально возможной высоты.

В результате чего-то вроде этого.

______________________ ← Layout boundary
+--------------------+
| +-------++-------+ |
| |       || Label | |
| | Label || Label | | ← Widget shrunk to the smallest
| +-------++-------+ |
+--------------------+
______________________ ← Layout boundary
          ↑
          |
          | ← Spacer
          |
          ↓
______________________ ← Layout boundary

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

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

Но по какой-то причине я всегда получаю 480 или 478, когда высота виджета не превышает 50 пикселей при вертикальном нажатии.Так что я полностью потерян.

Я должен сделать это, потому что мне нужно, чтобы виджет анимировался при вставке, и мне нужно было знать высоту, которая понадобится мне для анимации от высоты 1 до него.

Как я могу это сделать?

1 Ответ

6 голосов
/ 17 сентября 2011

Без точного кода трудно сказать наверняка, но, просто попытавшись воспроизвести ваш пример из приведенного выше описания, я бы посоветовал взглянуть на следующие вещи:

  1. Звучит так, как будто вы на самом деле звоните widget->height() до отображения виджета. Вместо этого попробуйте позвонить widget->sizeHint().height(). Метод QWidget :: sizeHint () сообщает вам, какой размер виджет хотел бы видеть , если родительская геометрия не накладывает на него никаких других ограничений.

  2. Если вы получаете sizeHint() и все еще получаете неправильный ответ, посмотрите документацию для QWidget :: surePolished () . Я считаю, что важно вызывать это, чтобы получить более точную геометрию для виджетов, которые еще не отображались:

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

  3. И если у вас все еще возникают проблемы, посмотрите документацию для QWidget :: sizePolicy () и класса QSizePolicy Class Ссылки . Я должен признать, что, как бы много раз я ни читал документы по enum QSizePolicy :: Policy , они никогда не впадают. Очень просто, если одно неверное значение политики размера испортит ваши макеты.

    Может быть стоит поэкспериментировать с различными политиками размеров в Qt Designer, прежде чем применять политику размеров.

...