是否有可能让 PyQt5 应用程序(在 MacOS 上)完全不接受激活/聚焦,但仍可交互?

Is it possible to get a PyQt5 Application (On MacOS) to not accept activation/focus completely, but still be interactable?

提问人:Kyelimepi 提问时间:11/6/2023 最后编辑:Kyelimepi 更新时间:11/6/2023 访问量:32

问:

我目前正在尝试创建一个 PyQt5 应用程序,该应用程序将 OSC 消息发送到 ETC 的 EOS 照明软件。我有一个编码器轮,用于修改移动光源的平移值。但是,我不希望 PyQt5 应用程序被激活并将注意力从 EOS 软件上移开。我希望能够单击并拖动我创建的编码器轮,然后立即使EOS保持活动状态,这样我就可以使用键盘快捷键来录制命令,设置强度或其他值等。我正在努力寻找一种方法,使 PyQt5 应用程序在单击并拖动 Dial 小部件时不聚焦/激活。我已经到处寻找我能找到的尝试解决这个问题,我知道 PyQt5 的“setWindowsFlags”,但它们没有完成我试图解决的问题。我最好的猜测是,窗口标志是为窗口和/或小部件设置的,而不是为整个应用程序设置的。有没有办法做到这一点?有没有其他的 Python 模块可以帮助我完成这个任务?

这是我用于创建拨号小部件的部分代码

from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class Dial(QDial):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setNotchesVisible(False)
        self.setWrapping(True)
        self.setRange(0, 25)
        self.valueChanged.connect(self.emitValueChanged)
        self.setWindowFlags(Qt.WindowDoesNotAcceptFocus)
    
    @property
    def dialVal(self):
        return self.value()

    def emitValueChanged(self, dialVal):
        print(self.value())

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowFlags( Qt.Window | Qt.FramelessWindowHint | Qt.WindowDoesNotAcceptFocus | Qt.WindowStaysOnTopHint)
        self.setAttribute(Qt.WA_ShowWithoutActivating)
        self.setFocusPolicy(Qt.NoFocus)
        self.dial = Dial()
    
        layout = QVBoxLayout(self)
        layout.addWidget(self.dial)
        self.setCentralWidget(self.dial)

app = QApplication(sys.argv)
screen = MainWindow()
screen.show()
sys.exit(app.exec_())
python macOS pyqt5 焦点 活动窗口

评论

0赞 musicamante 11/6/2023
尝试使用标志。此外,您的问题实际上与您的最终目的(OSC 连接和自定义拨号)没有任何关系,因此您应该删除与之相关的描述和代码。只需解释实际问题,并在主窗口代码中添加一个基本的 QDial。Qt.BypassWindowManagerHint
0赞 Kyelimepi 11/6/2023
我试过BypassWindowManagerHint。仍然不会阻止激活。没有一个窗口标志适用于它。
0赞 musicamante 11/6/2023
不幸的是,每个操作系统/窗口管理器都有自己的处理标志的方式(实际上,情况正好相反,因为Qt窗口标志是平台插件最终应用于底层操作系统的抽象)。此外,众所周知,Apple OS 会随时打破许多既定规则,包括他们自己的规则。我唯一能建议你做的就是创建一个测试程序,将所有可能的窗口标志显示为窗口中的复选框,并最终将它们应用于“测试”窗口。但是,请注意:考虑到 Apple 的不一致之处,它不能保证在所有情况下都能正常工作。

答: 暂无答案