在一个应用程序中同时支持 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 的常用方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章