diff --git a/scripts/mkqtdecl4/mkqtdecl.conf b/scripts/mkqtdecl4/mkqtdecl.conf index 87f6c703c..9e87acc69 100644 --- a/scripts/mkqtdecl4/mkqtdecl.conf +++ b/scripts/mkqtdecl4/mkqtdecl.conf @@ -1418,6 +1418,8 @@ drop_class "QSqlDriverPlugin" # not required ? drop_method "QFormBuilder", /QFormBuilder::customWidgets\(\s*\)/ # Requires QDesignerCustomWidgetInterface which is not (yet) available +return_new "QAbstractFormBuilder", /::load/ # returns a free object + no_copy_ctor "QAbstractFormBuilder" no_copy_ctor "QFormBuilder" diff --git a/scripts/mkqtdecl5/mkqtdecl.conf b/scripts/mkqtdecl5/mkqtdecl.conf index a704ebc95..13d3ab9fe 100644 --- a/scripts/mkqtdecl5/mkqtdecl.conf +++ b/scripts/mkqtdecl5/mkqtdecl.conf @@ -1602,6 +1602,8 @@ drop_class "QSqlDriverPlugin" # not required ? drop_method "QFormBuilder", /QFormBuilder::customWidgets\(\s*\)/ # Requires QDesignerCustomWidgetInterface which is not (yet) available +return_new "QAbstractFormBuilder", /::load/ # returns a free object + no_copy_ctor "QAbstractFormBuilder" no_copy_ctor "QFormBuilder" diff --git a/src/gsiqt4/gsiDeclQAbstractFormBuilder.cc b/src/gsiqt4/gsiDeclQAbstractFormBuilder.cc index 07910abf9..9f1ece346 100644 --- a/src/gsiqt4/gsiDeclQAbstractFormBuilder.cc +++ b/src/gsiqt4/gsiDeclQAbstractFormBuilder.cc @@ -97,7 +97,7 @@ static void _init_f_load_2654 (qt_gsi::GenericMethod *decl) decl->add_arg (argspec_0); static gsi::ArgSpecBase argspec_1 ("parentWidget", true, "0"); decl->add_arg (argspec_1); - decl->set_return (); + decl->set_return_new (); } static void _call_f_load_2654 (const qt_gsi::GenericMethod * /*decl*/, void *cls, gsi::SerialArgs &args, gsi::SerialArgs &ret) diff --git a/src/gsiqt5/gsiDeclQAbstractFormBuilder.cc b/src/gsiqt5/gsiDeclQAbstractFormBuilder.cc index eefd1909e..7b0031b8c 100644 --- a/src/gsiqt5/gsiDeclQAbstractFormBuilder.cc +++ b/src/gsiqt5/gsiDeclQAbstractFormBuilder.cc @@ -97,7 +97,7 @@ static void _init_f_load_2654 (qt_gsi::GenericMethod *decl) decl->add_arg (argspec_0); static gsi::ArgSpecBase argspec_1 ("parentWidget", true, "0"); decl->add_arg (argspec_1); - decl->set_return (); + decl->set_return_new (); } static void _call_f_load_2654 (const qt_gsi::GenericMethod * /*decl*/, void *cls, gsi::SerialArgs &args, gsi::SerialArgs &ret) diff --git a/src/pya/pya/pyaObject.cc b/src/pya/pya/pyaObject.cc index c9204565a..9e3af172e 100644 --- a/src/pya/pya/pyaObject.cc +++ b/src/pya/pya/pyaObject.cc @@ -221,19 +221,28 @@ void SignalHandler::call (const gsi::MethodBase *meth, gsi::SerialArgs &args, gs PyTuple_SetItem (argv.get (), int (a - meth->begin_arguments ()), pop_arg (*a, args, NULL, heap).release ()); } - PythonRef result; + // NOTE: in case one event handler deletes the object, it's safer to first collect the handlers and + // then call them. + std::vector callables; + callables.reserve (m_cbfuncs.size ()); for (std::vector::const_iterator c = m_cbfuncs.begin (); c != m_cbfuncs.end (); ++c) { + callables.push_back (c->callable ()); + } + + PythonRef result; + + for (std::vector::const_iterator c = callables.begin (); c != callables.end (); ++c) { // determine the number of arguments required int arg_count = args_avail; if (args_avail > 0) { - PythonRef fc (PyObject_GetAttrString (c->callable ().get (), "__code__")); + PythonRef fc (PyObject_GetAttrString (c->get (), "__code__")); if (fc) { PythonRef ac (PyObject_GetAttrString (fc.get (), "co_argcount")); if (ac) { arg_count = python2c (ac.get ()); - if (PyObject_HasAttrString (c->callable ().get (), "__self__")) { + if (PyObject_HasAttrString (c->get (), "__self__")) { arg_count -= 1; } } @@ -243,12 +252,12 @@ void SignalHandler::call (const gsi::MethodBase *meth, gsi::SerialArgs &args, gs // use less arguments if applicable if (arg_count == 0) { - result = PythonRef (PyObject_CallObject (c->callable ().get (), NULL)); + result = PythonRef (PyObject_CallObject (c->get (), NULL)); } else if (arg_count < args_avail) { PythonRef argv_less (PyTuple_GetSlice (argv.get (), 0, arg_count)); - result = PythonRef (PyObject_CallObject (c->callable ().get (), argv_less.get ())); + result = PythonRef (PyObject_CallObject (c->get (), argv_less.get ())); } else { - result = PythonRef (PyObject_CallObject (c->callable ().get (), argv.get ())); + result = PythonRef (PyObject_CallObject (c->get (), argv.get ())); } if (! result) {