diff --git a/pyqtgraph/Qt.py b/pyqtgraph/Qt.py index 2fcff32f..a175f616 100644 --- a/pyqtgraph/Qt.py +++ b/pyqtgraph/Qt.py @@ -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 PySide - USE_PYSIDE = True + import PyQt5 + USE_QT_PY = PYQT5 except ImportError: - raise Exception("PyQtGraph requires either PyQt4 or PySide; neither package could be imported.") + try: + import PySide + 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 try: @@ -81,9 +96,9 @@ if USE_PYSIDE: base_class = eval('QtGui.%s'%widget_class) return form_class, base_class - - -else: + +elif USE_QT_PY == PYQT4: + from PyQt4 import QtGui, QtCore, uic try: from PyQt4 import QtSvg @@ -103,10 +118,59 @@ 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 + # Re-implement deprecated APIs + def scale(self, sx, sy): + self.setTransform(QtGui.QTransform.fromScale(sx, sy), True) + QtWidgets.QGraphicsItem.scale = scale + + def rotate(self, angle): + self.setRotation(self.rotation() + angle) + QtWidgets.QGraphicsItem.rotate = rotate + + def translate(self, dx, dy): + self.setTransform(QtGui.QTransform.fromTranslate(dx, dy), True) + QtWidgets.QGraphicsItem.translate = translate + + def setMargin(self, i): + self.setContentsMargins(i, i, i, i) + QtWidgets.QGridLayout.setMargin = setMargin + + def setResizeMode(self, mode): + self.setSectionResizeMode(mode) + QtWidgets.QHeaderView.setResizeMode = setResizeMode + + + QtGui.QApplication = QtWidgets.QApplication + QtGui.QGraphicsScene = QtWidgets.QGraphicsScene + QtGui.QGraphicsObject = QtWidgets.QGraphicsObject + QtGui.QGraphicsWidget = QtWidgets.QGraphicsWidget + + 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()))) diff --git a/pyqtgraph/__init__.py b/pyqtgraph/__init__.py index 30160565..4749a48f 100644 --- a/pyqtgraph/__init__.py +++ b/pyqtgraph/__init__.py @@ -41,7 +41,8 @@ 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).') - QtGui.QApplication.setGraphicsSystem('raster') ## work around a variety of bugs in the native graphics system + 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. diff --git a/pyqtgraph/graphicsItems/PlotItem/plotConfigTemplate_pyqt.py b/pyqtgraph/graphicsItems/PlotItem/plotConfigTemplate_pyqt.py index e09c9978..a06519bf 100644 --- a/pyqtgraph/graphicsItems/PlotItem/plotConfigTemplate_pyqt.py +++ b/pyqtgraph/graphicsItems/PlotItem/plotConfigTemplate_pyqt.py @@ -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 diff --git a/pyqtgraph/graphicsItems/ViewBox/axisCtrlTemplate_pyqt.py b/pyqtgraph/graphicsItems/ViewBox/axisCtrlTemplate_pyqt.py index d8ef1925..5d952741 100644 --- a/pyqtgraph/graphicsItems/ViewBox/axisCtrlTemplate_pyqt.py +++ b/pyqtgraph/graphicsItems/ViewBox/axisCtrlTemplate_pyqt.py @@ -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 diff --git a/pyqtgraph/imageview/ImageViewTemplate_pyqt.py b/pyqtgraph/imageview/ImageViewTemplate_pyqt.py index 78156317..18b68e96 100644 --- a/pyqtgraph/imageview/ImageViewTemplate_pyqt.py +++ b/pyqtgraph/imageview/ImageViewTemplate_pyqt.py @@ -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