Подтвердить что ты не робот

Как сохранить пропорции виджетов в Qt?

Как можно поддерживать соотношение сторон виджета в Qt и о центрировании виджета?

4b9b3361

Ответ 1

Вам не нужно реализовывать свой собственный менеджер макетов. Вы можете сделать с наследованием QWidget и переопределить

int QWidget::heightForWidth( int w ) { return w; }

оставаться квадратным. Тем не менее, heightForWidth() не работает в окнах верхнего уровня на X11, поскольку, по-видимому, протокол X11 не поддерживает это. Что касается центрирования, вы можете передать Qt::AlignCenter в качестве третьего параметра QBoxLayout::addWidget() или пятого параметра QGridLayout::addWidget().

Примечание: В более новых версиях Qt QWidget больше не имеет heightForWidth или widthForHeight (поэтому их нельзя переопределить), и поэтому setWidthForHeight(true) или setHeightForWidth(true) влияет только на потомков QGraphicsLayout.

Ответ 2

Правильный ответ - создать свой собственный менеджер макетов. Это возможно путем подкласса QLayout.

Способы реализации при подклассов QLayout

<Дл > void addItem (элемент QLayoutItem *), Добавляет элемент в макет. int count() const; Возвращает количество элементов. QLayoutItem * itemAt (int index) const; Возвращает ссылку на позицию в индексе или 0, если ее нет. QLayoutItem * takeAt (int index); Принимает и возвращает элемент из макета из индекса или возвращает 0, если его нет. Qt:: Orientations expandDirections() const; Возвращает направления разметки макетов. bool hasHeightForWidth() const; Сообщает, что макет обрабатывает высоту для вычисления ширины. QSize minimumSize() const; Возвращает минимальный размер макетов. void setGeometry (const QRect & rect), Устанавливает геометрию макета и элементы внутри него. Здесь вы должны поддерживать соотношение сторон и делать центрирование. QSize sizeHint() const; Возвращает предпочтительный размер для макета. Дл >

Дальнейшее чтение

Ответ 3

Вызов resize() изнутри resizeEvent() никогда не работал хорошо для меня - в лучшем случае это вызовет мерцание, когда окно будет изменено дважды (как и у вас), в худшем случае - бесконечный цикл.

Я думаю, что "правильный" способ поддерживать фиксированное соотношение сторон заключается в создании пользовательского макета. Вам придется переопределить только два метода: QLayoutItem::hasHeightForWidth() и QLayoutItem::heightForWidth().