Сделать часть окна как визуально прозрачной, так и прозрачной для мыши.

Я пишу скрипт Qt5 PySide2 на Ubuntu 20.04.

Я хотел бы сделать часть окна прозрачной, скажем, рамку, чтобы я мог видеть другие оконные программы (например, Firefox, LibreOffice и т. д.), которые находятся ниже окна. (Если это невозможно, было бы нормально, если бы все окно было полупрозрачным, что я уже знаю, как это сделать, но мне также нужно отобразить некоторые кнопки и другие виджеты в стороне и иметь возможность взаимодействовать с ними). Я могу сделать это с

Qt.WA_TranslucentBackground

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

Qt.WindowTransparentForInput

Проблема возникает, когда я пытаюсь объединить эти две функции. В первом случае я получаю прозрачное окно, но не могу взаимодействовать с тем, что ниже. Во втором случае я получаю непрозрачное окно, но могу взаимодействовать с тем, что внизу, хотя и вслепую.

Я видел, что добавление Qt.FramelessWindowHint решает и то, и другое, но тогда я больше не могу перемещать окно, и я также хотел бы сохранить украшения окна заголовка, такие как x для закрытия окон или - для его минимизации.

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

Спасибо

введите здесь описание изображения введите здесь описание изображения


person Jacquelyn.Marquardt    schedule 24.02.2021    source источник
comment
Итак, если я правильно понял, вам просто нужно окно с рамкой и некоторыми объектами, в то время как остальное прозрачно как визуально, так и для мыши, чтобы вы могли видеть другие окна под ним и взаимодействовать с ними?   -  person musicamante    schedule 24.02.2021
comment
@musicamante да, точно. не могли бы вы мне помочь, пожалуйста?   -  person Jacquelyn.Marquardt    schedule 24.02.2021
comment
Обратите внимание, что если вам нужно добавить виджет, нависающий над вашим окном, вы должны добавить их геометрию в область, созданную для маскирования: region |= QtGui.QRegion(self.someFloatingWidget.geometry())   -  person musicamante    schedule 24.02.2021
comment
@musicamante Я не могу взаимодействовать с окнами ниже и, к сожалению, не могу перемещать или изменять размер окна с помощью кода, который вы указали   -  person Jacquelyn.Marquardt    schedule 24.02.2021
comment
Это может зависеть от реализации, которая требует этого вопроса, но факт остается фактом: для того, что вы спрашиваете, вам нужно использовать setMask(), как показано здесь. Также обратите внимание, что Qt.WA_TranslucentBackground и Qt.WindowTransparentForInput, вероятно, несовместимы (и на самом деле не обязательны) с этим, поэтому вам не следует их использовать.   -  person musicamante    schedule 24.02.2021
comment
Я вижу, вы создали награду за это. Учитывая, что наиболее вероятное решение требует использования setMask, как описано в другом ответе, вы должны попытаться уточнить, что вы пытались и как это не решает вашу проблему, возможно, расширив свой вопрос с помощью MRE, показывающего нам, что хорошо, а что нет. В противном случае маловероятно, что за это время будет дан другой ответ, и вы рискуете потерять репутацию, а решения вашего вопроса так и не будет.   -  person musicamante    schedule 01.03.2021