Как изменить размер QMainWindow после удаления всех DockWidgets? - PullRequest
6 голосов
/ 11 августа 2011

Я пытаюсь сделать приложение, состоящее из QMainWindow, центральным виджетом которого является QToolBar (это может быть не обычно, но для моей цели панель инструментов хорошо подходит).Доки разрешены только ниже.Я добавил QDockWidget к нему, а QAction на QToolBar включает и выключает QDockWidget с removeDockWidget() и restoreDockWidget().

Размер по умолчанию QMainWindowравно 800 на 24, QToolBar s maximumHeight также установлено на 24.Сразу после вызова removeDockWidget() геометрия QMainWindow возвращается на (0,0,800,24) с setGeometry().

Что я хочу достичь, это изменить высоту QMainWindow до 24когда DockWidget удалены.setGeometry(), кажется, работает, так как ширина и положение изменяются соответственно, но, как ни странно, высота не сдвигается.И это действительно моя проблема:)

Что ты думаешь?

Вот скриншот , иллюстрирующий данную проблему.

Примечание: если я создаю тот же сценарий, используя QWidget, а не QMainWindow, и использую show() или hide() для дочернего виджета, то я могу изменить размер родительского элемента с помощью adjustSize() без проблем: кажется, проблема здесь выше - QMainWindowспецифичны.

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Опции

a) Вы можете перегрузить sizeHint () виртуальной функцией. Пусть он вернет размер, который вы хотите для вашего главного окна.

б) В конструкторе главного окна вы можете вызывать setMinimumSize () и setMaximumSize () один за другим, оба с желаемым размером основного окна. Если вы сохраните оба одинаковых, вы получите фиксированный размер.

c) Посмотрите на layout () -> setResizeMode (Fixed).

1 голос
/ 17 августа 2011

Похоже, вы неправильно поняли значение метода QMainWindow.sizeHint().

Согласно QWidget.sizeHint() документации (от которой QMainWindow наследуется):

Это свойство содержит рекомендуемый размер для виджета.

Если значение этого свойства недопустимое, размер не рекомендуется.Реализация sizeHint () по умолчанию возвращает недопустимый размер, если для этого виджета нет макета, а в противном случае возвращает предпочтительный размер макета.

Чтобы получить фактический размер окна, вам следует использоватьВместо этого QMainWindow.geometry() метод, который дает всю информацию о размере и положении виджета:

win_geo = self.geometry()
win_top = win_geo.top()
win_bottom = win_geo.bottom()
win_left = win_geo.left()
win_right = win_geo.right()
win_width = win_geo.width()
win_height = win_geo.height()
...