aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside2/tests/pysidetest
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2017-09-30 12:43:22 +0200
committerChristian Tismer <tismer@stackless.com>2017-10-27 03:44:44 +0000
commite30e0c161b2b4d50484314bf006e9e5e8ff6b380 (patch)
treee0aa129fdda7a0a580bc200b8b9a1e758230979d /sources/pyside2/tests/pysidetest
parent8ff047b26dd7e928bd35c519fb9e18db4d1b9a94 (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/tests/pysidetest')
-rw-r--r--sources/pyside2/tests/pysidetest/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/pysidetest/qapp_like_a_macro_test.py76
2 files changed, 77 insertions, 0 deletions
diff --git a/sources/pyside2/tests/pysidetest/CMakeLists.txt b/sources/pyside2/tests/pysidetest/CMakeLists.txt
index d46498f77..821b6f819 100644
--- a/sources/pyside2/tests/pysidetest/CMakeLists.txt
+++ b/sources/pyside2/tests/pysidetest/CMakeLists.txt
@@ -124,3 +124,4 @@ PYSIDE_TEST(mixin_signal_slots_test.py)
PYSIDE_TEST(signal_slot_warning.py)
PYSIDE_TEST(all_modules_load_test.py)
PYSIDE_TEST(signature_test.py)
+PYSIDE_TEST(qapp_like_a_macro_test.py)
diff --git a/sources/pyside2/tests/pysidetest/qapp_like_a_macro_test.py b/sources/pyside2/tests/pysidetest/qapp_like_a_macro_test.py
new file mode 100644
index 000000000..6205748ec
--- /dev/null
+++ b/sources/pyside2/tests/pysidetest/qapp_like_a_macro_test.py
@@ -0,0 +1,76 @@
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## 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 General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## 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-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import unittest
+import PySide2
+
+# This test tests the new "macro" feature of qApp.
+# It also uses the qApp variable to finish the instance and start over.
+
+class qAppMacroTest(unittest.TestCase):
+ def test_qApp_is_like_a_macro_and_can_restart(self):
+ from PySide2 import QtCore
+ try:
+ from PySide2 import QtGui, QtWidgets
+ except ImportError:
+ QtWidgets = QtGui = QtCore
+ # qApp is in the builtins
+ qApp
+ # and also in certain PySide modules
+ QtCore.qApp, QtGui.qApp, QtWidgets.qApp
+ # and they are all the same
+ self.assertTrue(qApp is QtCore.qApp is QtGui.qApp is QtWidgets.qApp)
+ # and the type is NoneType, but it is not None (cannot work)
+ self.assertTrue(type(qApp) is type(None))
+ self.assertTrue(qApp is not None)
+ # now we create an application for all cases
+ classes = (QtCore.QCoreApplication,
+ QtGui.QGuiApplication,
+ QtWidgets.QApplication)
+ for klass in classes:
+ print("created", klass([]))
+ del __builtins__.qApp
+ print("deleted qApp")
+ # creating without deletion raises:
+ QtCore.QCoreApplication([])
+ with self.assertRaises(RuntimeError):
+ QtCore.QCoreApplication([])
+ # assigning qApp is obeyed
+ QtCore.qApp = 42
+ del __builtins__.qApp
+ self.assertEqual(QtCore.qApp, 42)
+ self.assertNotEqual(__builtins__, 42)
+ # delete it and it re-appears
+ del QtCore.qApp
+ QtCore.QCoreApplication([])
+ self.assertEqual(QtCore.QCoreApplication.instance(), QtCore.qApp)
+ # and they are again all the same
+ self.assertTrue(qApp is QtCore.qApp is QtGui.qApp is QtWidgets.qApp)
+
+if __name__ == '__main__':
+ unittest.main()