From 195a1a6fa3ff27c4593022ca47b1855c5a655d41 Mon Sep 17 00:00:00 2001 From: Ogi Moore Date: Sat, 5 Jun 2021 18:22:10 -0700 Subject: [PATCH] Remove Qt 6.0 support Simplify some PyQt6 code branches --- README.md | 8 ++--- pyqtgraph/Qt.py | 41 ------------------------ pyqtgraph/functions.py | 12 ++----- pyqtgraph/graphicsItems/AxisItem.py | 11 ++----- pyqtgraph/graphicsItems/ROI.py | 15 ++------- pyqtgraph/parametertree/ParameterItem.py | 10 ++---- pyqtgraph/widgets/GradientWidget.py | 13 ++------ pyqtgraph/widgets/RemoteGraphicsView.py | 7 ++-- 8 files changed, 17 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index 7488887e..64233994 100644 --- a/README.md +++ b/README.md @@ -29,12 +29,12 @@ This project supports: * All minor versions of Python released 42 months prior to the project, and at minimum the two latest minor versions. * All minor versions of numpy released in the 24 months prior to the project, and at minimum the last three minor versions. -* All minor versions of Qt 5 and Qt 6 currently supported by upstream Qt +* All Qt5 versions from 5.12-5.15, and Qt6 6.1 Currently this means: * Python 3.7+ -* Qt 5.12-6.0 +* Qt 5.12-5.15, 6.1 * Required * PyQt5, PyQt6, PySide2 or PySide6 * `numpy` 1.17+ @@ -58,8 +58,8 @@ The following table represents the python environments we test in our CI system. | PyQt5-5.12 | :white_check_mark: | | :x: | | PySide2-5.15 | | :white_check_mark: | | | PyQt5-5.15 | | :white_check_mark: | | -| PySide6-6.0 | | | :white_check_mark: | -| PyQt6-6.0 | | | :white_check_mark: | +| PySide6-6.1 | | | :white_check_mark: | +| PyQt6-6.1 | | | :white_check_mark: | * :x: - Not compatible * :white_check_mark: - Tested diff --git a/pyqtgraph/Qt.py b/pyqtgraph/Qt.py index 644badf2..a4df83a1 100644 --- a/pyqtgraph/Qt.py +++ b/pyqtgraph/Qt.py @@ -316,53 +316,12 @@ if QT_LIB in [PYQT5, PYQT6]: loadUiType = uic.loadUiType QtCore.Signal = QtCore.pyqtSignal - - -if QT_LIB == PYSIDE6: - # PySide6 6.0 has a missing binding - if not hasattr(QtGui.QGradient, 'setStops'): - def __setStops(self, stops): - for pos, color in stops: - self.setColorAt(pos, color) - QtGui.QGradient.setStops = __setStops - - -if QT_LIB == PYQT6: - # shim the old names for QPointF mouse coords - QtGui.QSinglePointEvent.localPos = lambda o : o.position() - QtGui.QSinglePointEvent.windowPos = lambda o : o.scenePosition() - QtGui.QSinglePointEvent.screenPos = lambda o : o.globalPosition() - - QtWidgets.QApplication.exec_ = QtWidgets.QApplication.exec - - # PyQt6 6.0.0 has a bug where it can't handle certain Type values returned - # by the Qt library. - if QtCore.PYQT_VERSION == 0x60000: - def new_method(self, old_method=QtCore.QEvent.type): - try: - typ = old_method(self) - except ValueError: - typ = QtCore.QEvent.Type.None_ - return typ - QtCore.QEvent.type = new_method - del new_method - - # PyQt6 6.1 renames some enums and flags to be in line with the other bindings. - # "Alignment" and "Orientations" are PyQt6 6.0 and are used in the generated - # ui files. Pending a regeneration of the template files, which would mean a - # drop in support for PyQt6 6.0, provide the old names for PyQt6 6.1. - # This is strictly a temporary private shim. Do not depend on it in your code. - if hasattr(QtCore.Qt, 'AlignmentFlag') and not hasattr(QtCore.Qt, 'Alignment'): - QtCore.Qt.Alignment = QtCore.Qt.AlignmentFlag - if hasattr(QtCore.Qt, 'Orientation') and not hasattr(QtCore.Qt, 'Orientations'): - QtCore.Qt.Orientations = QtCore.Qt.Orientation # USE_XXX variables are deprecated USE_PYSIDE = QT_LIB == PYSIDE USE_PYQT4 = QT_LIB == PYQT4 USE_PYQT5 = QT_LIB == PYQT5 - ## Make sure we have Qt >= 5.12 versionReq = [5, 12] m = re.match(r'(\d+)\.(\d+).*', QtVersion) diff --git a/pyqtgraph/functions.py b/pyqtgraph/functions.py index 50d1cb36..7706a44c 100644 --- a/pyqtgraph/functions.py +++ b/pyqtgraph/functions.py @@ -1559,15 +1559,9 @@ def ndarray_to_qimage(arr, fmt): # will trigger the COW mechanism, i.e. a copy is made under the hood. if QT_LIB.startswith('PyQt'): - if QtCore.PYQT_VERSION == 0x60000: - # PyQt5 -> const - # PyQt6 >= 6.0.1 -> const - # PyQt6 == 6.0.0 -> non-const - img_ptr = Qt.sip.voidptr(arr) - else: - # PyQt5 -> non-const - # PyQt6 >= 6.0.1 -> non-const - img_ptr = int(Qt.sip.voidptr(arr)) # or arr.ctypes.data + # PyQt5 -> non-const + # PyQt6 >= 6.0.1 -> non-const + img_ptr = int(Qt.sip.voidptr(arr)) # or arr.ctypes.data else: # bindings that support ndarray # PyQt5 -> const diff --git a/pyqtgraph/graphicsItems/AxisItem.py b/pyqtgraph/graphicsItems/AxisItem.py index 9a9a8ea6..e4f37fc5 100644 --- a/pyqtgraph/graphicsItems/AxisItem.py +++ b/pyqtgraph/graphicsItems/AxisItem.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from ..Qt import QtGui, QtCore, QT_LIB +from ..Qt import QtGui, QtCore from ..python2_3 import asUnicode import numpy as np from ..Point import Point @@ -1130,14 +1130,7 @@ class AxisItem(GraphicsWidget): alignFlags = QtCore.Qt.AlignmentFlag.AlignHCenter|QtCore.Qt.AlignmentFlag.AlignTop rect = QtCore.QRectF(x-width/2., tickStop+offset, width, height) - if QT_LIB == 'PyQt6': - # PyQt6 doesn't allow or-ing of different enum types - # so we need to take its value property - textFlags = alignFlags.value | QtCore.Qt.TextFlag.TextDontClip.value - else: - # for PyQt5, the following expression is not commutative! - textFlags = alignFlags | QtCore.Qt.TextFlag.TextDontClip - + textFlags = alignFlags | QtCore.Qt.TextFlag.TextDontClip #p.setPen(self.pen()) #p.drawText(rect, textFlags, vstr) textSpecs.append((rect, textFlags, vstr)) diff --git a/pyqtgraph/graphicsItems/ROI.py b/pyqtgraph/graphicsItems/ROI.py index e8589b3c..16b26700 100644 --- a/pyqtgraph/graphicsItems/ROI.py +++ b/pyqtgraph/graphicsItems/ROI.py @@ -842,13 +842,7 @@ class ROI(GraphicsObject): ## called by Handles when they are moved. ## pos is the new position of the handle in scene coords, as requested by the handle. if modifiers is None: - try: - # this works for PyQt6 6.1 and other bindings - modifiers = QtCore.Qt.KeyboardModifier.NoModifier - except AttributeError: - # this works for PyQt6 6.0 and other bindings - modifiers = QtCore.Qt.KeyboardModifiers(0) - + modifiers = QtCore.Qt.KeyboardModifier.NoModifier newState = self.stateCopy() index = self.indexOfHandle(handle) h = self.handles[index] @@ -1486,12 +1480,7 @@ class Handle(UIGraphicsItem): def movePoint(self, pos, modifiers=None, finish=True): if modifiers is None: - try: - # this works for PyQt6 6.1 and other bindings - modifiers = QtCore.Qt.KeyboardModifier.NoModifier - except AttributeError: - # this works for PyQt6 6.0 and other bindings - modifiers = QtCore.Qt.KeyboardModifiers(0) + modifiers = QtCore.Qt.KeyboardModifier.NoModifier for r in self.rois: if not r.checkPointMove(self, pos, modifiers): return diff --git a/pyqtgraph/parametertree/ParameterItem.py b/pyqtgraph/parametertree/ParameterItem.py index 509ededd..8e7c3afd 100644 --- a/pyqtgraph/parametertree/ParameterItem.py +++ b/pyqtgraph/parametertree/ParameterItem.py @@ -1,4 +1,4 @@ -from ..Qt import QtGui, QtCore, QT_LIB +from ..Qt import QtGui, QtCore from ..python2_3 import asUnicode import os, weakref, re @@ -162,13 +162,7 @@ class ParameterItem(QtGui.QTreeWidgetItem): # called when the user-visble title has changed (either opts['title'], or name if title is None) self.setText(0, self.param.title()) fm = QtGui.QFontMetrics(self.font(0)) - - if QT_LIB == 'PyQt6': - # PyQt6 doesn't allow or-ing of different enum types - # so we need to take its value property - textFlags = QtCore.Qt.TextFlag.TextSingleLine.value - else: - textFlags = QtCore.Qt.TextFlag.TextSingleLine + textFlags = QtCore.Qt.TextFlag.TextSingleLine size = fm.size(textFlags, self.text(0)) size.setHeight(int(size.height() * 1.35)) size.setWidth(int(size.width() * 1.15)) diff --git a/pyqtgraph/widgets/GradientWidget.py b/pyqtgraph/widgets/GradientWidget.py index ffad6378..809b4f66 100644 --- a/pyqtgraph/widgets/GradientWidget.py +++ b/pyqtgraph/widgets/GradientWidget.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from ..Qt import QtGui, QtCore, QtWidgets, QT_LIB +from ..Qt import QtGui, QtCore, QtWidgets from .GraphicsView import GraphicsView from ..graphicsItems.GradientEditorItem import GradientEditorItem import weakref @@ -40,16 +40,7 @@ class GradientWidget(GraphicsView): self.setOrientation(orientation) self.setCacheMode(self.CacheModeFlag.CacheNone) self.setRenderHints(QtGui.QPainter.RenderHint.Antialiasing | QtGui.QPainter.RenderHint.TextAntialiasing) - - if QT_LIB == 'PyQt6': - # PyQt6 doesn't allow or-ing of different enum types - # so we need to take its value property - NoFrame = QtWidgets.QFrame.Shape.NoFrame.value - Plain = QtWidgets.QFrame.Shadow.Plain.value - else: - NoFrame = QtWidgets.QFrame.Shape.NoFrame - Plain = QtWidgets.QFrame.Shadow.Plain - frame_style = NoFrame | Plain + frame_style = QtWidgets.QFrame.Shape.NoFrame | QtWidgets.QFrame.Shadow.Plain self.setFrameStyle(frame_style) #self.setBackgroundRole(QtGui.QPalette.ColorRole.NoRole) diff --git a/pyqtgraph/widgets/RemoteGraphicsView.py b/pyqtgraph/widgets/RemoteGraphicsView.py index 3545f6ea..3e34a757 100644 --- a/pyqtgraph/widgets/RemoteGraphicsView.py +++ b/pyqtgraph/widgets/RemoteGraphicsView.py @@ -236,11 +236,8 @@ class Renderer(GraphicsView): # see functions.py::makeQImage() for rationale if QT_LIB.startswith('PyQt'): - if QtCore.PYQT_VERSION == 0x60000: - img_ptr = sip.voidptr(self.shm) - else: - # PyQt5, PyQt6 >= 6.0.1 - img_ptr = int(sip.voidptr(self.shm)) + # PyQt5, PyQt6 >= 6.0.1 + img_ptr = int(sip.voidptr(self.shm)) else: # PySide2, PySide6 img_ptr = self.shm