Добавить боковую панель без изменения размера родителя

Я использую PySide2 для написания графического интерфейса (без QtDesigner).

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

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

Так что я

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

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

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

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

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

person jdoe    schedule 29.03.2020    source источник
comment
Что вы имеете в виду под боковой панелью? Вы можете поместить изображение или схему, иллюстрирующую то, что вы хотите получить.   -  person eyllanesc    schedule 30.03.2020
comment
Я попробую свои силы в некоторых эскизах ASCII: P Но я имею в виду следующее: у меня есть окно, и после нажатия кнопки я хочу добавить новый виджет в это окно. Этот виджет должен появиться на одной из сторон, но вместо того, чтобы соответствовать существующему размеру, все в исходном окне должно остаться того же размера, а новый виджет должен быть размещен в ранее пустом месте рядом с исходным окном.   -  person jdoe    schedule 30.03.2020


Ответы (1)


Трудно добиться успеха на «клиентской» стороне Qt; это действительно принадлежит самому Qt. Я реализовал немного более общий вариант этого пару лет назад, и только для того, чтобы он хорошо работал в Windows, Mac и KDE, код раздулся до более чем тысячи строк, чтобы покрыть все неприятные угловые случаи, и еще тысяча для тестовая обвязка. Реализовать тесты оказалось на удивление сложно, особенно на X11, где не было возможности использовать собственные X API для проверки предполагаемого поведения. Вскоре я избавился от этого чудовища — усилия были излишними.

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

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

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

person Community    schedule 30.03.2020