aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristián Maureira-Fredes <cristian.maureira-fredes@qt.io>2020-02-27 14:48:02 +0100
committerCristián Maureira-Fredes <cristian.maureira-fredes@qt.io>2020-03-04 18:12:06 +0100
commit4f1739e062623d3ab8aebe9540e945464734a75b (patch)
treef73de78d2fdaae7b02aef583a74a677ebf569a6a
parent435bc2744cd108efc1511bf17117bd4f0de15b43 (diff)
Accept EnumMeta as a valid Signal type
Including a check for Python EnumMeta types to not consider them as a normal PySequence allows the decision to use the default PyObject wrapper case. Using the 'object' type is currently the workaround, so this allow the users to use the Enum class instead of declaring the signal with 'object'. class A(Enum): a = 1 b = 1 # Workaround # signal = Signal(object) # With this patch signal = Signal(A) A test case was added. Fixes: PYSIDE-239 Change-Id: Ib593dba5a988eceb8b1bfae097768e9ec02be6d5 Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r--sources/pyside2/libpyside/pysidesignal.cpp3
-rw-r--r--sources/pyside2/tests/signals/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/signals/signal_enum_test.py82
3 files changed, 85 insertions, 1 deletions
diff --git a/sources/pyside2/libpyside/pysidesignal.cpp b/sources/pyside2/libpyside/pysidesignal.cpp
index ee435ab37..be4c367f7 100644
--- a/sources/pyside2/libpyside/pysidesignal.cpp
+++ b/sources/pyside2/libpyside/pysidesignal.cpp
@@ -54,6 +54,7 @@
#include <utility>
#define QT_SIGNAL_SENTINEL '2'
+#define PyEnumMeta_Check(x) (strcmp(Py_TYPE(arg)->tp_name, "EnumMeta") == 0)
namespace PySide {
namespace Signal {
@@ -241,7 +242,7 @@ int signalTpInit(PyObject *self, PyObject *args, PyObject *kwds)
for (Py_ssize_t i = 0, i_max = PyTuple_Size(args); i < i_max; i++) {
PyObject *arg = PyTuple_GET_ITEM(args, i);
- if (PySequence_Check(arg) && !Shiboken::String::check(arg)) {
+ if (PySequence_Check(arg) && !Shiboken::String::check(arg) && !PyEnumMeta_Check(arg)) {
tupledArgs = true;
const auto sig = PySide::Signal::parseSignature(arg);
PySide::Signal::appendSignature(
diff --git a/sources/pyside2/tests/signals/CMakeLists.txt b/sources/pyside2/tests/signals/CMakeLists.txt
index fe06a3430..740319f39 100644
--- a/sources/pyside2/tests/signals/CMakeLists.txt
+++ b/sources/pyside2/tests/signals/CMakeLists.txt
@@ -28,6 +28,7 @@ PYSIDE_TEST(short_circuit_test.py)
PYSIDE_TEST(signal2signal_connect_test.py)
PYSIDE_TEST(signal_autoconnect_test.py)
PYSIDE_TEST(signal_connectiontype_support_test.py)
+PYSIDE_TEST(signal_enum_test.py)
PYSIDE_TEST(signal_emission_gui_test.py)
PYSIDE_TEST(signal_emission_test.py)
PYSIDE_TEST(signal_func_test.py)
diff --git a/sources/pyside2/tests/signals/signal_enum_test.py b/sources/pyside2/tests/signals/signal_enum_test.py
new file mode 100644
index 000000000..3a24b919d
--- /dev/null
+++ b/sources/pyside2/tests/signals/signal_enum_test.py
@@ -0,0 +1,82 @@
+#############################################################################
+##
+## Copyright (C) 2020 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of Qt for Python.
+##
+## $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 os
+import sys
+import unittest
+
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+from init_paths import init_test_paths
+init_test_paths(False)
+
+from PySide2.QtCore import QObject, Signal, Slot
+import py3kcompat as py3k
+
+
+if py3k.IS_PY3K:
+ from enum import Enum
+
+ class Colors(Enum):
+ red = 1
+ green = 2
+ blue = 3
+
+ class Obj(QObject):
+ enum_signal = Signal(Colors)
+ object_signal = Signal(object)
+
+ def __init__(self, parent=None):
+ QObject.__init__(self, parent)
+ self.enum_signal.connect(self.get_result)
+ self.object_signal.connect(self.get_result)
+ self.value = -1
+
+ @Slot()
+ def get_result(self, i):
+ self.value = i
+
+
+ class SignalEnumTests(unittest.TestCase):
+ '''Test Signal with enum.Enum'''
+
+ def testSignal(self):
+ o = Obj()
+ # Default value
+ self.assertEqual(o.value, -1)
+
+ # Enum Signal
+ o.enum_signal.emit(Colors.green)
+ self.assertEqual(o.value, Colors.green)
+
+ # object Signal
+ o.object_signal.emit(Colors.red)
+ self.assertEqual(o.value, Colors.red)
+
+if __name__ == '__main__':
+ unittest.main()