如何找到活动的 PyQt 窗口并将其置于最前面

Posted

技术标签:

【中文标题】如何找到活动的 PyQt 窗口并将其置于最前面【英文标题】:How to find the active PyQt window and bring it to the front 【发布时间】:2014-04-02 15:05:15 【问题描述】:

我是 PyQt 的新手。我一直在寻找如何找到我当前打开的 PyQt 应用程序的窗口并将其带到前面。到目前为止,我发现的只是一个使用 pywin32 的示例(因此特定于 Windows)。我想问是否有一种独立于平台的方式可以实现目标。任何帮助将不胜感激。

这是我的代码。 activateWindow() 函数应该把它带到前面。

class TestApp(QtGui.QApplication):
    def __init__(self, argv, key):
        QtGui.QApplication.__init__(self, argv)
        self._activationWindow=None
        self._memory = QtCore.QSharedMemory()
        self._memory.setKey(key)
        if self._memory.attach():
            self._running = True
        else:
            self._running = False
            if not self._memory.create(1):
                raise RuntimeError(
                self._memory.errorString().toLocal8Bit().data())
    def isRunning(self):
        return self._running

    def activationWindow(self):
        return self._activationWindow

    def setActivationWindow(self, activationWindow):
        self._activationWindow = activationWindow

    def activateWindow(self):
        if not self._activationWindow:
            return
        self._activationWindow.setWindowState( self._activationWindow.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
        self._activationWindow.raise_()
        self._activationWindow.show()
        self._activationWindow.activateWindow()

【问题讨论】:

“活动窗口”究竟是什么意思?活动窗口当前位于最前面的窗口的情况很常见(但并非总是如此)。另外,“在 PyQt 应用程序中”是什么意思?这个 PyQt 应用程序是在寻找桌面上的任何窗口,还是只寻找它自己的一个窗口? 我的意思是它自己的窗口。它可以被最小化或在其他窗口的后面。 我已尽力给出答案,但可能对您帮助不大。顺便说一句,您的示例代码似乎 familiar to me, somehow ;-) 【参考方案1】:

一个完整的、独立于平台的解决方案可能遥不可及。 Qt 支持的每个平台的行为方式都不同,activateWindow 似乎有些问题。

首先,这是 Qt 文档对 activateWindow 的评价:

此函数执行的操作与在 顶层窗口的标题栏。在 X11 上,结果取决于 窗口管理器。如果要确保窗口堆叠在 你也应该调用 raise()。请注意,窗口必须是 可见,否则 activateWindow() 无效。

和:

在 Windows 上,如果您在应用程序未运行时调用它 当前是活动的,那么它不会使其成为活动窗口。 它将更改任务栏条目的颜色以指示 窗口以某种方式发生了变化。这是因为微软没有 允许应用程序中断用户当前正在执行的操作 另一个应用程序。

有关困难的更多确认证据,请查看 Qt 论坛上的这些主题:

Bring window to front -> raise(), show(), activateWindow() don’t work on Windows activateWindow() does not send window to front

【讨论】:

以上是关于如何找到活动的 PyQt 窗口并将其置于最前面的主要内容,如果未能解决你的问题,请参考以下文章

如何将 PyQt QProcess 窗口置于前面?

如何使用 Cocoa api 启动应用程序并将其置于最前面?

如何将一个html页面始终置于窗口的最前面

将无边界的摆动窗口带到前面

如何使窗口适合其内容并将其居中放置在 Sciter 的屏幕上?

如何设置窗口在最前面?