如何找到活动的PyQt窗口并将其放在前面

时间:2014-04-02 15:05:15

标签: python pyqt4

我是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()

1 个答案:

答案 0 :(得分:1)

一个完整的,平台无关的解决方案可能无法实现。 Qt支持的每个平台都以不同的方式运行,而activateWindow似乎有些错误。

首先,这里是Qt文档对activateWindow所说的内容:

  

此功能执行与单击鼠标相同的操作   顶级窗口的标题栏。在X11上,结果取决于   窗口管理器。如果要确保窗口堆叠在上面   顶部也应该调用raise()。请注意,窗口必须是   可见,否则activateWindow()无效。

  

在Windows上,如果您在应用程序未调用时调用此方法   当前是活动的,然后它不会使它成为活动窗口。   它将改变任务栏条目的颜色以指示   窗口在某种程度上发生了变化。这是因为微软没有   允许应用程序中断用户当前正在做的事情   另一个申请。

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

相关问题