diff options
author | Hugo Parente Lima <hugo.pl@gmail.com> | 2010-11-11 17:45:16 -0200 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2010-11-11 18:13:50 -0200 |
commit | 655219636b1500e82d543914045f4cc7ba7db95f (patch) | |
tree | 631b9309a21711d69f912fc8ec7a82b706e67e99 /PySide | |
parent | 7013bd760e1ad46b31c019e0a11df504d6e2563e (diff) |
Fix bug#436 - "Using a custom QValidator generates a segfault"
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>
Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'PySide')
-rw-r--r-- | PySide/QtGui/typesystem_gui_common.xml | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index 7dd9aaeb4..59b8aa14b 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -1588,16 +1588,7 @@ <!--### Obsolete in 4.3--> </object-type> <object-type name="QInputContextFactory"/> - <object-type name="QIntValidator"> - <modify-function signature="validate(QString &, int &)const"> - <modify-argument index="return"> - <replace-type modified-type="PyObject"/> - </modify-argument> - <inject-code class="target" position="end"> - <insert-template name="return_tuple_QValidator_QString_int"/> - </inject-code> - </modify-function> - </object-type> + <object-type name="QIntValidator" /> <object-type name="QItemDelegate"> <modify-function signature="doLayout(QStyleOptionViewItem,QRect*,QRect*,QRect*,bool)const" remove="all" /> <modify-function signature="drawCheck(QPainter*,QStyleOptionViewItem,QRect,Qt::CheckState)const"> @@ -1938,16 +1929,7 @@ <enum-type name="Direction"/> </object-type> <object-type name="QPushButton" /> - <object-type name="QRegExpValidator"> - <modify-function signature="validate(QString &, int &)const"> - <modify-argument index="return"> - <replace-type modified-type="PyObject"/> - </modify-argument> - <inject-code class="target" position="end"> - <insert-template name="return_tuple_QValidator_QString_int"/> - </inject-code> - </modify-function> - </object-type> + <object-type name="QRegExpValidator" /> <object-type name="QScrollArea"> <modify-function signature="setWidget(QWidget*)"> <modify-argument index="1"> @@ -2287,6 +2269,41 @@ <modify-function signature="validate(QString &, int &)const"> <modify-argument index="return"> <replace-type modified-type="PyObject"/> + <conversion-rule class="native"> + QValidator::State %out; + + if (PySequence_Check(%PYARG_0)) { + Shiboken::AutoDecRef seq(PySequence_Fast(%PYARG_0, 0)); + int size = PySequence_Fast_GET_SIZE(seq.object()); + + if (size > 1) { + if (Shiboken::Converter<QString>::isConvertible(PySequence_Fast_GET_ITEM(seq.object(), 1))) + %1 = %CONVERTTOCPP[QString](PySequence_Fast_GET_ITEM(seq.object(), 1)); + else + qWarning("%TYPE::%FUNCTION_NAME: Second tuple element is not convertible to unicode."); + } + + if (size > 2) { + if (Shiboken::Converter<int>::isConvertible(PySequence_Fast_GET_ITEM(seq.object(), 2))) + %2 = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(seq.object(), 2)); + else + qWarning("%TYPE::%FUNCTION_NAME: Second tuple element is not convertible to int."); + } + %PYARG_0 = PySequence_Fast_GET_ITEM(seq.object(), 0); + Py_INCREF(%PYARG_0); // we need to incref, because "%PYARG_0 = ..." will decref the tuple and the tuple will be decrefed again at the end of this scope. + } + + // check retrun value + if (Shiboken::Converter<QValidator::State>::isConvertible(%PYARG_0)) { + %out = %CONVERTTOCPP[QValidator::State](%PYARG_0); + } else { + PyErr_Format(PyExc_TypeError, "Invalid return value in function %s, expected %s, got %s.", + "QValidator.validate", + "PySide.QtGui.QValidator.State, (PySide.QtGui.QValidator.State,), (PySide.QtGui.QValidator.State, unicode) or (PySide.QtGui.QValidator.State, unicode, int)", + pyResult->ob_type->tp_name); + return QValidator::State(); + } + </conversion-rule> </modify-argument> <inject-code class="target" position="end"> <insert-template name="return_tuple_QValidator_QString_int"/> |