在Windows平台上的某些情况下,显然无法激活QWidget的isActive()会返回true。

例如,我的应用程序在GUI线程上做了很多工作,并在启动后有些延迟地显示窗口。如果我在应用程序显示主窗口之前启动应用程序并切换到另一个应用程序,则当窗口显示时,它肯定是不活动的。但是在这种情况下,调用isActive()返回true。如果我切换到我的应用程序并切换回另一个应用程序,则正常情况下isActive()将为false。但是一开始它是正确的,通常这不是应该的。顺便说一下,在linux和OS X上,它按计划工作。

我该如何解决?或者我该如何解决?

示例代码再现了下面给出的问题。是PyQt,但请相信我,Qt也会重现此问题。

import sys
from time import sleep
from PyQt5.QtWidgets import QWidget, QApplication

class BadWidget(QWidget):
    def __init__(self):
        super(BadWidget, self).__init__()
        self.startTimer(500)

    def timerEvent(self, e):
        print(self.isActiveWindow() and not self.isMinimized())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    bad_widget = BadWidget()
    sleep(1)
    bad_widget.show()
    app.exec_()

最佳答案

最后,我找到了一些可行的解决方案,完全可以满足我的需求。不幸的是,只能使用WinAPI调用来完成,但是可以。

主要思想是在Windows上,“活动”窗口和“前景”窗口不是同一个人。此处更多信息:https://stackoverflow.com/a/3940383/3400560

最终解决方案如下所示:

if sys.platform.startswith('win'):
    if ctypes.c_long(self.effectiveWinId()).value ==\
            windll.user32.GetForegroundWindow():
        # active
    else:
        # inactive
else:
    if self.isActiveWindow():
        # active
    else:
        # inactive

关于c++ - 在Windows上的Qt 5.4.0,在某些情况下在QWidget上调用的isActive()返回明显错误的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29167199/

10-13 08:08