--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Toolbox/PyQt4ImportHook.py Sun Apr 14 15:09:21 2019 +0200 @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2014 - 2019 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing an import hook converting PyQt5 imports to PyQt4 imports. +""" + +from __future__ import unicode_literals + +import sys +import importlib + + +class PyQt4Importer(object): + """ + Class implementing an importer converting PyQt5 imports to PyQt4 + imports. + """ + def __init__(self): + """ + Constructor + """ + self.__path = None + + def find_module(self, fullname, path=None): + """ + Public method returning the module loader. + + @param fullname name of the module to be loaded (string) + @param path path to resolve the module name (string) + @return module loader object + """ + if fullname.startswith("PyQt5"): + self.__path = path + return self + + return None + + @staticmethod + def QComboBox_currentData(other, role=None): + """ + Static method to emulate the currentData method of Qt5. + + @param other reference to the combo box to get the user data of + @type QComboBox + @param role role of which data should be retrieved + @type int + @return stored data at current selection + @rtype any + """ + import PyQt4.Qt + if role is None: + role = PyQt4.Qt.Qt.UserRole + + idx = other.currentIndex() + return other.itemData(idx, role) + + def load_module(self, fullname): + """ + Public method to load a module. + + @param fullname name of the module to be loaded (string) + @return reference to the loaded module (module) + """ + if fullname in ["PyQt5.QtWidgets", "PyQt5.QtPrintSupport"]: + newname = "PyQt4.QtGui" + elif fullname in ["PyQt5.QtWebKitWidgets"]: + newname = "PyQt4.QtWebKit" + else: + newname = fullname.replace("PyQt5", "PyQt4") + + module = importlib.import_module(newname) + sys.modules[fullname] = module + if fullname == "PyQt5.QtCore": + import PyQt4.QtGui + module.qInstallMessageHandler = module.qInstallMsgHandler + module.QItemSelectionModel = PyQt4.QtGui.QItemSelectionModel + module.QItemSelection = PyQt4.QtGui.QItemSelection + module.QSortFilterProxyModel = \ + PyQt4.QtGui.QSortFilterProxyModel + module.QAbstractProxyModel = PyQt4.QtGui.QAbstractProxyModel + module.QStringListModel = PyQt4.QtGui.QStringListModel + + PyQt4.QtGui.QComboBox.currentData = self.QComboBox_currentData + return module + +try: + if "--pyqt4" in sys.argv: + sys.argv.remove("--pyqt4") + # fake a failed PyQt5 import + raise ImportError + import PyQt5 # __IGNORE_WARNING__ +except ImportError: + sys.meta_path.insert(0, PyQt4Importer()) + + if sys.version_info[0] == 2: + try: + from PyQt5 import sip + except ImportError: + import sip + sip.setapi('QString', 2) + sip.setapi('QVariant', 2) + sip.setapi('QTextStream', 2)