@@ -64,14 +64,21 @@ def commit_api(api):
6464 """Commit to a particular API, and trigger ImportErrors on subsequent
6565 dangerous imports"""
6666
67+ if api == QT_API_PYSIDE2 :
68+ ID .forbid ('PySide' )
69+ ID .forbid ('PyQt4' )
70+ ID .forbid ('PyQt5' )
6771 if api == QT_API_PYSIDE :
72+ ID .forbid ('PySide2' )
6873 ID .forbid ('PyQt4' )
6974 ID .forbid ('PyQt5' )
7075 elif api == QT_API_PYQT5 :
76+ ID .forbid ('PySide2' )
7177 ID .forbid ('PySide' )
7278 ID .forbid ('PyQt4' )
7379 else : # There are three other possibilities, all representing PyQt4
7480 ID .forbid ('PyQt5' )
81+ ID .forbid ('PySide2' )
7582 ID .forbid ('PySide' )
7683
7784
@@ -83,7 +90,7 @@ def loaded_api():
8390
8491 Returns
8592 -------
86- None, 'pyside', 'pyqt', 'pyqt5', or 'pyqtv1'
93+ None, 'pyside2', ' pyside', 'pyqt', 'pyqt5', or 'pyqtv1'
8794 """
8895 if 'PyQt4.QtCore' in sys .modules :
8996 if qtapi_version () == 2 :
@@ -92,19 +99,21 @@ def loaded_api():
9299 return QT_API_PYQTv1
93100 elif 'PySide.QtCore' in sys .modules :
94101 return QT_API_PYSIDE
102+ elif 'PySide2.QtCore' in sys .modules :
103+ return QT_API_PYSIDE2
95104 elif 'PyQt5.QtCore' in sys .modules :
96105 return QT_API_PYQT5
97106 return None
98107
99108
100109def has_binding (api ):
101- """Safely check for PyQt4/5 or PySide , without importing submodules
110+ """Safely check for PyQt4/5, PySide or PySide2 , without importing submodules
102111
103112 Supports Python <= 3.3
104113
105114 Parameters
106115 ----------
107- api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyqtdefault']
116+ api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyside2' | ' pyqtdefault']
108117 Which module to check for
109118
110119 Returns
@@ -124,7 +133,7 @@ def has_binding(api):
124133 imp .find_module ('QtCore' , mod .__path__ )
125134 imp .find_module ('QtGui' , mod .__path__ )
126135 imp .find_module ('QtSvg' , mod .__path__ )
127- if api == QT_API_PYQT5 :
136+ if api in ( QT_API_PYQT5 , QT_API_PYSIDE2 ) :
128137 # QT5 requires QtWidgets too
129138 imp .find_module ('QtWidgets' , mod .__path__ )
130139
@@ -137,13 +146,13 @@ def has_binding(api):
137146 return False
138147
139148def has_binding_new (api ):
140- """Safely check for PyQt4/5 or PySide , without importing submodules
149+ """Safely check for PyQt4/5, PySide or PySide2 , without importing submodules
141150
142151 Supports Python >= 3.4
143152
144153 Parameters
145154 ----------
146- api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyqtdefault']
155+ api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyside2' | ' pyqtdefault']
147156 Which module to check for
148157
149158 Returns
@@ -277,6 +286,22 @@ def import_pyside():
277286 from PySide import QtGui , QtCore , QtSvg
278287 return QtCore , QtGui , QtSvg , QT_API_PYSIDE
279288
289+ def import_pyside2 ():
290+ """
291+ Import PySide2
292+
293+ ImportErrors raised within this function are non-recoverable
294+ """
295+ from PySide2 import QtGui , QtCore , QtSvg , QtWidgets , QtPrintSupport
296+
297+ # Join QtGui and QtWidgets for Qt4 compatibility.
298+ QtGuiCompat = types .ModuleType ('QtGuiCompat' )
299+ QtGuiCompat .__dict__ .update (QtGui .__dict__ )
300+ QtGuiCompat .__dict__ .update (QtWidgets .__dict__ )
301+ QtGuiCompat .__dict__ .update (QtPrintSupport .__dict__ )
302+
303+ return QtCore , QtGuiCompat , QtSvg , QT_API_PYSIDE2
304+
280305
281306def load_qt (api_options ):
282307 """
@@ -288,7 +313,7 @@ def load_qt(api_options):
288313 Parameters
289314 ----------
290315 api_options: List of strings
291- The order of APIs to try. Valid items are 'pyside',
316+ The order of APIs to try. Valid items are 'pyside', 'pyside2',
292317 'pyqt', 'pyqt5', 'pyqtv1' and 'pyqtdefault'
293318
294319 Returns
@@ -304,12 +329,14 @@ def load_qt(api_options):
304329 bindings (either becaues they aren't installed, or because
305330 an incompatible library has already been installed)
306331 """
307- loaders = {QT_API_PYSIDE : import_pyside ,
332+ loaders = {
333+ QT_API_PYSIDE2 : import_pyside2 ,
334+ QT_API_PYSIDE : import_pyside ,
308335 QT_API_PYQT : import_pyqt4 ,
309336 QT_API_PYQT5 : import_pyqt5 ,
310337 QT_API_PYQTv1 : partial (import_pyqt4 , version = 1 ),
311338 QT_API_PYQT_DEFAULT : partial (import_pyqt4 , version = None )
312- }
339+ }
313340
314341 for api in api_options :
315342
@@ -329,16 +356,18 @@ def load_qt(api_options):
329356 else :
330357 raise ImportError ("""
331358 Could not load requested Qt binding. Please ensure that
332- PyQt4 >= 4.7, PyQt5 or PySide >= 1.0.3 is available,
359+ PyQt4 >= 4.7, PyQt5, PySide >= 1.0.3 or PySide2 is available,
333360 and only one is imported per session.
334361
335362 Currently-imported Qt library: %r
336363 PyQt4 available (requires QtCore, QtGui, QtSvg): %s
337364 PyQt5 available (requires QtCore, QtGui, QtSvg, QtWidgets): %s
338365 PySide >= 1.0.3 installed: %s
366+ PySide2 installed: %s
339367 Tried to load: %r
340368 """ % (loaded_api (),
341369 has_binding (QT_API_PYQT ),
342370 has_binding (QT_API_PYQT5 ),
343371 has_binding (QT_API_PYSIDE ),
372+ has_binding (QT_API_PYSIDE2 ),
344373 api_options ))
0 commit comments