Qt + безрамочное окно + композитинг

Я пытаюсь открыть пару всплывающих окон (верхний уровень), которые не имеют рамок. Я могу добиться этого с помощью:

window.setWindowFlags(Qt.FramelessWindowHint | Qt.Dialog)

Но проблема в том, что окна не проходят через компоновщик ОС (например, в окнах нет теней). Я могу добиться теней окон с помощью флагов Qt.Popup и Qt.ToolTip, но у обоих есть проблемы с поведением, всплывающие подсказки всегда сверху, а всплывающие окна закрываются, когда их фокус теряется.

Итак, есть ли способ показать безрамное окно с эффектом тени оконного менеджера ОС по умолчанию?


person sepul    schedule 30.09.2013    source источник
comment
Пожалуйста, проверьте это, я не уверен, что это то, что вы хотите, но для окна без рамки вам нужно нарисовать эффект тени stackoverflow.com/questions/12347776/   -  person Shah-nawaj Shuhan    schedule 01.10.2013
comment
Да я видел тот пост. но это не соответствует потребностям моей программы, я разрабатываю приложение, которое показывает всплывающие окна на рабочем столе (которое нужно затенить). Поэтому мне нужен компоновщик ОС по умолчанию, как и в других окнах уровня рабочего стола.   -  person sepul    schedule 09.10.2013


Ответы (2)


Нашел обходной путь на windows. но я не мог сделать это с Qt, поэтому я использовал хак win32.
Добавьте это в конструктор класса QWidget:

if sys.platform == 'win32':
  import win32api
  win32api.SetClassLong(eval(self.winId().__hex__()), -26, 0x0008 | 0x00020000)

На самом деле я добавил стиль CS_DROPSHADOW в стили класса окна.

person sepul    schedule 14.10.2013

Следующим пользователям может помочь использование флага Qt.ToolTip и предотвращение того, чтобы всплывающие подсказки всегда были наверху.

Код Python

self.setWindowFlags(self.windowFlags() | Qt.ToolTip)
self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)
person SyedElec    schedule 27.11.2015