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

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

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

3 ответа

Решение

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

    QWidget widget;
    widget.resize(widget.width(), widget.minimumHeight());

Я обнаружил, что изменение размера 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 Layout

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

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

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

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