如何找到活动的 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 窗口并将其置于最前面的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Cocoa api 启动应用程序并将其置于最前面?