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如何使应用程序真正活跃的主要内容,如果未能解决你的问题,请参考以下文章

如何构建 PyQT 项目?

如何使 Pyqt5 QLineEdit 只接受数字

如何在 PyQt5 中制作嵌套的 StackedLayouts?

PyQt5 应用程序 - 使用计时器运行带有循环的函数使其“冻结”

好吧.我又来求助了.PyQt的图标问题

MFC 应用程序中的 Qt DLL - 如何使 QDialog *真正* 模态?