Python + Qt -> 如何在其他全屏应用程序上实现2D叠加?

3

背景: 我经常玩大战略游戏,其中一部分成瘾是因为AARs(行动后报告),即玩家写的关于游戏的故事。当然需要保存游戏,因为“快速”游戏需要超过10个小时。

问题: 游戏除了3个自动保存以外,不支持其他自动保存。因此,我想编写一个使用Qt来跟踪文件更改的应用程序。每次游戏自动保存时,这个应用程序将重命名并移动到所选位置的存档。 但由于它是全屏游戏,玩家可能会忘记打开我的应用程序,我需要一种指示我的应用程序状态的方法。

问题: 如果我使用Python和Qt,如何在全屏3D应用程序的一部分上制作2D叠加层?

替代方案: 我认为声音警告不能解决我的问题,因为如果有人忘记选择要跟踪的存档,它将起不到作用,但如果有人完全忘记打开我的应用程序,则缺少图标就足以通知这样的错误。 但是,如果您可以找到任何其他指示我的应用程序未启动或未配置的方法,请在答案中发布您的想法。


这可能有所帮助,如果你能检测到你的游戏获得焦点时,你可以将这个放在它的上面。https://stackoverflow.com/questions/73348118/draw-transparent-image-over-the-screen-with-qt - undefined
1个回答

0

虽然这篇帖子很旧,但我将回复保留在这里,供其他寻找类似解决方案的人使用。

请查看PyWinCtl。如果您能够使用 Python 和 Qt 构建一个无边框、半透明的窗口,则 alwaysOnTop(True) 和 acceptInput(False) 方法将起到作用,但只适用于基于 CGI 调用的游戏,而不适用于使用 DirectDraw 专有模式的游戏(对于此,我也在寻找 Python 解决方案,这就是我为什么来到这里的原因!)

同时,在初始化窗口时,您可以尝试在 Qt 上使用以下代码片段(这是一段代码,不能直接复制,抱歉):

# Make it transparent to input
self.setFocusPolicy(QtCore.Qt.NoFocus)
if "Linux" in platform.platform():
    self.setAttribute(QtCore.Qt.WA_X11DoNotAcceptFocus, True)
self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents, True)
self.setAttribute(QtCore.Qt.WA_InputMethodTransparent, True)
self.setAttribute(QtCore.Qt.WA_ShowWithoutActivating, True)

# Make it semi-transparent
self.setWindowOpacity(128)

# Setting flags: on top, frameless and no focus
self.setWindowFlags(QtCore.Qt.Tool| QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowDoesNotAcceptFocus)

我认为函数和参数的名称是自解释的(如果不是,请告诉我)。

使窗口透明以便输入法正常工作是很重要的,否则窗口最终会被点击,游戏就会失去焦点。这个效果对窗口是永久性的。

现有的方法无法实现使窗口半透明。你需要为窗口实现一个自定义的paintEvent,像这样(再次抱歉,无法重现):

def paintEvent(self, event=None):
    # This is required to draw a semi-transparent window
    # https://dev59.com/mFsX5IYBdhLWcg3wS9_o
    painter = QtGui.QPainter(self)
    painter.setOpacity(0.4)  # or your desired opacity level
    painter.setBrush(QtCore.Qt.black)  # or your desired background color
    painter.setPen(QtGui.QPenQtCore.Qt.black))  # or your desired background color
    painter.drawRect(self.rect())

让窗口始终保持在顶层的部分可能不是永久的。这就是为什么建议使用 pywinctl 的 alwaysOnTop()方法。此外,最好每隔一秒钟调用该方法,以防止窗口被任何原因遮挡而导致不再在顶层。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接