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

What't the common way to support both PyQt4 and PyQt5 in one application?

我想制作一个适用于 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 版本可配置并依赖于命令行选项——它们加载在不同的模块中。

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

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

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

from utils import options

use_pyqt5 = False

if options.try_pyqt5:

    try:
        import PyQt5
        use_pyqt5 = True
    except ImportError:
        pass