|
11 | 11 | on_rtd = os.environ.get('READTHEDOCS', None) == 'True' |
12 | 12 |
|
13 | 13 | if not on_rtd: # pragma: no cover |
14 | | - try: |
15 | | - from PySide import QtCore |
16 | | - USING_PYSIDE = True |
17 | | - except ImportError: |
18 | | - USING_PYSIDE = False |
19 | | - |
20 | | - FORCE_PYQT = os.environ.get('PYTEST_QT_FORCE_PYQT', 'false') != 'false' |
21 | | - PYQT_VER = None |
22 | | - if not USING_PYSIDE or FORCE_PYQT: |
| 14 | + |
| 15 | + def _try_import(name): |
23 | 16 | try: |
24 | | - import sip |
| 17 | + __import__(name) |
| 18 | + return True |
25 | 19 | except ImportError: |
26 | | - msg = 'pytest-qt requires either PyQt4 or PySide to be installed' |
27 | | - raise ImportError(msg) |
| 20 | + return False |
28 | 21 |
|
29 | | - if 'PYTEST_QT_FORCE_PYQT' in os.environ: |
30 | | - PYQT_VER = os.environ.get('PYTEST_QT_FORCE_PYQT', '4') |
31 | | - # backward compatibility |
32 | | - if PYQT_VER == 'true': |
33 | | - PYQT_VER = '4' |
34 | | - if PYQT_VER not in ('4', '5'): |
35 | | - msg = 'Unsupported PyQt version in $PYTEST_QT_FORCE_PYQT: %s' |
36 | | - raise RuntimeError(msg % PYQT_VER) |
| 22 | + def _guess_qt_api(): |
| 23 | + if _try_import('PySide'): |
| 24 | + return 'pyside' |
| 25 | + elif _try_import('PyQt4'): |
| 26 | + return 'pyqt4' |
| 27 | + elif _try_import('PyQt5'): |
| 28 | + return 'pyqt5' |
37 | 29 | else: |
38 | | - # give preference for PyQt4 for backward compatibility |
39 | | - try: |
40 | | - import PyQt4 |
41 | | - PYQT_VER = '4' |
42 | | - except ImportError: |
43 | | - import PyQt5 |
44 | | - PYQT_VER = '5' |
45 | | - |
46 | | - USING_PYSIDE = False |
47 | | - |
48 | | - if USING_PYSIDE: |
49 | | - def _import_module(module_name): |
50 | | - pyside = __import__('PySide', globals(), locals(), [module_name], 0) |
51 | | - return getattr(pyside, module_name) |
52 | | - |
53 | | - Signal = QtCore.Signal |
54 | | - Slot = QtCore.Slot |
55 | | - Property = QtCore.Property |
| 30 | + msg = 'pytest-qt requires either PySide, PyQt4 or PyQt5 to be installed' |
| 31 | + raise ImportError(msg) |
| 32 | + |
| 33 | + # backward compatibility support: PYTEST_QT_FORCE_PYQT |
| 34 | + if os.environ.get('PYTEST_QT_FORCE_PYQT', 'false') == 'true': |
| 35 | + QT_API = 'pyqt4' |
56 | 36 | else: |
57 | | - def _import_module(module_name): |
58 | | - pyside = __import__('PyQt%s' % PYQT_VER, |
59 | | - globals(), locals(), [module_name], 0) |
60 | | - return getattr(pyside, module_name) |
| 37 | + QT_API = os.environ.get('PYTEST_QT_API') |
| 38 | + if QT_API is not None: |
| 39 | + QT_API = QT_API.lower() |
| 40 | + if QT_API not in ('pyside', 'pyqt4', 'pyqt5'): |
| 41 | + msg = 'Invalid value for $PYTEST_QT_API: %s' |
| 42 | + raise RuntimeError(msg % QT_API) |
| 43 | + else: |
| 44 | + QT_API = _guess_qt_api() |
61 | 45 |
|
62 | | - QtCore = _import_module('QtCore') |
63 | | - Signal = QtCore.pyqtSignal |
64 | | - Slot = QtCore.pyqtSlot |
65 | | - Property = QtCore.pyqtProperty |
66 | | - |
67 | | - |
| 46 | + # backward compatibility |
| 47 | + USING_PYSIDE = QT_API == 'pyside' |
| 48 | + |
| 49 | + def _import_module(module_name): |
| 50 | + m = __import__(_root_module, globals(), locals(), [module_name], 0) |
| 51 | + return getattr(m, module_name) |
| 52 | + |
| 53 | + _root_modules = { |
| 54 | + 'pyside': 'PySide', |
| 55 | + 'pyqt4': 'PyQt4', |
| 56 | + 'pyqt5': 'PyQt5', |
| 57 | + } |
| 58 | + _root_module = _root_modules[QT_API] |
| 59 | + |
| 60 | + QtCore = _import_module('QtCore') |
68 | 61 | QtGui = _import_module('QtGui') |
69 | 62 | QtTest = _import_module('QtTest') |
70 | 63 | Qt = QtCore.Qt |
71 | 64 | QEvent = QtCore.QEvent |
72 | | - if not USING_PYSIDE and PYQT_VER == '5': |
73 | | - _QtWidgets = _import_module('QtWidgets') |
74 | | - QApplication = _QtWidgets.QApplication |
75 | | - QWidget = _QtWidgets.QWidget |
76 | | - else: |
| 65 | + |
| 66 | + if QT_API == 'pyside': |
| 67 | + Signal = QtCore.Signal |
| 68 | + Slot = QtCore.Slot |
| 69 | + Property = QtCore.Property |
77 | 70 | QApplication = QtGui.QApplication |
78 | 71 | QWidget = QtGui.QWidget |
79 | 72 |
|
| 73 | + elif QT_API in ('pyqt4', 'pyqt5'): |
| 74 | + Signal = QtCore.pyqtSignal |
| 75 | + Slot = QtCore.pyqtSlot |
| 76 | + Property = QtCore.pyqtProperty |
| 77 | + |
| 78 | + if QT_API == 'pyqt5': |
| 79 | + _QtWidgets = _import_module('QtWidgets') |
| 80 | + QApplication = _QtWidgets.QApplication |
| 81 | + QWidget = _QtWidgets.QWidget |
| 82 | + else: |
| 83 | + QApplication = QtGui.QApplication |
| 84 | + QWidget = QtGui.QWidget |
| 85 | + |
80 | 86 | else: # pragma: no cover |
81 | 87 | USING_PYSIDE = True |
82 | 88 |
|
@@ -104,3 +110,4 @@ def __getattr__(cls, name): |
104 | 110 | QEvent = Mock() |
105 | 111 | QApplication = Mock() |
106 | 112 | QWidget = Mock() |
| 113 | + QT_API = '<none>' |
0 commit comments