Добавить боковую панель без изменения размера родительского - PullRequest
0 голосов
/ 29 марта 2020

Я использую PySide2, чтобы написать gui (без QtDesigner).

Главное окно содержит графики и некоторые другие виджеты. Через опцию меню я хочу открыть виджет боковой панели. То, как я хочу, чтобы это работало, заключается в том, что все окно просто увеличивается, чтобы содержать этот новый виджет без изменения размера чего-либо еще в главном окне. Как это можно сделать?

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

Итак, у меня есть

    ---------
    |content|
    ---------

, который должен превратиться в

-------------
|new|content|
-------------

, но в настоящее время я получаю

    ---------
    |new|cnt|
    ---------

1 Ответ

0 голосов
/ 30 марта 2020

Трудно добиться успеха на "клиентской" стороне Qt; это действительно будет принадлежать самому Qt. Я реализовал несколько более общий вариант этого за пару лет go, и просто для того, чтобы он хорошо работал на Windows, Ma c и KDE, код расширился до тысячи строк, чтобы охватить все случайные угловатые чехлы, с еще тысячами для испытательного жгута. Было на удивление сложно реализовать тесты - особенно на X11, где не было возможности использовать собственные API-интерфейсы X для проверки предполагаемого поведения. Вскоре я избавился от этого чудовища - в этом не было необходимости.

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

Для этого вам нужно захватить события изменения размера окна контента: боковая панель должна установите себя в качестве фильтра событий для окна контента.

Вы хотите, чтобы боковая панель была дочерним элементом Qt окна контента, , но вам также необходимо сделать его окном верхнего уровня, т.е. установить на нем флаг Qt::Window, чтобы оно стало верхним уровнем, а не подвиджетом окна контента.

...