Как программно изменить размер 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
так что это решение работает для меня.
Существует иерархия между QLayout:: SizeConstraint, QWidget:: MinimSizeHint, QWidget:: MinimumSize, и вы можете найти ее в документации.
QWidget::minimumSize
не установлено по умолчанию. Когда это так, оно превалирует надQWidget::minimumSizeHint
QWidget::minimumSizeHint
Недопустимо, если виджет не находится в макете (это означает, что он может быть изменен до 0 с помощью мыши), в противном случае используйте тот, который определен макетом.QLayout::SizeConstraint
содержит поведение макета по умолчанию для виджетов, которыми он * напрямую * управляет. Если вы вложите макетA
в макетеB
все виджеты добавлены вA
будет использовать свою собственность. Также если виджетW
вB
определить свой собственный макет, то это ограничения макета, которые будут применяться для виджетаW
,
Зная это, выполните следующие действия. Это может сработать, я не пробовал:)
- Установите минимальный размер всех используемых вами виджетов.
- Убедитесь, что ограничение размера всех ваших макетов установлено на
QLayout::SetDefaultConstraint
,