|
""" Import Qt in a manner suitable for an IPython kernel. |
|
|
|
This is the import used for the `gui=qt` or `matplotlib=qt` initialization. |
|
|
|
Import Priority: |
|
|
|
if Qt has been imported anywhere else: |
|
use that |
|
|
|
if matplotlib has been imported and doesn't support v2 (<= 1.0.1): |
|
use PyQt4 @v1 |
|
|
|
Next, ask QT_API env variable |
|
|
|
if QT_API not set: |
|
ask matplotlib what it's using. If Qt4Agg or Qt5Agg, then use the |
|
version matplotlib is configured with |
|
|
|
else: (matplotlib said nothing) |
|
# this is the default path - nobody told us anything |
|
try in this order: |
|
PyQt default version, PySide, PyQt5 |
|
else: |
|
use what QT_API says |
|
|
|
Note that %gui's implementation will always set a `QT_API`, see |
|
`IPython.terminal.pt_inputhooks.get_inputhook_name_and_func` |
|
|
|
""" |
|
|
|
|
|
|
|
|
|
import os |
|
import sys |
|
|
|
from IPython.external.qt_loaders import ( |
|
load_qt, |
|
loaded_api, |
|
enum_factory, |
|
|
|
QT_API_PYQT6, |
|
QT_API_PYSIDE6, |
|
|
|
QT_API_PYQT5, |
|
QT_API_PYSIDE2, |
|
|
|
QT_API_PYQT, |
|
QT_API_PYSIDE, |
|
|
|
QT_API_PYQT_DEFAULT, |
|
) |
|
|
|
_qt_apis = ( |
|
|
|
QT_API_PYQT6, |
|
QT_API_PYSIDE6, |
|
|
|
QT_API_PYQT5, |
|
QT_API_PYSIDE2, |
|
|
|
QT_API_PYQT_DEFAULT, |
|
) |
|
|
|
|
|
def matplotlib_options(mpl): |
|
"""Constraints placed on an imported matplotlib.""" |
|
if mpl is None: |
|
return |
|
backend = mpl.rcParams.get('backend', None) |
|
if backend == 'Qt4Agg': |
|
mpqt = mpl.rcParams.get('backend.qt4', None) |
|
if mpqt is None: |
|
return None |
|
if mpqt.lower() == 'pyside': |
|
return [QT_API_PYSIDE] |
|
elif mpqt.lower() == 'pyqt4': |
|
return [QT_API_PYQT_DEFAULT] |
|
elif mpqt.lower() == 'pyqt4v2': |
|
return [QT_API_PYQT] |
|
raise ImportError("unhandled value for backend.qt4 from matplotlib: %r" % |
|
mpqt) |
|
elif backend == 'Qt5Agg': |
|
mpqt = mpl.rcParams.get('backend.qt5', None) |
|
if mpqt is None: |
|
return None |
|
if mpqt.lower() == 'pyqt5': |
|
return [QT_API_PYQT5] |
|
raise ImportError("unhandled value for backend.qt5 from matplotlib: %r" % |
|
mpqt) |
|
|
|
def get_options(): |
|
"""Return a list of acceptable QT APIs, in decreasing order of preference.""" |
|
|
|
loaded = loaded_api() |
|
if loaded is not None: |
|
return [loaded] |
|
|
|
mpl = sys.modules.get("matplotlib", None) |
|
|
|
if mpl is not None and tuple(mpl.__version__.split(".")) < ("1", "0", "2"): |
|
|
|
return [QT_API_PYQT_DEFAULT] |
|
|
|
qt_api = os.environ.get('QT_API', None) |
|
if qt_api is None: |
|
|
|
return matplotlib_options(mpl) or [ |
|
QT_API_PYQT_DEFAULT, |
|
QT_API_PYQT6, |
|
QT_API_PYSIDE6, |
|
QT_API_PYQT5, |
|
QT_API_PYSIDE2, |
|
] |
|
elif qt_api not in _qt_apis: |
|
raise RuntimeError("Invalid Qt API %r, valid values are: %r" % |
|
(qt_api, ', '.join(_qt_apis))) |
|
else: |
|
return [qt_api] |
|
|
|
|
|
api_opts = get_options() |
|
QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) |
|
enum_helper = enum_factory(QT_API, QtCore) |
|
|