From 828c94347125180468838c77b554e0526cd34aa5 Mon Sep 17 00:00:00 2001 From: Christian Tismer Date: Mon, 25 Sep 2017 11:43:48 +0200 Subject: Signature: tiny refinement in Reloader This is totally irrelevant and a tiny optimization that is really not needed. Do what you want. Task-number: PYSIDE-510 Change-Id: I5d6d2f5f94130d4b03b4d70525b35139e82b9f5e Reviewed-by: Friedemann Kleint --- sources/pyside2/PySide2/support/signature/mapping.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sources/pyside2/PySide2/support/signature/mapping.py b/sources/pyside2/PySide2/support/signature/mapping.py index 869e9e71e..668ca8df4 100644 --- a/sources/pyside2/PySide2/support/signature/mapping.py +++ b/sources/pyside2/PySide2/support/signature/mapping.py @@ -109,13 +109,13 @@ class Reloader(object): if self.sys_module_count == len(sys.modules): return self.sys_module_count = len(sys.modules) + g = globals() for mod_name in self.uninitialized[:]: if "PySide2." + mod_name in sys.modules: self.uninitialized.remove(mod_name) proc_name = "init_" + mod_name - if proc_name in globals(): - init_proc = globals()[proc_name] - globals().update(init_proc()) + if proc_name in g: + g.update(g[proc_name]()) update_mapping = Reloader().update type_map = {} -- cgit v1.2.3 From c7f9793ff660ed608474d0cab3b31054dbebb458 Mon Sep 17 00:00:00 2001 From: Christian Tismer Date: Thu, 28 Sep 2017 13:10:28 +0200 Subject: Fix the signature of the Q*Application constructor Q*Application had PySequence as Parameter, although only QStringList is accepted. That resulted in an implausible error message when a list of, say, Integers was given. This patch - replaces PySequence by QStringList (one more tuple layer), - fixes QCoreApplication to give the same kind of error messages, - renames the shiboken function sequenceToArgcArgv to listToArgcArgv and changes it to only allow list descendents. We also changed signature.typing in one line to display List[str] correctly. I think this belongs more to PySide-331, a fixed qApp. Task-number: PYSIDE-510 Task-number: PYSIDE-331 Change-Id: Ib256c6a2db05a3db826454e1bf1b4729d59a240b Reviewed-by: Friedemann Kleint --- .../PySide2/QtCore/glue/qcoreapplication_init.cpp | 19 +++++++------------ .../pyside2/PySide2/QtCore/typesystem_core_common.xml | 2 +- .../PySide2/QtGui/glue/qguiapplication_init.cpp | 6 +++--- .../pyside2/PySide2/QtGui/typesystem_gui_common.xml | 4 ++-- .../PySide2/QtWidgets/glue/qapplication_init.cpp | 6 +++--- .../PySide2/QtWidgets/typesystem_widgets_common.xml | 4 ++-- sources/pyside2/PySide2/support/signature/inspect.py | 5 +++-- sources/shiboken2/libshiboken/helper.cpp | 9 +++++---- sources/shiboken2/libshiboken/helper.h | 2 +- .../tests/samplebinding/typesystem_sample.xml | 6 +++--- 10 files changed, 30 insertions(+), 33 deletions(-) diff --git a/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp b/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp index 20e9c4464..fec8cf416 100644 --- a/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp +++ b/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp @@ -41,23 +41,18 @@ static int QCoreApplicationArgCount; static char** QCoreApplicationArgValues; -void QCoreApplication_constructor(PyObject* self, PyObject* args, QCoreApplicationWrapper** cptr) +void QCoreApplication_constructor(PyObject* self, PyObject* argv, QCoreApplicationWrapper** cptr) { if (QCoreApplication::instance()) { PyErr_SetString(PyExc_RuntimeError, "A QCoreApplication instance already exists."); return; } - int numArgs = PyTuple_GET_SIZE(args); - if (numArgs != 1 - || !Shiboken::sequenceToArgcArgv(PyTuple_GET_ITEM(args, 0), &QCoreApplicationArgCount, &QCoreApplicationArgValues, "PySideApp")) { - PyErr_BadArgument(); - return; + PyObject *stringlist = PyTuple_GET_ITEM(argv, 0); + if (Shiboken::listToArgcArgv(stringlist, &QCoreApplicationArgCount, &QCoreApplicationArgValues, "PySideApp")) { + *cptr = new QCoreApplicationWrapper(QCoreApplicationArgCount, QCoreApplicationArgValues); + Shiboken::Object::releaseOwnership(reinterpret_cast(self)); + PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); + Py_INCREF(self); } - - *cptr = new QCoreApplicationWrapper(QCoreApplicationArgCount, QCoreApplicationArgValues); - - Shiboken::Object::releaseOwnership(reinterpret_cast(self)); - PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); - Py_INCREF(self); } diff --git a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml index f3bf41923..03991af38 100644 --- a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml +++ b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml @@ -3213,7 +3213,7 @@ in a more convenient form by the :meth:`~QCoreApplication.arguments()` method. - + QCoreApplication_constructor(%PYSELF, args, &%0); diff --git a/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp b/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp index 60507f37a..014e409b5 100644 --- a/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp +++ b/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp @@ -50,7 +50,7 @@ bool QGuiApplicationConstructorStart(PyObject* argv) return false; } - return Shiboken::sequenceToArgcArgv(argv, &QGuiApplicationArgCount, &QGuiApplicationArgValues, "PySideApp"); + return Shiboken::listToArgcArgv(argv, &QGuiApplicationArgCount, &QGuiApplicationArgValues, "PySideApp"); } void QGuiApplicationConstructorEnd(PyObject* self) @@ -61,8 +61,8 @@ void QGuiApplicationConstructorEnd(PyObject* self) static void QGuiApplicationConstructor(PyObject* self, PyObject* argv, QGuiApplicationWrapper** cptr) { - if (QGuiApplicationConstructorStart(argv)) { - // XXX do we need to support the ApplicationFlags parameter, instead of 0? + PyObject *stringlist = PyTuple_GET_ITEM(argv, 0); + if (QGuiApplicationConstructorStart(stringlist)) { *cptr = new QGuiApplicationWrapper(QGuiApplicationArgCount, QGuiApplicationArgValues, 0); Shiboken::Object::releaseOwnership(reinterpret_cast(self)); QGuiApplicationConstructorEnd(self); diff --git a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml index 7a0db8a41..0dad0b455 100644 --- a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml +++ b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml @@ -3233,9 +3233,9 @@ - + - QGuiApplicationConstructor(%PYSELF, %1, &%0); + QGuiApplicationConstructor(%PYSELF, args, &%0); diff --git a/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp b/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp index 0de34d9c5..f1f1f84a6 100644 --- a/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp +++ b/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp @@ -51,7 +51,7 @@ bool QApplicationConstructorStart(PyObject* argv) return false; } - return Shiboken::sequenceToArgcArgv(argv, &QApplicationArgCount, &QApplicationArgValues, "PySideApp"); + return Shiboken::listToArgcArgv(argv, &QApplicationArgCount, &QApplicationArgValues, "PySideApp"); } void QApplicationConstructorEnd(PyObject* self) @@ -71,8 +71,8 @@ void QApplicationConstructorEnd(PyObject* self) static void QApplicationConstructor(PyObject* self, PyObject* argv, QApplicationWrapper** cptr) { - if (QApplicationConstructorStart(argv)) { - // XXX do we need to support the ApplicationFlags parameter, instead of 0? + PyObject *stringlist = PyTuple_GET_ITEM(argv, 0); + if (QApplicationConstructorStart(stringlist)) { *cptr = new QApplicationWrapper(QApplicationArgCount, QApplicationArgValues, 0); Shiboken::Object::releaseOwnership(reinterpret_cast(self)); QApplicationConstructorEnd(self); diff --git a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml index 59412699c..5de077181 100644 --- a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml +++ b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml @@ -3144,9 +3144,9 @@ - + - QApplicationConstructor(%PYSELF, %1, &%0); + QApplicationConstructor(%PYSELF, args, &%0); diff --git a/sources/pyside2/PySide2/support/signature/inspect.py b/sources/pyside2/PySide2/support/signature/inspect.py index b59368229..cae96bc16 100644 --- a/sources/pyside2/PySide2/support/signature/inspect.py +++ b/sources/pyside2/PySide2/support/signature/inspect.py @@ -1238,9 +1238,10 @@ def getargvalues(frame): args, varargs, varkw = getargs(frame.f_code) return ArgInfo(args, varargs, varkw, frame.f_locals) +# This function is changed because we use a local copy of typing def formatannotation(annotation, base_module=None): - if getattr(annotation, '__module__', None) == 'typing': - return repr(annotation).replace('typing.', '') + if getattr(annotation, '__module__', None) == 'PySide2.support.signature.typing': + return repr(annotation).replace('PySide2.support.signature.typing.', '') if isinstance(annotation, type): if annotation.__module__ in ('builtins', base_module): return annotation.__qualname__ diff --git a/sources/shiboken2/libshiboken/helper.cpp b/sources/shiboken2/libshiboken/helper.cpp index 2249bf458..5792db5be 100644 --- a/sources/shiboken2/libshiboken/helper.cpp +++ b/sources/shiboken2/libshiboken/helper.cpp @@ -43,9 +43,10 @@ namespace Shiboken { -bool sequenceToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* defaultAppName) +// PySide-510: Changed from PySequence to PyList, which is correct. +bool listToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* defaultAppName) { - if (!PySequence_Check(argList)) + if (!PyList_Check(argList)) return false; if (!defaultAppName) @@ -55,7 +56,7 @@ bool sequenceToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* Shiboken::AutoDecRef args(PySequence_Fast(argList, 0)); int numArgs = int(PySequence_Fast_GET_SIZE(argList)); for (int i = 0; i < numArgs; ++i) { - PyObject* item = PySequence_Fast_GET_ITEM(args.object(), i); + PyObject* item = PyList_GET_ITEM(args.object(), i); if (!PyBytes_Check(item) && !PyUnicode_Check(item)) return false; } @@ -74,7 +75,7 @@ bool sequenceToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* (*argv)[0] = strdup(appName ? Shiboken::String::toCString(appName) : defaultAppName); } else { for (int i = 0; i < numArgs; ++i) { - PyObject* item = PySequence_Fast_GET_ITEM(args.object(), i); + PyObject* item = PyList_GET_ITEM(args.object(), i); char* string = 0; if (Shiboken::String::check(item)) { string = strdup(Shiboken::String::toCString(item)); diff --git a/sources/shiboken2/libshiboken/helper.h b/sources/shiboken2/libshiboken/helper.h index f2061b667..33d97c62c 100644 --- a/sources/shiboken2/libshiboken/helper.h +++ b/sources/shiboken2/libshiboken/helper.h @@ -101,7 +101,7 @@ inline PyObject* makeTuple(const A& a, const B& b, const C& c, const D& d, const * \note The argv array is allocated using new operator and each item is allocated using malloc. * \returns True on sucess, false otherwise. */ -LIBSHIBOKEN_API bool sequenceToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* defaultAppName = 0); +LIBSHIBOKEN_API bool listToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* defaultAppName = 0); /** * Convert a python sequence into a heap-allocated array of ints. diff --git a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml index 089f835fc..65f989e7e 100644 --- a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml +++ b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml @@ -1687,7 +1687,7 @@ int argc; char** argv; - if (!Shiboken::sequenceToArgcArgv(%PYARG_1, &argc, &argv)) { + if (!Shiboken::listToArgcArgv(%PYARG_1, &argc, &argv)) { PyErr_SetString(PyExc_TypeError, "error"); return 0; } @@ -1710,7 +1710,7 @@ int argc; char** argv; - if (!Shiboken::sequenceToArgcArgv(%PYARG_1, &argc, &argv)) { + if (!Shiboken::listToArgcArgv(%PYARG_1, &argc, &argv)) { PyErr_SetString(PyExc_TypeError, "error"); return 0; } @@ -2402,7 +2402,7 @@ - + -- cgit v1.2.3 From 8ff047b26dd7e928bd35c519fb9e18db4d1b9a94 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 26 Oct 2017 16:56:37 +0200 Subject: Stabilize QtQml/bug_847.py Add more checks for QML loading. Wait until the window is exposed until starting the safety timer and increase its interval. Task-number: PYSIDE-431 Change-Id: I6225f2357d9576be15c6134d26982939698a9984 Reviewed-by: Alexandru Croitor --- sources/pyside2/tests/QtQml/bug_847.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sources/pyside2/tests/QtQml/bug_847.py b/sources/pyside2/tests/QtQml/bug_847.py index e46888d17..e69bd201a 100755 --- a/sources/pyside2/tests/QtQml/bug_847.py +++ b/sources/pyside2/tests/QtQml/bug_847.py @@ -66,11 +66,18 @@ class TestQML(UsesQApplication): # Connect first, then set the property. view.called.connect(self.done) view.setSource(QUrl.fromLocalFile(adjust_filename('bug_847.qml', __file__))) + while view.status() == QQuickView.Loading: + self.app.processEvents() + self.assertEqual(view.status(), QQuickView.Ready) + self.assertTrue(view.rootObject()) view.rootObject().setProperty('pythonObject', view) view.show() + while not view.isExposed(): + self.app.processEvents() + # Essentially a timeout in case method invocation fails. - QTimer.singleShot(2000, QCoreApplication.instance().quit) + QTimer.singleShot(30000, QCoreApplication.instance().quit) self.app.exec_() self.assertTrue(self._sucess) -- cgit v1.2.3 From e30e0c161b2b4d50484314bf006e9e5e8ff6b380 Mon Sep 17 00:00:00 2001 From: Christian Tismer Date: Sat, 30 Sep 2017 12:43:22 +0200 Subject: Support the qApp macro correctly, final version incl. debug For short the new features: - there is a qApp in QtCore, QtGui and QtWidgets for compatibility, and also in __builtins__ for a true macro-like experience. - if you delete any qApp variable, the Q*Application is reset and you can start over. Long description: There is a qApp macro in Qt5 which is equivalent to Q*Application.instance() . Python does not have macros. Both PyQt5 and PySide2 have an according structure in QtWidgets. In the case of PySide2, the qApp variable is first initialized to None and later to QApplication(). This does not reflect the original sense of the qApp macro, because - it only handles QApplication, - it does not handle destruction. This "macro" should live in QtCore, but both PyQt5 and PySide2 decided to put this in QtWidgets. As a compromize, I propose to put qApp into all three modules, and into __builtins__ as well, so wherever you create an application, you find this "macro" in place. While changing the code, I stumbled over the template set_qapp_parent_for_orphan. I tried to make sense out of it and finally removed it. There were no side effects but bug PYSIDE-85 is gone, now. With some extra effort, I created a singleton qApp that changes itself. This way, a true macro was simulated. Note that this was not possible with a garbage collected variable, and I had to make shiboken aware of this. As the final optimization, I turned qApp also into a fuse variable: Delete any qApp variable and Q*Application will finish when there is no extra reference. Task-number: PYSIDE-85 Task-number: PYSIDE-571 Change-Id: I7a56b19858f63349c98b95778759a6a6de856938 Reviewed-by: Christian Tismer --- .../PySide2/QtCore/glue/qcoreapplication_init.cpp | 22 +-- .../PySide2/QtCore/typesystem_core_common.xml | 19 ++- .../PySide2/QtGui/glue/qguiapplication_init.cpp | 36 +--- .../PySide2/QtGui/typesystem_gui_common.xml | 3 - .../PySide2/QtWidgets/glue/qapplication_init.cpp | 46 +----- .../PySide2/QtWidgets/glue/qtwidgets_qapp.cpp | 49 ------ .../QtWidgets/typesystem_widgets_common.xml | 47 ------ sources/pyside2/PySide2/typesystem_templates.xml | 8 +- sources/pyside2/libpyside/pyside.cpp | 3 + sources/pyside2/tests/pysidetest/CMakeLists.txt | 1 + .../tests/pysidetest/qapp_like_a_macro_test.py | 76 +++++++++ .../shiboken2/generator/shiboken2/cppgenerator.cpp | 31 +++- sources/shiboken2/libshiboken/CMakeLists.txt | 2 + sources/shiboken2/libshiboken/basewrapper.cpp | 46 +++++- sources/shiboken2/libshiboken/basewrapper.h | 3 + sources/shiboken2/libshiboken/qapp_macro.cpp | 184 +++++++++++++++++++++ sources/shiboken2/libshiboken/qapp_macro.h | 53 ++++++ 17 files changed, 421 insertions(+), 208 deletions(-) delete mode 100644 sources/pyside2/PySide2/QtWidgets/glue/qtwidgets_qapp.cpp create mode 100644 sources/pyside2/tests/pysidetest/qapp_like_a_macro_test.py create mode 100644 sources/shiboken2/libshiboken/qapp_macro.cpp create mode 100644 sources/shiboken2/libshiboken/qapp_macro.h diff --git a/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp b/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp index fec8cf416..b2dfae38f 100644 --- a/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp +++ b/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of PySide2. @@ -37,22 +37,14 @@ ** ****************************************************************************/ -// Global variables used to store argc and argv values -static int QCoreApplicationArgCount; -static char** QCoreApplicationArgValues; - -void QCoreApplication_constructor(PyObject* self, PyObject* argv, QCoreApplicationWrapper** cptr) +static void QCoreApplicationConstructor(PyObject *self, PyObject *pyargv, QCoreApplicationWrapper **cptr) { - if (QCoreApplication::instance()) { - PyErr_SetString(PyExc_RuntimeError, "A QCoreApplication instance already exists."); - return; - } - - PyObject *stringlist = PyTuple_GET_ITEM(argv, 0); - if (Shiboken::listToArgcArgv(stringlist, &QCoreApplicationArgCount, &QCoreApplicationArgValues, "PySideApp")) { - *cptr = new QCoreApplicationWrapper(QCoreApplicationArgCount, QCoreApplicationArgValues); + static int argc; + static char **argv; + PyObject *stringlist = PyTuple_GET_ITEM(pyargv, 0); + if (Shiboken::listToArgcArgv(stringlist, &argc, &argv, "PySideApp")) { + *cptr = new QCoreApplicationWrapper(argc, argv); Shiboken::Object::releaseOwnership(reinterpret_cast(self)); PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); - Py_INCREF(self); } } diff --git a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml index 03991af38..41a20a617 100644 --- a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml +++ b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml @@ -3215,7 +3215,7 @@ - QCoreApplication_constructor(%PYSELF, args, &%0); + QCoreApplicationConstructor(%PYSELF, args, &%0); @@ -3226,23 +3226,24 @@ - QCoreApplication* app = QCoreApplication::instance(); - PyObject* pyApp = Py_None; + QCoreApplication *app = QCoreApplication::instance(); + PyObject *pyApp = Py_None; if (app) { - pyApp = reinterpret_cast<PyObject*>(Shiboken::BindingManager::instance().retrieveWrapper(app)); + pyApp = reinterpret_cast<PyObject*>( + Shiboken::BindingManager::instance().retrieveWrapper(app)); if (!pyApp) - pyApp = %CONVERTTOPYTHON[QCoreApplication*](app); // this will keep app live after python exit (extra ref) + pyApp = %CONVERTTOPYTHON[QCoreApplication*](app); + // this will keep app live after python exit (extra ref) } + // PYSIDE-571: make sure that we return the singleton "None" + if (pyApp == Py_None) + Py_DECREF(MakeSingletonQAppWrapper(0)); // here qApp and instance() diverge %PYARG_0 = pyApp; Py_XINCREF(%PYARG_0); - diff --git a/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp b/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp index 014e409b5..38a4c1ccb 100644 --- a/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp +++ b/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of PySide2. @@ -37,34 +37,14 @@ ** ****************************************************************************/ -// Borrowed reference to QtGui module -extern PyObject* moduleQtGui; - -static int QGuiApplicationArgCount; -static char** QGuiApplicationArgValues; - -bool QGuiApplicationConstructorStart(PyObject* argv) -{ - if (QGuiApplication::instance()) { - PyErr_SetString(PyExc_RuntimeError, "A QGuiApplication instance already exists."); - return false; - } - - return Shiboken::listToArgcArgv(argv, &QGuiApplicationArgCount, &QGuiApplicationArgValues, "PySideApp"); -} - -void QGuiApplicationConstructorEnd(PyObject* self) -{ - PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); - Py_INCREF(self); -} - -static void QGuiApplicationConstructor(PyObject* self, PyObject* argv, QGuiApplicationWrapper** cptr) +static void QGuiApplicationConstructor(PyObject *self, PyObject *pyargv, QGuiApplicationWrapper **cptr) { - PyObject *stringlist = PyTuple_GET_ITEM(argv, 0); - if (QGuiApplicationConstructorStart(stringlist)) { - *cptr = new QGuiApplicationWrapper(QGuiApplicationArgCount, QGuiApplicationArgValues, 0); + static int argc; + static char **argv; + PyObject *stringlist = PyTuple_GET_ITEM(pyargv, 0); + if (Shiboken::listToArgcArgv(stringlist, &argc, &argv, "PySideApp")) { + *cptr = new QGuiApplicationWrapper(argc, argv, 0); Shiboken::Object::releaseOwnership(reinterpret_cast(self)); - QGuiApplicationConstructorEnd(self); + PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); } } diff --git a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml index 0dad0b455..55bc438be 100644 --- a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml +++ b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml @@ -3220,10 +3220,7 @@ " - - - diff --git a/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp b/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp index f1f1f84a6..1419f5755 100644 --- a/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp +++ b/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of PySide2. @@ -37,44 +37,14 @@ ** ****************************************************************************/ -// Borrowed reference to QtWidgets module -extern PyObject* moduleQtWidgets; - -static int QApplicationArgCount; -static char** QApplicationArgValues; -static const char QAPP_MACRO[] = "qApp"; - -bool QApplicationConstructorStart(PyObject* argv) -{ - if (QApplication::instance()) { - PyErr_SetString(PyExc_RuntimeError, "A QApplication instance already exists."); - return false; - } - - return Shiboken::listToArgcArgv(argv, &QApplicationArgCount, &QApplicationArgValues, "PySideApp"); -} - -void QApplicationConstructorEnd(PyObject* self) -{ - // Verify if qApp is in main module - PyObject* globalsDict = PyEval_GetGlobals(); - if (globalsDict) { - PyObject* qAppObj = PyDict_GetItemString(globalsDict, QAPP_MACRO); - if (qAppObj) - PyDict_SetItemString(globalsDict, QAPP_MACRO, self); - } - - PyObject_SetAttrString(moduleQtWidgets, QAPP_MACRO, self); - PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); - Py_INCREF(self); -} - -static void QApplicationConstructor(PyObject* self, PyObject* argv, QApplicationWrapper** cptr) +static void QApplicationConstructor(PyObject *self, PyObject *pyargv, QApplicationWrapper **cptr) { - PyObject *stringlist = PyTuple_GET_ITEM(argv, 0); - if (QApplicationConstructorStart(stringlist)) { - *cptr = new QApplicationWrapper(QApplicationArgCount, QApplicationArgValues, 0); + static int argc; + static char **argv; + PyObject *stringlist = PyTuple_GET_ITEM(pyargv, 0); + if (Shiboken::listToArgcArgv(stringlist, &argc, &argv, "PySideApp")) { + *cptr = new QApplicationWrapper(argc, argv, 0); Shiboken::Object::releaseOwnership(reinterpret_cast(self)); - QApplicationConstructorEnd(self); + PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); } } diff --git a/sources/pyside2/PySide2/QtWidgets/glue/qtwidgets_qapp.cpp b/sources/pyside2/PySide2/QtWidgets/glue/qtwidgets_qapp.cpp deleted file mode 100644 index e041c7680..000000000 --- a/sources/pyside2/PySide2/QtWidgets/glue/qtwidgets_qapp.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of PySide2. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// Init qApp macro to None. -if (qApp) { - PyObject* pyApp = %CONVERTTOPYTHON[QApplication*](qApp); - Py_INCREF(pyApp); - PyModule_AddObject(module, "qApp", pyApp); -} else { - Py_INCREF(Py_None); - PyModule_AddObject(module, "qApp", Py_None); -} -moduleQtWidgets = module; diff --git a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml index 5de077181..9d3e70be2 100644 --- a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml +++ b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml @@ -3127,11 +3127,6 @@ - - - PyObject* moduleQtWidgets; - - @@ -3151,48 +3146,6 @@ - - - - - Shiboken::Object::setParent(%CONVERTTOPYTHON[QApplication*](qApp), %PYARG_1); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sources/pyside2/PySide2/typesystem_templates.xml b/sources/pyside2/PySide2/typesystem_templates.xml index d9258ba88..7ac4ac158 100644 --- a/sources/pyside2/PySide2/typesystem_templates.xml +++ b/sources/pyside2/PySide2/typesystem_templates.xml @@ -297,13 +297,7 @@ PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval_)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[%ARG5_TYPE](%5)); - +