Как программно изменить размер QMainWindow до минимального размера - PullRequest
5 голосов
/ 08 января 2012

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

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

Ответы [ 3 ]

2 голосов
/ 24 мая 2016

Я обнаружил, что изменение размера 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 Documentation , есть также Dock Widgets и другие вещи, которые могут присутствовать. Я использую только centralWidget, поэтому это решение работает для меня.

QMainWindow Layout

1 голос
/ 08 января 2012

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

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

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

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

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

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