Files
flatcam-wsl/libs/qdarktheme/qtpy/qt_compat.py
2023-10-19 13:49:14 +03:00

83 lines
2.0 KiB
Python

"""Module for Qt compat."""
from __future__ import annotations
import os
import sys
class QtImportError(ImportError):
"""Error raise if no bindings could be selected."""
pass
qt_import_error = QtImportError(
"Failed to import qt-binding. Check packages(pip list)."
"\n\tAvailable Qt-binding packages: PySide6, PyQt6, PyQt5, PySide2."
)
# Qt6
_QT_API_PYSIDE6 = "PySide6"
_QT_API_PYQT6 = "PyQt6"
# Qt5
_QT_API_PYQT5 = "PyQt5"
_QT_API_PYSIDE2 = "PySide2"
_API_LIST = [_QT_API_PYSIDE6, _QT_API_PYQT6, _QT_API_PYQT5, _QT_API_PYSIDE2]
def _get_loaded_api() -> str | None:
"""Return which API is loaded.
If this returns anything besides None,
importing any other Qt-binding is unsafe.
"""
for api in _API_LIST:
if sys.modules.get(f"{api}.QtCore"):
return api
return None
def _get_environ_api() -> str | None:
"""Return which API is specified in environ."""
_qt_api_env = os.environ.get("QT_API")
if _qt_api_env is not None:
_qt_api_env = _qt_api_env.lower()
_env_to_module = {
"pyside6": _QT_API_PYSIDE6,
"pyqt6": _QT_API_PYQT6,
"pyqt5": _QT_API_PYQT5,
"pyside2": _QT_API_PYSIDE2,
None: None,
}
try:
return _env_to_module[_qt_api_env]
except KeyError:
raise KeyError(
"The environment variable QT_API has the unrecognized value "
f"{_qt_api_env!r}. "
f"Valid values are {[k for k in _env_to_module if k is not None]}"
) from None
def _get_installed_api() -> str | None:
"""Return which API is installed."""
# Fix [AttributeError: module 'importlib' has no attribute 'util']
# See https://stackoverflow.com/a/39661116/13452582
from importlib import util
for api in _API_LIST:
if util.find_spec(api) is not None:
return api
return None
QT_API = _get_loaded_api()
if QT_API is None:
QT_API = _get_environ_api()
if QT_API is None:
QT_API = _get_installed_api()