diff --git a/pyqtgraph/functions.py b/pyqtgraph/functions.py index dc8a9dda..adca397c 100644 --- a/pyqtgraph/functions.py +++ b/pyqtgraph/functions.py @@ -1744,8 +1744,20 @@ def arrayToQPath(x, y, connect='all', finiteCheck=True): path.addPolygon(polygon) return path elif eq(connect, 'pairs'): - arr[:]['c'][::2] = 0 - arr[:]['c'][1::2] = 1 # connect every 2nd point to every 1st one + if qt6: + nans = np.broadcast_to(np.nan, (n // 2, 1)) + if n % 2 == 0: + xs = np.column_stack([arr['x'].reshape((-1, 2)), nans]).ravel() + ys = np.column_stack([arr['y'].reshape((-1, 2)), nans]).ravel() + else: + xs = np.column_stack([arr['x'][:-1].reshape((-1, 2)), nans]).ravel() + ys = np.column_stack([arr['y'][:-1].reshape((-1, 2)), nans]).ravel() + polygon = arrayToQPolygonF(xs, ys) + path.addPolygon(polygon) + return path + else: + arr[:]['c'][::2] = 0 + arr[:]['c'][1::2] = 1 # connect every 2nd point to every 1st one elif eq(connect, 'finite'): # Let's call a point with either x or y being nan is an invalid point. # A point will anyway not connect to an invalid point regardless of the diff --git a/pyqtgraph/tests/test_functions.py b/pyqtgraph/tests/test_functions.py index 6412870e..a515041c 100644 --- a/pyqtgraph/tests/test_functions.py +++ b/pyqtgraph/tests/test_functions.py @@ -3,6 +3,7 @@ from collections import OrderedDict from copy import deepcopy from contextlib import suppress from pyqtgraph.functions import arrayToQPath, eq + import numpy as np import pytest from numpy.testing import assert_array_almost_equal @@ -248,11 +249,11 @@ def test_siParse(s, suffix, expected): pg.siParse(s, suffix=suffix) -QT_LIB = pg.Qt.QT_LIB +qt6 = pg.Qt.QtVersion.startswith("6") MoveToElement = pg.QtGui.QPainterPath.ElementType.MoveToElement LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement @pytest.mark.parametrize( - "x, y, connect, expected", [ + "xs, ys, connect, expected", [ ( np.arange(6), np.arange(0, -6, step=-1), 'all', ( (MoveToElement, 0.0, 0.0), @@ -267,9 +268,9 @@ LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement np.arange(6), np.arange(0, -6, step=-1), 'pairs', ( (MoveToElement, 0.0, 0.0), (LineToElement, 1.0, -1.0), - (MoveToElement, 2.0, -2.0), + (LineToElement, np.nan, np.nan) if qt6 else (MoveToElement, 2.0, -2.0), (LineToElement, 3.0, -3.0), - (MoveToElement, 4.0, -4.0), + (LineToElement, np.nan, np.nan) if qt6 else (MoveToElement, 4.0, -4.0), (LineToElement, 5.0, -5.0), ) ), @@ -277,9 +278,9 @@ LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement np.arange(5), np.arange(0, -5, step=-1), 'pairs', ( (MoveToElement, 0.0, 0.0), (LineToElement, 1.0, -1.0), - (MoveToElement, 2.0, -2.0), + (LineToElement, np.nan, np.nan) if qt6 else (MoveToElement, 2.0, -2.0), (LineToElement, 3.0, -3.0), - (MoveToElement, 4.0, -4.0) + (LineToElement, np.nan, np.nan) if qt6 else (MoveToElement, 4.0, -4.0) ) ), ( @@ -320,5 +321,5 @@ def test_arrayToQPath(xs, ys, connect, expected): if (eq(element.x, np.nan) or eq(element.y, np.nan)): continue element = path.elementAt(i) - assert expected[i] == (element.type, element.x, element.y) + assert eq(expected[i], (element.type, element.x, element.y))