Как можно поддерживать соотношение сторон виджета в Qt и о центрировании виджета?
Как сохранить пропорции виджетов в Qt?
Ответ 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()
.