From 3a18da91353a71e801658329c55b170c18bcd824 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 3 Mar 2021 09:56:40 +0100 Subject: Qt Datavisualization: Fix crashes in QBar/SurfaceDataProxy add/set/insertRow() These function take an allocated array. Replace them by functions that take the list by const-ref and pass the allocated copy. Pick-to: 5.15 Fixes: PYSIDE-1438 Change-Id: Id58cdbc4b939713b71724f5d4a67f0448c74f33f Reviewed-by: Cristian Maureira-Fredes --- .../typesystem_datavisualization.xml | 103 ++++++++++++--------- .../pyside6/PySide6/glue/qtdatavisualization.cpp | 32 +++++++ .../QtDataVisualization/datavisualization_test.py | 16 +++- 3 files changed, 105 insertions(+), 46 deletions(-) (limited to 'sources') diff --git a/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml b/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml index e36d7e8de..1fdbc71f4 100644 --- a/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml +++ b/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml @@ -118,16 +118,43 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,16 +165,6 @@ - - - - - - - - - - @@ -158,16 +175,6 @@ - - - - - - - - - - @@ -250,21 +257,27 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/sources/pyside6/PySide6/glue/qtdatavisualization.cpp b/sources/pyside6/PySide6/glue/qtdatavisualization.cpp index 119d79a40..0a9e5db76 100644 --- a/sources/pyside6/PySide6/glue/qtdatavisualization.cpp +++ b/sources/pyside6/PySide6/glue/qtdatavisualization.cpp @@ -40,3 +40,35 @@ // @snippet releaseownership Shiboken::Object::releaseOwnership(%PYARG_1); // @snippet releaseownership + +// @snippet dataproxy-addrow +using ListType = decltype(%1); +%RETURN_TYPE %0 = %CPPSELF.addRow(new ListType(%1)); +%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); +// @snippet dataproxy-addrow + +// @snippet dataproxy-addrow-string +using ListType = decltype(%1); +%RETURN_TYPE %0 = %CPPSELF.addRow(new ListType(%1), %2); +%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); +// @snippet dataproxy-addrow-string + +// @snippet dataproxy-insertrow +using ListType = decltype(%2); +%CPPSELF.insertRow(%1, new ListType(%2)); +// @snippet dataproxy-insertrow + +// @snippet dataproxy-insertrow-string +using ListType = decltype(%2); +%CPPSELF.insertRow(%1, new ListType(%2), %3); +// @snippet dataproxy-insertrow-string + +// @snippet dataproxy-setrow +using ListType = decltype(%2); +%CPPSELF.setRow(%1, new ListType(%2)); +// @snippet dataproxy-setrow + +// @snippet dataproxy-setrow-string +using ListType = decltype(%2); +%CPPSELF.setRow(%1, new ListType(%2), %3); +// @snippet dataproxy-setrow-string diff --git a/sources/pyside6/tests/QtDataVisualization/datavisualization_test.py b/sources/pyside6/tests/QtDataVisualization/datavisualization_test.py index 3497ae676..ded306ebc 100644 --- a/sources/pyside6/tests/QtDataVisualization/datavisualization_test.py +++ b/sources/pyside6/tests/QtDataVisualization/datavisualization_test.py @@ -42,7 +42,8 @@ init_test_paths(False) from helper.usesqguiapplication import UsesQGuiApplication from PySide6.QtCore import QTimer from PySide6.QtDataVisualization import (Q3DBars, QBar3DSeries, QBarDataItem, - QCategory3DAxis, QValue3DAxis) + QBarDataProxy, QCategory3DAxis, + QValue3DAxis) def dataToBarDataRow(data): @@ -91,5 +92,18 @@ class QtDataVisualizationTestCase(UsesQGuiApplication): QTimer.singleShot(500, self.app.quit) self.app.exec_() + def testBarDataProxy(self): + '''PSYSIDE-1438, crashes in QBarDataProxy.addRow()''' + items = [QBarDataItem(v) for v in [1.0, 2.0]] + data_proxy = QBarDataProxy() + data_proxy.addRow(items) + data_proxy.addRow(items, 'bla') + data_proxy.insertRow(0, items) + data_proxy.insertRow(0, items, 'bla') + data_proxy.setRow(0, items) + data_proxy.setRow(0, items, 'bla') + self.assertTrue(data_proxy.rowCount(), 4) + + if __name__ == '__main__': unittest.main() -- cgit v1.2.3