diff options
3 files changed, 105 insertions, 46 deletions
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 @@ <parent index="this" action="add"/> </modify-argument> </modify-function> - <modify-function signature="addRow(QList<QBarDataItem>*)"> - <modify-argument index="1"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> - <modify-function signature="addRow(QList<QBarDataItem>*, const QString&)"> - <modify-argument index="1"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> + + <!-- PYSIDE-1438: Replace all add/set/insertRow() taking a 'QList*' by overloads + taking 'const QList &' since an allocated list needs to be passed. --> + <modify-function signature="addRow(QList<QBarDataItem>*)" remove="all"/> + <add-function signature="addRow(const QList<QBarDataItem>&)" return-type="int"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-addrow"/> + </add-function> + <modify-function signature="addRow(QList<QBarDataItem>*,const QString&)" remove="all"/> + <add-function signature="addRow(const QList<QBarDataItem>&,const QString&)" + return-type="int"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-addrow-string"/> + </add-function> + + <modify-function signature="insertRow(int,QList<QBarDataItem>*)" remove="all"/> + <add-function signature="insertRow(int,const QList<QBarDataItem>&)"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-insertrow"/> + </add-function> + <modify-function signature="insertRow(int,QList<QBarDataItem>*,const QString&)" remove="all"/> + <add-function signature="insertRow(int,const QList<QBarDataItem>&, const QString&)"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-insertrow-string"/> + </add-function> + + <modify-function signature="setRow(int,QList<QBarDataItem>*)" remove="all"/> + <add-function signature="setRow(int,const QList<QBarDataItem>&)"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-setrow"/> + </add-function> + <modify-function signature="setRow(int,QList<QBarDataItem>*,const QString&)" remove="all"/> + <add-function signature="setRow(int,const QList<QBarDataItem>&,const QString&)"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-setrow-string"/> + </add-function> + <modify-function signature="addRows(const QBarDataArray&)"> <modify-argument index="1"> <parent index="this" action="add"/> @@ -138,16 +165,6 @@ <parent index="this" action="add"/> </modify-argument> </modify-function> - <modify-function signature="insertRow(int, QList<QBarDataItem>*)"> - <modify-argument index="2"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> - <modify-function signature="insertRow(int, QList<QBarDataItem>*, const QString&)"> - <modify-argument index="2"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> <modify-function signature="insertRows(int, const QBarDataArray&)"> <modify-argument index="2"> <parent index="this" action="add"/> @@ -158,16 +175,6 @@ <parent index="this" action="add"/> </modify-argument> </modify-function> - <modify-function signature="setRow(int, QList<QBarDataItem>*)"> - <modify-argument index="2"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> - <modify-function signature="setRow(int, QList<QBarDataItem>*, const QString&)"> - <modify-argument index="2"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> <modify-function signature="setRows(int, const QBarDataArray&)"> <modify-argument index="2"> <parent index="this" action="add"/> @@ -250,21 +257,27 @@ </object-type> <value-type name="QSurfaceDataItem"/> <object-type name="QSurfaceDataProxy"> - <modify-function signature="addRow(QList<QSurfaceDataItem>*)"> - <modify-argument index="1"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> - <modify-function signature="insertRow(int, QList<QSurfaceDataItem>*)"> - <modify-argument index="2"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> - <modify-function signature="setRow(int, QList<QSurfaceDataItem>*)"> - <modify-argument index="2"> - <parent index="this" action="add"/> - </modify-argument> - </modify-function> + + <!-- PYSIDE-1438: Replace all add/set/insertRow() taking a 'QList*' by overloads + taking 'const QList &' since an allocated list needs to be passed. --> + <modify-function signature="addRow(QList<QSurfaceDataItem>*)" remove="all"/> + <add-function signature="addRow(const QList<QSurfaceDataItem>&)" return-type="int"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-addrow"/> + </add-function> + + <modify-function signature="insertRow(int,QList<QSurfaceDataItem>*)" remove="all"/> + <add-function signature="insertRow(int,const QList<QSurfaceDataItem>&)"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-insertrow"/> + </add-function> + + <modify-function signature="setRow(int,QList<QSurfaceDataItem>*)" remove="all"/> + <add-function signature="setRow(int,const QList<QSurfaceDataItem>&)"> + <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp" + snippet="dataproxy-setrow"/> + </add-function> + <modify-function signature="resetArray(QSurfaceDataArray*)"> <modify-argument index="1"> <parent index="this" action="add"/> 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() |