Qt с несколькими (двумя) графическими слоями или буферами GUI

#qt #user-interface

#qt #пользовательский интерфейс

Вопрос:

Приветствую,

Я только начинаю изучать Qt, и мне интересно, возможно ли следующее. Я хотел бы создать приложение с двумя графическими слоями GUI. Верхний слой (назовем его A) будет располагаться поверх нижнего слоя (назовем его B), и оба будут располагаться поверх приложения. Если кнопка существует в одном и том же месте на обоих слоях, только кнопка в A должна быть видимой и реагировать на события нажатия. Кнопки на уровне B должны получать события нажатия, только если соответствующее местоположение на уровне A пусто. Я бы очень хотел, чтобы Qt справился с этим за меня. Какой был бы самый простой способ сделать это?

Возможно, я подхожу к проблеме под неправильным углом. Причиной этого вопроса является то, что я хочу снимок экрана того, что присутствует на уровне B (независимо от того, покрыто ли оно виджетом на уровне A). Я не хочу, чтобы элементы из слоя A были на этом снимке экрана, но они все равно должны присутствовать на экране. Я думал, что, разделив графический интерфейс на два слоя и создав пиксельную карту, я мог бы легко извлечь созданное Qt изображение нижнего слоя B. Возможно, есть более простой способ заставить Qt отрисовывать нужные мне элементы в буфер вне экрана?

Кстати, я не ищу здесь полного решения. Документация Qt превосходна, так что я действительно просто надеюсь, что меня укажут в правильном направлении. Спасибо!

Ответ №1:

Звучит как работа для QGraphicsView. Это сделает именно то, что вы хотите.

Комментарии:

1. К сожалению, я не смог поработать над этой проблемой, но у моего коллеги есть решение. Насколько я понимаю, он использует функцию рендеринга, чтобы перенести элементы из слоя B в другой буфер. По сути, когда вызывается его функция, она удаляет видимый флаг для всех элементов, помеченных как часть слоя A, вызывает функцию рендеринга, затем восстанавливает видимые флаги. Мы думаем, что это сработает. Я думаю, единственным беспокойством будут дополнительные события перерисовки или если экран каким-то образом обновит среднюю функцию элементами слоя A в неизвестных состояниях видимости.

2. Просто создайте все свои компоненты пользовательского интерфейса QGraphicsItem / QGraphicsWidgets и задайте свойство z, платформа graphicsview позаботится об этом за вас.