Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Jason RОтветов: 1

У меня есть приложение 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))
  • Отображение ваших неудачных попыток, вероятно, повысит ваши шансы на ответ. Kleist 21.04.2012
  • Как насчет setMinimumSize вместо resize в виджете внутри QDockWidget? Это работает? Avaris 21.04.2012

pythonpyqt4qt4

Ответы

Ответ 1 · рейтинг 7 · Avaris

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

Сначала 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))

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы