Как изменить ширину/высоту всех QDockWidgets в QDockWidgetArea?

У меня есть приложение PyQt 4, в котором есть QMainWindow с закрепленными QDockWidgets в левой и нижней областях стыковки. В настоящее время у меня есть два виджета, закрепленные слева и 2 внизу. Я пытаюсь выяснить, как я могу программно перемещать границу между центральным виджетом и областями стыковки, эффективно изменяя ширину области стыковки (в случае левой или правой областей) или высоту (для верхней и нижней областей стыковки). ).

Я могу сделать это вручную с помощью мыши; когда я навожу курсор на границу между центральным виджетом и областями док-станции, я получаю маркер изменения размера, который я могу использовать для растягивания области док-станции. Мне еще предстоит найти интерфейс, позволяющий мне сделать это из моей программы. Я пытался вручную изменить размер самих объектов QDockWidget (что не рекомендуется делать в документации) и виджетов, которые они оборачивают (что должно работать), но, похоже, это не работает. Любые идеи?

В частности, такой подход не работает:

dock1.resize(QSize(width, height))
dock2.resize(QSize(width, height))
dock3.resize(QSize(width, height))

И это не так:

dock1.widget().resize(QSize(width, height))
dock2.widget().resize(QSize(width, height))
dock3.widget().resize(QSize(width, height))

person Jason R    schedule 20.04.2012    source источник
comment
Отображение ваших неудачных попыток, вероятно, повысит ваши шансы на ответ.   -  person Kleist    schedule 21.04.2012
comment
Как насчет setMinimumSize вместо resize в виджете внутри QDockWidget? Это работает?   -  person Avaris    schedule 21.04.2012


Ответы (1)


Кажется, я понимаю, что происходит. Сначала пара заметок из документации.

Сначала QMainWindow:

QMainWindow имеет собственный макет, в который вы можете добавить QToolBar, QDockWidgets, QMenuBar и QStatusBar. Макет имеет центральную область, которая может быть занята любым виджетом.

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

Давайте посмотрим на QDockWidget:

QDockWidget действует как оболочка для своего дочернего виджета, установленного с помощью setWidget(). Подсказки настраиваемого размера, минимальные и максимальные размеры и политики размеров должны быть реализованы в дочернем виджете. QDockWidget будет уважать их, регулируя свои собственные ограничения, включая рамку и заголовок. Ограничения размера не должны устанавливаться для самого QDockWidget, потому что они меняются в зависимости от того, закреплен ли он; закрепленный QDockWidget не имеет рамки и имеет меньшую строку заголовка.

Это означает, что вы должны изменить размер виджета внутри файла QDockWidget. Когда QDockWidget плавает, он может свободно изменять размер в соответствии с требованиями своего виджета. Но стыковка оставит это на усмотрение менеджера компоновки QMainWindows, и он уменьшится.

Вероятно, самое простое решение — установить minimumSize для виджета внутри QDockWidget, чтобы менеджер компоновки в QMainWindow не сжимал его дальше этого. В качестве альтернативы вы можете создать подкласс и повторно реализовать метод sizeHint для своих виджетов, чтобы менеджер компоновки получил предпочтительный размер.

Короче говоря, это должно работать:

dock1.widget().setMinimumSize(QSize(width, height))
dock2.widget().setMinimumSize(QSize(width, height))
dock3.widget().setMinimumSize(QSize(width, height))
person Avaris    schedule 20.04.2012
comment
Работает отлично. Для моего приложения я не обязательно хочу, чтобы новый размер оставался постоянным; Я просто хочу немедленно изменить размер областей дока до этой ширины/высоты. Я обнаружил, что использование dock{x}.widget().setMinimumWidth(minWidth) с последующим dock{x}.widget().setMinimumWidth(oldMinWidth) дало мне желаемый эффект. - person Jason R; 24.04.2012
comment
@JasonR: Просто имейте в виду, что каждый раз, когда вы изменяете размер главного окна, оно возвращается к oldMinWidth. - person Avaris; 24.04.2012