diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-10-25 10:30:50 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-10-26 09:19:40 +0000 |
commit | f4a6d74852b0ba6711195a9c3fc9356e677a3409 (patch) | |
tree | e35347e8819a7d1aed00846d4ec24611930a164c /sources | |
parent | 33bb2851ffbdc2f22cca1293ac2a5c185bf799e2 (diff) |
PySide2: Re-enable native event filters
Add QAbstractNativeEventFilter. Re-add the native event filter
functions on QWindow and QWidget, modified to return a tuple
bool/long, using a modification from PySide.
Task-number: PYSIDE-790
Change-Id: I86fef1a0c168e69fb3391cd882ea05190985384d
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'sources')
6 files changed, 98 insertions, 10 deletions
diff --git a/sources/pyside2/PySide2/QtCore/CMakeLists.txt b/sources/pyside2/PySide2/QtCore/CMakeLists.txt index 466e97756..e583bd0f4 100644 --- a/sources/pyside2/PySide2/QtCore/CMakeLists.txt +++ b/sources/pyside2/PySide2/QtCore/CMakeLists.txt @@ -16,6 +16,7 @@ ${QtCore_GEN_DIR}/qabstracteventdispatcher_timerinfo_wrapper.cpp ${QtCore_GEN_DIR}/qabstracteventdispatcher_wrapper.cpp ${QtCore_GEN_DIR}/qabstractitemmodel_wrapper.cpp ${QtCore_GEN_DIR}/qabstractlistmodel_wrapper.cpp +${QtCore_GEN_DIR}/qabstractnativeeventfilter_wrapper.cpp ${QtCore_GEN_DIR}/qabstractproxymodel_wrapper.cpp ${QtCore_GEN_DIR}/qabstractstate_wrapper.cpp ${QtCore_GEN_DIR}/qabstracttablemodel_wrapper.cpp diff --git a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml index 838d95896..d2951fe9c 100644 --- a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml +++ b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml @@ -938,9 +938,6 @@ <rejection class="" enum-name="QtValidLicenseForGuiModule"/> <rejection class="" enum-name="QtValidLicenseForScriptModule"/> <rejection class="" enum-name="QtValidLicenseForHelpModule"/> - <rejection class="QAbstractEventDispatcher" function-name="filterEvent"/> - <rejection class="QAbstractEventDispatcher" function-name="filterNativeEvent"/> - <rejection class="QAbstractEventDispatcher" function-name="setEventFilter"/> <!-- Internal --> <rejection class="QAbstractFileEngine"/> <!-- <rejection class="QAbstractFileEngine" function-name="endEntryList"/> @@ -2978,6 +2975,26 @@ <object-type name="QXmlStreamEntityResolver"/> <!-- Qt5: had to move QAbstractEventDispatcher into os-specific files because of Windows --> + <object-type name="QAbstractNativeEventFilter"> + <!-- see QWidget::nativeEvent(), QWindow::nativeEvent() --> + <modify-function signature="nativeEventFilter(const QByteArray&,void*,long*)"> + <modify-argument index="3"> + <remove-argument/> + <conversion-rule class="native"> + <insert-template name="return_native_eventfilter_conversion_variables"/> + </conversion-rule> + </modify-argument> + <modify-argument index="return"> + <replace-type modified-type="PyObject"/> + <conversion-rule class="native"> + <insert-template name="return_native_eventfilter_conversion"/> + </conversion-rule> + </modify-argument> + <inject-code position="end"> + <insert-template name="return_native_eventfilter"/> + </inject-code> + </modify-function> + </object-type> <object-type name="QEventLoop"> <enum-type name="ProcessEventsFlag" flags="ProcessEventsFlags"/> diff --git a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml index 32d586631..e2e3b2335 100644 --- a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml +++ b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml @@ -2987,11 +2987,26 @@ <enum-type name="AncestorMode"/> <enum-type name="Visibility"/> <modify-function signature="raise()" rename="raise_" /> + <!-- see QWidget::nativeEvent(), QAbstractNativeEventFilter::nativeEventFilter() --> + <modify-function signature="nativeEvent(const QByteArray &,void*,long*)"> + <modify-argument index="3"> + <remove-argument/> + <conversion-rule class="native"> + <insert-template name="return_native_eventfilter_conversion_variables"/> + </conversion-rule> + </modify-argument> + <modify-argument index="return"> + <replace-type modified-type="PyObject"/> + <conversion-rule class="native"> + <insert-template name="return_native_eventfilter_conversion"/> + </conversion-rule> + </modify-argument> + <inject-code position="end"> + <insert-template name="return_native_eventfilter"/> + </inject-code> + </modify-function> </object-type> - <!-- Qt5: not sure if this needs support, skipped for now --> - <rejection class="QWindow" function-name="nativeEvent"/>" - <object-type name="QGuiApplication"> <extra-includes> <include file-name="QBasicTimer" location="global"/> diff --git a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml index 1f2cd446b..d92540d85 100644 --- a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml +++ b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml @@ -2197,8 +2197,24 @@ </object-type> <object-type name="QWidget" delete-in-main-thread="true"> - <!-- Qt5: remove native event for now --> - <modify-function signature="nativeEvent(const QByteArray &,void*,long*)" remove="all" /> + <!-- see QWindow::nativeEvent(), QAbstractNativeEventFilter::nativeEventFilter() --> + <modify-function signature="nativeEvent(const QByteArray &,void*,long*)"> + <modify-argument index="3"> + <remove-argument/> + <conversion-rule class="native"> + <insert-template name="return_native_eventfilter_conversion_variables"/> + </conversion-rule> + </modify-argument> + <modify-argument index="return"> + <replace-type modified-type="PyObject"/> + <conversion-rule class="native"> + <insert-template name="return_native_eventfilter_conversion"/> + </conversion-rule> + </modify-argument> + <inject-code position="end"> + <insert-template name="return_native_eventfilter"/> + </inject-code> + </modify-function> <extra-includes> <include file-name="QIcon" location="global"/> diff --git a/sources/pyside2/PySide2/typesystem_templates.xml b/sources/pyside2/PySide2/typesystem_templates.xml index 1a140906b..a7a7bfc9d 100644 --- a/sources/pyside2/PySide2/typesystem_templates.xml +++ b/sources/pyside2/PySide2/typesystem_templates.xml @@ -361,6 +361,26 @@ Py_INCREF(%PYARG_0); </template> + <!-- Helpers for modifying "bool nativeEventFilter(QByteArray, void*, long *result)" + to return a tuple of bool,long --> + <template name="return_native_eventfilter_conversion_variables"> + long resultVar{0}; + long *%out = &resultVar; + </template> + <template name="return_native_eventfilter_conversion"> + %RETURN_TYPE %out = false; + if (PySequence_Check(%PYARG_0) && (PySequence_Size(%PYARG_0) == 2)) { + Shiboken::AutoDecRef pyItem(PySequence_GetItem(%PYARG_0, 0)); + %out = %CONVERTTOCPP[bool](pyItem); + } + </template> + + <template name="return_native_eventfilter"> + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[long](*result_out)); + </template> + <!-- templates for __reduce__ --> <template name="reduce_code"> %PYARG_0 = Py_BuildValue("(N(%REDUCE_FORMAT))", PyObject_Type(%PYSELF), %REDUCE_ARGS); diff --git a/sources/pyside2/tests/QtWidgets/qwidget_test.py b/sources/pyside2/tests/QtWidgets/qwidget_test.py index 1e8387d11..028751ba7 100644 --- a/sources/pyside2/tests/QtWidgets/qwidget_test.py +++ b/sources/pyside2/tests/QtWidgets/qwidget_test.py @@ -26,6 +26,7 @@ ## ############################################################################# +import sys import unittest from PySide2.QtWidgets import QWidget, QMainWindow @@ -35,6 +36,17 @@ class QWidgetInherit(QMainWindow): def __init__(self): QWidget.__init__(self) +class NativeEventTestWidget(QWidget): + + nativeEventCount = 0 + + def __init__(self): + QWidget.__init__(self) + + def nativeEvent(self, eventType, message): + self.nativeEventCount = self.nativeEventCount + 1 + return [False, 0] + class QWidgetTest(UsesQApplication): def testInheritance(self): @@ -44,12 +56,19 @@ class QWidgetVisible(UsesQApplication): def testBasic(self): # Also related to bug #244, on existence of setVisible''' - widget = QWidget() + widget = NativeEventTestWidget() self.assertTrue(not widget.isVisible()) widget.setVisible(True) self.assertTrue(widget.isVisible()) self.assertTrue(widget.winId() is not 0) - + # skip this test on macOS since no native events are received + if sys.platform == 'darwin': + return + for i in range(10): + if widget.nativeEventCount > 0: + break + self.app.processEvents() + self.assertTrue(widget.nativeEventCount > 0) if __name__ == '__main__': unittest.main() |