Как программно изменить размер QMainWindow до минимального размера

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

Могу ли я программно установить вертикальный размер диалогового окна на этот минимум, который я получаю при изменении размера вручную после того, как я скрыл в нем элементы управления?


person sashoalm    schedule 08.01.2012    source источник
comment
+1 Меня это тоже расстраивает.   -  person Joseph Quinsey    schedule 08.01.2012
comment
Только что понял, смотрите мой ответ ниже.   -  person sashoalm    schedule 08.01.2012


Ответы (3)


Я обнаружил, что изменение размера centralWidget в QMainWindow, а затем изменение размера самого QMainWindow помогает. Другими словами:

from PyQt4 import QtGui
class MyMainWindow(QtGui.QMainWindow):
    def __init__(self):
        # define some widgets and stuff
    def whenWidgetsAreHidden(self):
        # this method should be triggered when you hide your widgets
        self.centralWidget.adjustSize()
        self.adjustSize()

Обратите внимание, что в QMainWindowLayout есть и другие виджеты. Согласно этому изображению из Документация Qt, есть также Dock Widgets и другие вещи что могло бы присутствовать. Я использую только centralWidget, поэтому это решение работает для меня.

Макет QMainWindow

person wesanyer    schedule 24.05.2016

Существует иерархия между QLayout::SizeConstraint, QWidget::minimumSizeHint, QWidget::minimumSize, и вы можете найти его в документации .

  • QWidget::minimumSize не установлен по умолчанию. Когда это так, оно преобладает над QWidget::minimumSizeHint
  • QWidget::minimumSizeHint недействителен, если виджет не находится в макете (это означает, что его размер можно изменить до 0 с помощью мыши), в противном случае используйте виджет, определенный макетом.
  • QLayout::SizeConstraint содержит поведение макета по умолчанию для виджетов, которыми он *напрямую* управляет. Если вы вложите макет A в макет B, все виджеты, добавленные в A, будут использовать его свойство. Кроме того, если виджет W в B определяет свой собственный макет, то ограничения этого макета применяются к виджету W.

Зная это, выполните следующие действия. Это может сработать, я не пробовал :) :

  • Установите минимальный размер всех виджетов, которые вы используете.
  • Убедитесь, что ограничение размера всех ваших макетов установлено на QLayout::SetDefaultConstraint.
person UmNyobe    schedule 08.01.2012

Этот код сделает свое дело (он изменяет размер только по высоте):

    QWidget widget;
    widget.resize(widget.width(), widget.minimumHeight());
person sashoalm    schedule 08.01.2012
comment
Чем это отличается от widget.resize(widget.width(), 1)? И есть ли разница между 0 и 1? (Я новичок, как вы можете заметить.) - person Joseph Quinsey; 08.01.2012
comment
Вы имеете в виду, что widget.minimumHeight() возвращает 0? Я предполагал, что она возвращает минимальный размер, необходимый для размещения всех элементов управления, но я не проверял фактическое значение, возвращаемое функцией. - person sashoalm; 12.01.2012
comment
Это было полезно, поскольку при использовании виджетов док-станции можно получить высоту верхнего/нижнего виджета док-станции, а затем установить минимальный размер MainWindow на его текущую высоту за вычетом высоты виджета док-станции, который вы хотите скрыть. - person guitarpicva; 17.11.2017