Qt:在手动激活应用程序之前,MainWindow不会出现

时间:2013-05-15 20:24:09

标签: qt pyqt py2app

在我的(Py)Qt4应用程序中,主窗口不会出现,直到用户使用命令选项卡切换回应用程序然后再将命令选项卡切换回它。

奇怪的是,这个问题只会在Finder中双击我的.app启动时显示。如果我从命令行启动应用,它可以正常工作

另外,我已经尝试在我的代码中添加以下行,但似乎没有什么可以做到的:

mainWindow.show()
mainWindow.raise_()
mainWindow.repaint()
QApplication.postEvent(QEvent.ApplicationDeactivate)
QApplication.postEvent(QEvent.ApplicationActivate)
QApplication.instance().processEvents()

我认为这可能是某种与线程相关的问题,但我可以在任何地方插入这一行:

assert threading.current_thread().name == "MainThread"

最后一个问题:我不知道它是否相关,但我的启动画面没有正确隐藏(尽管调用splashscreen.finish(mainWindow))。 (如果我完全注释掉启动画面,主窗口仍然如上所述行为不正常。)

为什么我的应用程序包的行为与从命令行启动的行为不同?知道我怎么诊断这个吗?我使用py2app生成我的应用程序包。

编辑:此邮件列表项explains问题,给出了一个最小的测试用例。 SPOILER:事实证明argv_emulation选项是问题所在。它不应该与GUI应用程序一起使用。

3 个答案:

答案 0 :(得分:1)

您应该可以通过在主窗口上调用show()后跟raise_()来解决此问题。

IIRC,你需要两者,你可能需要它们。这适用于ubuntuone控制面板应用程序,它是PyQt并使用py2app打包。

关于这个重复问题的答案有更多背景信息:Why does my PyQt application open in the background on Mac OS X?

答案 1 :(得分:1)

这里的问题原来是我使用argv_emulation选项,它不适用于GUI应用程序。将该选项设置为False可以解决问题。

(另见:http://mail.python.org/pipermail/pythonmac-sig/2013-August/023992.html

(另请参阅py2app/bootstrap/argv_emulation.py

中的评论

答案 2 :(得分:1)

我有同样的问题;我发现该漏洞没有在32位Snow Leopard系统上体现出来,但完全相同的py2app捆绑包在64位Lion和Mountain Lion上出现了问题。

关闭argv_emulation并没有解决我的问题(我的应用程序无法以其他方式启动)。

我的快速解决方法:在致电show()后,添加一个名为:

的电话
os.system("open -a /path/to/your.app")

在OS X上,这基本上相当于通过其停靠图标激活(已经运行的)应用程序;主窗口立即出现。