pyqt如何使应用程序真正活跃
Posted
技术标签:
【中文标题】pyqt如何使应用程序真正活跃【英文标题】:pyqt how to make application truly active 【发布时间】:2015-04-01 20:37:45 【问题描述】:在 OS X 下,使用 zetcode example for menubar,如果从命令行运行:
$ python menubar.py
应用程序启动,但在窗口堆栈的底部。这可以通过添加来解决 self.raise_()
到代码。
但是,该应用程序仍未立即激活。终端应用程序菜单栏仍然显示,而不是 pyqt 菜单栏。
让 pyqt 菜单栏显示的唯一方法是从 pyqt 应用程序或终端应用程序切换并再次返回。
这是预期的行为吗?无论如何要解决这个问题,以便 pyqt 应用程序立即激活,即 pyqt 菜单栏在执行时立即显示。
版本:OS X 10.9、Qt 4.8.6、PyQt 4.11.3、SIP 4.16.5、python 2.7.8
【问题讨论】:
你试过activateWindow()
吗?另外,如果您将应用程序作为 bg 进程启动会发生什么:即python menubar.py &
?
请参阅下面的答案中的 cmets。没有任何效果。
【参考方案1】:
同样的问题会影响 PyInstaller 捆绑的某些应用程序。以下博客文章讨论了该修复,但该修复是针对 PyInstaller 引导加载程序的,它与您的代码没有直接关系,但它可能会提供信息。
http://dvitonis.net/blog/2015/01/07/menu-bar-not-visible-when-building-pyqt-app-bundle-pyinstaller-mac-osx-mavericks-yosemite/
这个问题与这篇链接文章中讨论的 TransformProcessType() 的使用有关:
http://www.sheepsystems.com/developers_blog/TPT-show-menu.html
我不知道什么 Qt 方法与 Mac OS TransformProcessType() 相关,但您可以尝试在主窗口的 __init__() 中调用 QWidget.setWindowState()。
【讨论】:
我有一个与 PyInstaller 捆绑在一起的应用程序,它在 OS X Yosemite 上确实存在这个问题:启动时它是最前面的窗口,但菜单栏仍然是终端的,我必须单击另一个应用程序并然后回到我的菜单栏生效。在 my_main_window.show() 调用之后,我尝试了以下所有方法:my_main_window.activateWindow() 和 my_main_window.raise_() 和 my_main_window.setWindowState(Qt.WindowActive)。没有任何效果。 使用 setWindowState 和各种 WindowFlag 设置都不起作用。 pyqt 邮件列表本身似乎没有直接信息。因此,系统似乎有其固有的特性,至少在 OS X 中是这样。 @triccare。向 PyQt 邮件列表发帖确实没什么意义,除非有人阅读它时碰巧遇到了同样的问题并找到了解决方案。这几乎可以肯定是 Qt 特有的问题,因此您需要尝试他们的 bugtracker(尽管 QTBUG-28327 的当前状态似乎没有太大希望)。【参考方案2】:我遇到了这种行为,但只有当我使用 --nosplash
选项启动以跳过我的应用程序中的启动屏幕时。
这给了我一个提示,我使用“虚拟”启动屏幕开发了这个解决方法:
widget = QtGui.QMainWindow() # or whatever your main window class is
dummy = QtGui.QSplashScreen()
dummy.show()
dummy.finish(widget)
widget.show()
widget.raise_()
【讨论】:
谢谢。我会在不久的将来试试这个。以上是关于pyqt如何使应用程序真正活跃的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PyQt5 中制作嵌套的 StackedLayouts?