Remove Qt 6.0 support
Simplify some PyQt6 code branches
This commit is contained in:
parent
d455da9aec
commit
195a1a6fa3
@ -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 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 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:
|
Currently this means:
|
||||||
|
|
||||||
* Python 3.7+
|
* Python 3.7+
|
||||||
* Qt 5.12-6.0
|
* Qt 5.12-5.15, 6.1
|
||||||
* Required
|
* Required
|
||||||
* PyQt5, PyQt6, PySide2 or PySide6
|
* PyQt5, PyQt6, PySide2 or PySide6
|
||||||
* `numpy` 1.17+
|
* `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: |
|
| PyQt5-5.12 | :white_check_mark: | | :x: |
|
||||||
| PySide2-5.15 | | :white_check_mark: | |
|
| PySide2-5.15 | | :white_check_mark: | |
|
||||||
| PyQt5-5.15 | | :white_check_mark: | |
|
| PyQt5-5.15 | | :white_check_mark: | |
|
||||||
| PySide6-6.0 | | | :white_check_mark: |
|
| PySide6-6.1 | | | :white_check_mark: |
|
||||||
| PyQt6-6.0 | | | :white_check_mark: |
|
| PyQt6-6.1 | | | :white_check_mark: |
|
||||||
|
|
||||||
* :x: - Not compatible
|
* :x: - Not compatible
|
||||||
* :white_check_mark: - Tested
|
* :white_check_mark: - Tested
|
||||||
|
@ -317,52 +317,11 @@ if QT_LIB in [PYQT5, PYQT6]:
|
|||||||
|
|
||||||
QtCore.Signal = QtCore.pyqtSignal
|
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_XXX variables are deprecated
|
||||||
USE_PYSIDE = QT_LIB == PYSIDE
|
USE_PYSIDE = QT_LIB == PYSIDE
|
||||||
USE_PYQT4 = QT_LIB == PYQT4
|
USE_PYQT4 = QT_LIB == PYQT4
|
||||||
USE_PYQT5 = QT_LIB == PYQT5
|
USE_PYQT5 = QT_LIB == PYQT5
|
||||||
|
|
||||||
|
|
||||||
## Make sure we have Qt >= 5.12
|
## Make sure we have Qt >= 5.12
|
||||||
versionReq = [5, 12]
|
versionReq = [5, 12]
|
||||||
m = re.match(r'(\d+)\.(\d+).*', QtVersion)
|
m = re.match(r'(\d+)\.(\d+).*', QtVersion)
|
||||||
|
@ -1559,12 +1559,6 @@ def ndarray_to_qimage(arr, fmt):
|
|||||||
# will trigger the COW mechanism, i.e. a copy is made under the hood.
|
# will trigger the COW mechanism, i.e. a copy is made under the hood.
|
||||||
|
|
||||||
if QT_LIB.startswith('PyQt'):
|
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
|
# PyQt5 -> non-const
|
||||||
# PyQt6 >= 6.0.1 -> non-const
|
# PyQt6 >= 6.0.1 -> non-const
|
||||||
img_ptr = int(Qt.sip.voidptr(arr)) # or arr.ctypes.data
|
img_ptr = int(Qt.sip.voidptr(arr)) # or arr.ctypes.data
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from ..Qt import QtGui, QtCore, QT_LIB
|
from ..Qt import QtGui, QtCore
|
||||||
from ..python2_3 import asUnicode
|
from ..python2_3 import asUnicode
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from ..Point import Point
|
from ..Point import Point
|
||||||
@ -1130,14 +1130,7 @@ class AxisItem(GraphicsWidget):
|
|||||||
alignFlags = QtCore.Qt.AlignmentFlag.AlignHCenter|QtCore.Qt.AlignmentFlag.AlignTop
|
alignFlags = QtCore.Qt.AlignmentFlag.AlignHCenter|QtCore.Qt.AlignmentFlag.AlignTop
|
||||||
rect = QtCore.QRectF(x-width/2., tickStop+offset, width, height)
|
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.setPen(self.pen())
|
||||||
#p.drawText(rect, textFlags, vstr)
|
#p.drawText(rect, textFlags, vstr)
|
||||||
textSpecs.append((rect, textFlags, vstr))
|
textSpecs.append((rect, textFlags, vstr))
|
||||||
|
@ -842,13 +842,7 @@ class ROI(GraphicsObject):
|
|||||||
## called by Handles when they are moved.
|
## called by Handles when they are moved.
|
||||||
## pos is the new position of the handle in scene coords, as requested by the handle.
|
## pos is the new position of the handle in scene coords, as requested by the handle.
|
||||||
if modifiers is None:
|
if modifiers is None:
|
||||||
try:
|
|
||||||
# this works for PyQt6 6.1 and other bindings
|
|
||||||
modifiers = QtCore.Qt.KeyboardModifier.NoModifier
|
modifiers = QtCore.Qt.KeyboardModifier.NoModifier
|
||||||
except AttributeError:
|
|
||||||
# this works for PyQt6 6.0 and other bindings
|
|
||||||
modifiers = QtCore.Qt.KeyboardModifiers(0)
|
|
||||||
|
|
||||||
newState = self.stateCopy()
|
newState = self.stateCopy()
|
||||||
index = self.indexOfHandle(handle)
|
index = self.indexOfHandle(handle)
|
||||||
h = self.handles[index]
|
h = self.handles[index]
|
||||||
@ -1486,12 +1480,7 @@ class Handle(UIGraphicsItem):
|
|||||||
|
|
||||||
def movePoint(self, pos, modifiers=None, finish=True):
|
def movePoint(self, pos, modifiers=None, finish=True):
|
||||||
if modifiers is None:
|
if modifiers is None:
|
||||||
try:
|
|
||||||
# this works for PyQt6 6.1 and other bindings
|
|
||||||
modifiers = QtCore.Qt.KeyboardModifier.NoModifier
|
modifiers = QtCore.Qt.KeyboardModifier.NoModifier
|
||||||
except AttributeError:
|
|
||||||
# this works for PyQt6 6.0 and other bindings
|
|
||||||
modifiers = QtCore.Qt.KeyboardModifiers(0)
|
|
||||||
for r in self.rois:
|
for r in self.rois:
|
||||||
if not r.checkPointMove(self, pos, modifiers):
|
if not r.checkPointMove(self, pos, modifiers):
|
||||||
return
|
return
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from ..Qt import QtGui, QtCore, QT_LIB
|
from ..Qt import QtGui, QtCore
|
||||||
from ..python2_3 import asUnicode
|
from ..python2_3 import asUnicode
|
||||||
import os, weakref, re
|
import os, weakref, re
|
||||||
|
|
||||||
@ -162,12 +162,6 @@ class ParameterItem(QtGui.QTreeWidgetItem):
|
|||||||
# called when the user-visble title has changed (either opts['title'], or name if title is None)
|
# called when the user-visble title has changed (either opts['title'], or name if title is None)
|
||||||
self.setText(0, self.param.title())
|
self.setText(0, self.param.title())
|
||||||
fm = QtGui.QFontMetrics(self.font(0))
|
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 = fm.size(textFlags, self.text(0))
|
||||||
size.setHeight(int(size.height() * 1.35))
|
size.setHeight(int(size.height() * 1.35))
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from ..Qt import QtGui, QtCore, QtWidgets, QT_LIB
|
from ..Qt import QtGui, QtCore, QtWidgets
|
||||||
from .GraphicsView import GraphicsView
|
from .GraphicsView import GraphicsView
|
||||||
from ..graphicsItems.GradientEditorItem import GradientEditorItem
|
from ..graphicsItems.GradientEditorItem import GradientEditorItem
|
||||||
import weakref
|
import weakref
|
||||||
@ -40,16 +40,7 @@ class GradientWidget(GraphicsView):
|
|||||||
self.setOrientation(orientation)
|
self.setOrientation(orientation)
|
||||||
self.setCacheMode(self.CacheModeFlag.CacheNone)
|
self.setCacheMode(self.CacheModeFlag.CacheNone)
|
||||||
self.setRenderHints(QtGui.QPainter.RenderHint.Antialiasing | QtGui.QPainter.RenderHint.TextAntialiasing)
|
self.setRenderHints(QtGui.QPainter.RenderHint.Antialiasing | QtGui.QPainter.RenderHint.TextAntialiasing)
|
||||||
|
frame_style = QtWidgets.QFrame.Shape.NoFrame | QtWidgets.QFrame.Shadow.Plain
|
||||||
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
|
|
||||||
|
|
||||||
self.setFrameStyle(frame_style)
|
self.setFrameStyle(frame_style)
|
||||||
#self.setBackgroundRole(QtGui.QPalette.ColorRole.NoRole)
|
#self.setBackgroundRole(QtGui.QPalette.ColorRole.NoRole)
|
||||||
|
@ -236,9 +236,6 @@ class Renderer(GraphicsView):
|
|||||||
|
|
||||||
# see functions.py::makeQImage() for rationale
|
# see functions.py::makeQImage() for rationale
|
||||||
if QT_LIB.startswith('PyQt'):
|
if QT_LIB.startswith('PyQt'):
|
||||||
if QtCore.PYQT_VERSION == 0x60000:
|
|
||||||
img_ptr = sip.voidptr(self.shm)
|
|
||||||
else:
|
|
||||||
# PyQt5, PyQt6 >= 6.0.1
|
# PyQt5, PyQt6 >= 6.0.1
|
||||||
img_ptr = int(sip.voidptr(self.shm))
|
img_ptr = int(sip.voidptr(self.shm))
|
||||||
else:
|
else:
|
||||||
|
Loading…
Reference in New Issue
Block a user