Adding PyQt5 compatibility (broken)

Adding compatibility for PyQt5 via a shim in Qt.py. This restructures the PyQt5 libraries
to match the layout seen in PyQt4, allowing it to continue to be used as drop in replacement.

This works up to the point of importing, however other API changes are broken - for example
the deprectation of .scale() on GraphicsItems throws an error currently.
This commit is contained in:
Martin Fitzpatrick 2014-02-14 10:29:33 +01:00
parent c8ee4a86be
commit 42dbd7956a
5 changed files with 58 additions and 16 deletions

View File

@ -11,25 +11,40 @@ This module exists to smooth out some of the differences between PySide and PyQt
import sys, re
PYSIDE = 0
PYQT4 = 1
PYQT5 = 2
USE_QT_PY = None
## Automatically determine whether to use PyQt or PySide.
## This is done by first checking to see whether one of the libraries
## is already imported. If not, then attempt to import PyQt4, then PySide.
if 'PyQt4' in sys.modules:
USE_PYSIDE = False
USE_QT_PY = PYQT4
if 'PyQt5' in sys.modules:
USE_QT_PY = PYQT5
elif 'PySide' in sys.modules:
USE_PYSIDE = True
USE_QT_PY = PYSIDE
else:
try:
import PyQt4
USE_PYSIDE = False
USE_QT_PY = PYQT4
except ImportError:
try:
import PyQt5
USE_QT_PY = PYQT5
except ImportError:
try:
import PySide
USE_PYSIDE = True
except ImportError:
raise Exception("PyQtGraph requires either PyQt4 or PySide; neither package could be imported.")
USE_QT_PY = PYSIDE
except:
pass
if USE_PYSIDE:
if USE_QT_PY == None:
raise Exception("PyQtGraph requires one of PyQt4, PyQt5 or PySide; none of these packages could be imported.")
if USE_QT_PY == PYSIDE:
from PySide import QtGui, QtCore, QtOpenGL, QtSvg
import PySide
VERSION_INFO = 'PySide ' + PySide.__version__
@ -65,8 +80,8 @@ if USE_PYSIDE:
return form_class, base_class
elif USE_QT_PY == PYQT4:
else:
from PyQt4 import QtGui, QtCore, uic
try:
from PyQt4 import QtSvg
@ -83,10 +98,36 @@ else:
QtCore.Signal = QtCore.pyqtSignal
VERSION_INFO = 'PyQt4 ' + QtCore.PYQT_VERSION_STR + ' Qt ' + QtCore.QT_VERSION_STR
elif USE_QT_PY == PYQT5:
# We're using PyQt5 which has a different structure so we're going to use a shim to
# recreate the Qt4 structure for Qt5
from PyQt5 import QtGui, QtCore, QtWidgets, Qt, uic
try:
from PyQt5 import QtSvg
except ImportError:
pass
try:
from PyQt5 import QtOpenGL
except ImportError:
pass
QtGui.QApplication = QtWidgets.QApplication
QtGui.QGraphicsScene = QtWidgets.QGraphicsScene
QtGui.QGraphicsObject = QtWidgets.QGraphicsObject
QtGui.QGraphicsWidget = QGraphicsWidget5
QtGui.QApplication.setGraphicsSystem = None
QtCore.Signal = Qt.pyqtSignal
# Import all QtWidgets objects into QtGui
for o in dir(QtWidgets):
if o.startswith('Q'):
setattr(QtGui, o, getattr(QtWidgets,o) )
## Make sure we have Qt >= 4.7
versionReq = [4, 7]
QtVersion = PySide.QtCore.__version__ if USE_PYSIDE else QtCore.QT_VERSION_STR
USE_PYSIDE = USE_QT_PY == PYSIDE # still needed internally elsewhere
QtVersion = PySide.QtCore.__version__ if USE_QT_PY == PYSIDE else QtCore.QT_VERSION_STR
m = re.match(r'(\d+)\.(\d+).*', QtVersion)
if m is not None and list(map(int, m.groups())) < versionReq:
print(list(map(int, m.groups())))

View File

@ -41,6 +41,7 @@ elif 'darwin' in sys.platform: ## openGL can have a major impact on mac, but als
useOpenGL = False
if QtGui.QApplication.instance() is not None:
print('Warning: QApplication was created before pyqtgraph was imported; there may be problems (to avoid bugs, call QApplication.setGraphicsSystem("raster") before the QApplication is created).')
if QtGui.QApplication.setGraphicsSystem:
QtGui.QApplication.setGraphicsSystem('raster') ## work around a variety of bugs in the native graphics system
else:
useOpenGL = False ## on windows there's a more even performance / bugginess tradeoff.

View File

@ -7,7 +7,7 @@
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
from ...Qt import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8

View File

@ -7,7 +7,7 @@
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
from ...Qt import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8

View File

@ -7,7 +7,7 @@
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
from ..Qt import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8