在一个应用程序中同时支持 PyQt4 和 PyQt5 的常用方法是啥?

Posted

技术标签:

【中文标题】在一个应用程序中同时支持 PyQt4 和 PyQt5 的常用方法是啥?【英文标题】:What't the common way to support both PyQt4 and PyQt5 in one application?在一个应用程序中同时支持 PyQt4 和 PyQt5 的常用方法是什么? 【发布时间】:2015-11-28 18:34:17 【问题描述】:

我想制作一个可以同时使用 PyQt4 和 PyQt5 的应用程序。

首先,我可以创建兼容性模块compat.py,如果找不到 PyQt5,它将回退到 PyQt4:

try:
    __import__('PyQt5')
    use_pyqt5 = True
except ImportError:
    use_pyqt5 = False

if use_pyqt5:
    from PyQt5.QtGui import QIcon as QIcon
else:
    from PyQt4.QtGui import QIcon as QIcon

之后我可以从该模块中导入与 Qt 相关的类并检查 compat.use_pyqt5,其中 PyQt4/5 的逻辑有所不同。

问题是我想让 Qt 版本可配置并依赖于命令行选项 - 它们被加载到不同的模块中。

【问题讨论】:

见:Differences Between PyQt4 and PyQt5。从 PyQt4 移植到 PyQt5 可能很容易,但这在很大程度上取决于每个应用程序的细节。我的直觉是,从长远来看(即一旦项目开始变得更大和/或更复杂),维护一个单一的代码库可能会成为一场噩梦。 @ekhumoro 在我的情况下,维护不是一个大问题,因为项目的 gui 部分(即that one)很小而且大部分已经完成。我已经添加了对 qt4 和 qt5 的支持,但是要在它们之间切换,我应该手动编辑源代码(例如更改 compat.use_pyqt5 变量)并且我想使用命令行选项来完成。 【参考方案1】:

问题实际上并不是关于同时支持 PyQt4 和 PyQt5。它真正要问的是:如何全局访问命令行选项?

一种解决方案是将options 对象添加到处理命令行选项的模块中。这个对象可以是一个简单的命名空间,它存储读入的任何选项,并提供适当的默认值。然后,您只需要确保options 对象在被任何其他可能需要它的模块导入之前完全初始化。

有了这些,你就可以做这样的事情了:

from utils import options

use_pyqt5 = False

if options.try_pyqt5:

    try:
        import PyQt5
        use_pyqt5 = True
    except ImportError:
        pass

【讨论】:

以上是关于在一个应用程序中同时支持 PyQt4 和 PyQt5 的常用方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

pyqt4 pyqt5 哪个好用

PyQt5/pyqt4 是不是已经支持带有手写识别的 QtVirtualKeyboard?

PyQt4 应用程序中的 Python 编辑器

PyQt4 信号和 QObject.Emit()

PyQt4中QWebView的多线程

PyQt4入门