Виджеты, не отображаемые с вибрацией macOS (NSVisualEffectView)

В настоящее время у меня есть приложение PyQt5, которое довольно просто (всего одна кнопка). Я бы хотел, чтобы он имел вибрацию, поэтому я перенес код вибрации ObjC в Python. Мой код вибрации выглядит следующим образом:

frame = NSMakeRect(0, 0, * self.get_screen_size())  # get_screen_size returns the resolution of the monitor
view = objc.objc_object(c_void_p=self.winId().__int__())  # returns NSView of current window

visualEffectView = NSVisualEffectView.new()
visualEffectView.setAutoresizingMask_(NSViewWidthSizable|NSViewHeightSizable)  # equivalent to: visualEffectView.autoresizingMask = NSViewW...
visualEffectView.setFrame_(frame)
visualEffectView.setState_(NSVisualEffectStateActive)
visualEffectView.setMaterial_(NSVisualEffectMaterialDark)
visualEffectView.setBlendingMode_(NSVisualEffectBlendingModeBehindWindow)

window = view.window()
window.contentView().addSubview_positioned_relativeTo_(visualEffectView, NSWindowBelow, None)  
    # equal to: [window.contentView addSubview:visualEffectView positioned:NSWindowBelow relativeTo:nul]

window.setTitlebarAppearsTransparent_(True)
window.setStyleMask_(window.styleMask() | NSFullSizeContentViewWindowMask)  # so the title bar is also vibrant

self.repaint()

Все, что я делаю, чтобы нарисовать кнопку: btn = QPushButton("test", self)

self это класс, унаследованный от QMainWindow а все остальное должно быть довольно неважно.

Поведение с window.contentView().addSubview... линия закомментирована (без вибрации)

Поведение без этого закомментировано (с вибрацией)

Спасибо!

0 ответов

Элементы пользовательского интерфейса на самом деле нарисованы, но NSVisualEffectView покрывает их. Я исправил эту проблему, добавив другое представление QMacCocoaViewContainer к окну.

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

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

frame = NSMakeRect(0, 0, self.width(), self.height())
view = objc.objc_object(c_void_p=self.winId().__int__())

visualEffectView = NSVisualEffectView.new()
visualEffectView.setAutoresizingMask_(NSViewWidthSizable|NSViewHeightSizable)
visualEffectView.setWantsLayer_(True)
visualEffectView.setFrame_(frame)
visualEffectView.setState_(NSVisualEffectStateActive)
visualEffectView.setMaterial_(NSVisualEffectMaterialUltraDark)
visualEffectView.setBlendingMode_(NSVisualEffectBlendingModeBehindWindow)
visualEffectView.setWantsLayer_(True)

self.setAttribute(Qt.WA_TranslucentBackground, True)

window = view.window()
content = window.contentView()

container = QMacCocoaViewContainer(0, self)
content.addSubview_positioned_relativeTo_(visualEffectView, NSWindowBelow, container)  

window.setTitlebarAppearsTransparent_(True)
window.setStyleMask_(window.styleMask() | NSFullSizeContentViewWindowMask)

appearance = NSAppearance.appearanceNamed_('NSAppearanceNameVibrantDark')
window.setAppearance_(appearance)

Результат:

Другие вопросы по тегам