diff options
author | Christian Tismer <tismer@stackless.com> | 2017-09-30 12:43:22 +0200 |
---|---|---|
committer | Christian Tismer <tismer@stackless.com> | 2017-10-27 03:44:44 +0000 |
commit | e30e0c161b2b4d50484314bf006e9e5e8ff6b380 (patch) | |
tree | e0aa129fdda7a0a580bc200b8b9a1e758230979d /sources/pyside2/PySide2/QtGui | |
parent | 8ff047b26dd7e928bd35c519fb9e18db4d1b9a94 (diff) |
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 <tismer@stackless.com>
Diffstat (limited to 'sources/pyside2/PySide2/QtGui')
-rw-r--r-- | sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp | 36 | ||||
-rw-r--r-- | sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml | 3 |
2 files changed, 8 insertions, 31 deletions
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<SbkObject*>(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 @@ <!-- Qt5: not sure if this needs support, skipped for now --> <rejection class="QWindow" function-name="nativeEvent"/>" - <!-- Qt5: here the new QGuiApplication and related things --> <object-type name="QGuiApplication"> - <!-- Qt5: gone <enum-type name="ColorSpec"/> --> - <!-- Qt5: gone <enum-type name="Type"/> --> <extra-includes> <include file-name="QBasicTimer" location="global"/> <include file-name="QFont" location="global"/> |