"macOS 色彩效果 (NSVisualEffectView) 下,小部件无法展示"

2024-04-20 16:11:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有一个非常简单的PyQt5应用程序(只有一个按钮)。我希望它具有vibrance,所以我将ObjC vibrance代码移植到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...行的行为(无振动)

没有它的行为(充满活力)

谢谢!你知道吗


Tags: ofthe代码selfsizegetwindowscreen
1条回答
网友
1楼 · 发布于 2024-04-20 16:11:50

UI元素实际上是绘制的,但是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)

结果:

enter image description here

相关问题 更多 >