aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build_scripts/config.py3
-rw-r--r--build_scripts/wheel_override.py2
-rw-r--r--coin/dependencies.yaml1
-rw-r--r--coin_build_instructions.py2
-rw-r--r--coin_test_instructions.py2
-rw-r--r--dist/changes-6.1.349
-rw-r--r--dist/changes-6.2.0222
-rw-r--r--examples/bluetooth/btscanner/btscanner.pyproject3
-rw-r--r--examples/bluetooth/btscanner/device.py166
-rw-r--r--examples/bluetooth/btscanner/device.ui111
-rw-r--r--examples/bluetooth/btscanner/doc/btscanner.rst4
-rw-r--r--examples/bluetooth/btscanner/main.py55
-rw-r--r--examples/bluetooth/btscanner/service.py85
-rw-r--r--examples/bluetooth/btscanner/service.ui71
-rw-r--r--examples/bluetooth/btscanner/ui_device.py89
-rw-r--r--examples/bluetooth/btscanner/ui_service.py56
-rw-r--r--examples/charts/areachart/areachart.py104
-rw-r--r--examples/charts/areachart/areachart.pyproject3
-rw-r--r--examples/charts/areachart/doc/areachart.pngbin0 -> 15491 bytes
-rw-r--r--examples/charts/areachart/doc/areachart.rst8
-rw-r--r--examples/charts/barchart/barchart.py106
-rw-r--r--examples/charts/barchart/barchart.pyproject3
-rw-r--r--examples/charts/barchart/doc/barchart.pngbin0 -> 15717 bytes
-rw-r--r--examples/charts/barchart/doc/barchart.rst8
-rw-r--r--examples/datavisualization/surface/doc/surface.rst23
-rw-r--r--examples/datavisualization/surface/doc/surface_mountain.pngbin0 -> 152571 bytes
-rw-r--r--examples/datavisualization/surface/main.py218
-rw-r--r--examples/datavisualization/surface/mountain.pngbin0 -> 34540 bytes
-rw-r--r--examples/datavisualization/surface/surface.pyproject4
-rw-r--r--examples/datavisualization/surface/surfacegraph.py275
-rw-r--r--examples/declarative/editingmodel/MovingRectangle.qml115
-rw-r--r--examples/declarative/editingmodel/doc/editingmodel.rst14
-rw-r--r--examples/declarative/editingmodel/doc/qabstractlistmodelqml.pngbin0 -> 45810 bytes
-rw-r--r--examples/declarative/editingmodel/main.py59
-rw-r--r--examples/declarative/editingmodel/main.pyproject3
-rw-r--r--examples/declarative/editingmodel/main.qml143
-rw-r--r--examples/declarative/editingmodel/model.py187
-rw-r--r--examples/declarative/openglunderqml/doc/openglunderqml.rst21
-rw-r--r--examples/declarative/openglunderqml/doc/squircle.pngbin0 -> 37963 bytes
-rw-r--r--examples/declarative/openglunderqml/main.py66
-rw-r--r--examples/declarative/openglunderqml/main.qml86
-rw-r--r--examples/declarative/openglunderqml/openglunderqml.pyproject3
-rw-r--r--examples/declarative/openglunderqml/squircle.py107
-rw-r--r--examples/declarative/openglunderqml/squirclerenderer.py141
-rw-r--r--examples/declarative/referenceexamples/adding/adding.pyproject5
-rw-r--r--examples/declarative/referenceexamples/adding/doc/adding.rst65
-rw-r--r--examples/declarative/referenceexamples/adding/example.qml56
-rw-r--r--examples/declarative/referenceexamples/adding/main.py67
-rw-r--r--examples/declarative/referenceexamples/adding/person.py72
-rw-r--r--examples/declarative/rendercontrol/rendercontrol_opengl/cuberenderer.py223
-rw-r--r--examples/declarative/rendercontrol/rendercontrol_opengl/demo.qml208
-rw-r--r--examples/declarative/rendercontrol/rendercontrol_opengl/doc/rendercontrol_opengl.rst5
-rw-r--r--examples/declarative/rendercontrol/rendercontrol_opengl/main.py57
-rw-r--r--examples/declarative/rendercontrol/rendercontrol_opengl/rendercontrol_opengl.pyproject6
-rw-r--r--examples/declarative/rendercontrol/rendercontrol_opengl/window_singlethreaded.py308
-rw-r--r--examples/declarative/stringlistmodel/doc/stringlistmodel.pngbin79 -> 1978 bytes
-rw-r--r--examples/declarative/textproperties/doc/textproperties.rst2
-rw-r--r--examples/installer_test/hello.py3
-rw-r--r--examples/quick/painteditem/main.qml2
-rw-r--r--examples/quick/painteditem/painteditem.py8
-rw-r--r--examples/quickcontrols2/gallery/gallery.py4
-rw-r--r--examples/scriptableapplication/pythonutils.cpp2
-rw-r--r--examples/webenginewidgets/markdowneditor/document.py61
-rw-r--r--examples/webenginewidgets/markdowneditor/main.py57
-rw-r--r--examples/webenginewidgets/markdowneditor/mainwindow.py173
-rw-r--r--examples/webenginewidgets/markdowneditor/mainwindow.ui107
-rw-r--r--examples/webenginewidgets/markdowneditor/markdowneditor.pyproject9
-rw-r--r--examples/webenginewidgets/markdowneditor/previewpage.py55
-rw-r--r--examples/webenginewidgets/markdowneditor/rc_markdowneditor.py852
-rw-r--r--examples/webenginewidgets/markdowneditor/resources/3rdparty/MARKDOWN-LICENSE.txt16
-rw-r--r--examples/webenginewidgets/markdowneditor/resources/3rdparty/MARKED-LICENSE.txt19
-rw-r--r--examples/webenginewidgets/markdowneditor/resources/3rdparty/markdown.css260
-rw-r--r--examples/webenginewidgets/markdowneditor/resources/3rdparty/marked.js1514
-rw-r--r--examples/webenginewidgets/markdowneditor/resources/3rdparty/qt_attribution.json35
-rw-r--r--examples/webenginewidgets/markdowneditor/resources/default.md12
-rw-r--r--examples/webenginewidgets/markdowneditor/resources/index.html32
-rw-r--r--examples/webenginewidgets/markdowneditor/resources/markdowneditor.qrc8
-rw-r--r--examples/webenginewidgets/markdowneditor/ui_mainwindow.py115
-rw-r--r--examples/webenginewidgets/simplebrowser/simplebrowser.py2
-rw-r--r--examples/widgets/dialogs/tabdialog/doc/tabdialog.pngbin0 -> 13222 bytes
-rw-r--r--examples/widgets/dialogs/tabdialog/doc/tabdialog.rst13
-rw-r--r--examples/widgets/dialogs/tabdialog/tabdialog.py215
-rw-r--r--examples/widgets/dialogs/tabdialog/tabdialog.pyproject3
-rw-r--r--examples/widgets/layouts/borderlayout/borderlayout.py285
-rw-r--r--examples/widgets/layouts/borderlayout/borderlayout.pyproject3
-rw-r--r--examples/widgets/layouts/borderlayout/doc/borderlayout.pngbin0 -> 5450 bytes
-rw-r--r--examples/widgets/layouts/borderlayout/doc/borderlayout.rst10
-rw-r--r--examples/widgets/layouts/flowlayout/flowlayout.py33
-rw-r--r--examples/widgets/painting/plot/plot.py105
-rw-r--r--examples/widgets/painting/plot/plot.pyproject3
-rw-r--r--examples/widgets/state-machine/ping_pong/ping_pong.py (renamed from examples/widgets/state-machine/pingpong/pingpong.py)0
-rw-r--r--examples/widgets/state-machine/ping_pong/ping_pong.pyproject3
-rw-r--r--examples/widgets/state-machine/pingpong/pingpong.pyproject3
-rw-r--r--examples/widgets/thread_signals/thread_signals.py (renamed from examples/widgets/threads/thread_signals.py)0
-rw-r--r--examples/widgets/thread_signals/thread_signals.pyproject (renamed from examples/widgets/threads/thread_signals.pyproject)0
-rw-r--r--sources/pyside6/PySide6/Qt3DCore/typesystem_3dcore.xml1
-rw-r--r--sources/pyside6/PySide6/QtCore/CMakeLists.txt1
-rw-r--r--sources/pyside6/PySide6/QtCore/typesystem_core_common.xml187
-rw-r--r--sources/pyside6/PySide6/QtDBus/typesystem_dbus.xml1
-rw-r--r--sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml7
-rw-r--r--sources/pyside6/PySide6/QtDesigner/typesystem_designer.xml1
-rw-r--r--sources/pyside6/PySide6/QtGui/CMakeLists.txt1
-rw-r--r--sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml213
-rw-r--r--sources/pyside6/PySide6/QtMultimedia/typesystem_multimedia.xml4
-rw-r--r--sources/pyside6/PySide6/QtNetwork/typesystem_network.xml4
-rw-r--r--sources/pyside6/PySide6/QtNetworkAuth/typesystem_networkauth.xml2
-rw-r--r--sources/pyside6/PySide6/QtOpenGL/CMakeLists.txt3
-rw-r--r--sources/pyside6/PySide6/QtOpenGL/typesystem_opengl.xml37
-rw-r--r--sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_0_compat.xml2
-rw-r--r--sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_1_compat.xml3
-rw-r--r--sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_1.xml2
-rw-r--r--sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_4.xml4
-rw-r--r--sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_5.xml2
-rw-r--r--sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp122
-rw-r--r--sources/pyside6/PySide6/QtQml/pysideqmlregistertype.h18
-rw-r--r--sources/pyside6/PySide6/QtQml/typesystem_qml.xml16
-rw-r--r--sources/pyside6/PySide6/QtQuick/pysidequickregistertype.h2
-rw-r--r--sources/pyside6/PySide6/QtRemoteObjects/typesystem_remoteobjects.xml5
-rw-r--r--sources/pyside6/PySide6/QtSensors/CMakeLists.txt6
-rw-r--r--sources/pyside6/PySide6/QtSensors/typesystem_sensors.xml4
-rw-r--r--sources/pyside6/PySide6/QtSerialPort/typesystem_serialport.xml1
-rw-r--r--sources/pyside6/PySide6/QtWebEngineCore/CMakeLists.txt7
-rw-r--r--sources/pyside6/PySide6/QtWebEngineCore/typesystem_webenginecore.xml3
-rw-r--r--sources/pyside6/PySide6/QtWebEngineQuick/CMakeLists.txt1
-rw-r--r--sources/pyside6/PySide6/QtWebEngineQuick/typesystem_webenginequick.xml2
-rw-r--r--sources/pyside6/PySide6/QtWebEngineWidgets/CMakeLists.txt9
-rw-r--r--sources/pyside6/PySide6/QtWebSockets/typesystem_websockets.xml11
-rw-r--r--sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml14
-rw-r--r--sources/pyside6/PySide6/glue/qtcore.cpp78
-rw-r--r--sources/pyside6/PySide6/glue/qtdatavisualization.cpp5
-rw-r--r--sources/pyside6/PySide6/glue/qtgui.cpp101
-rw-r--r--sources/pyside6/PySide6/glue/qtmultimedia.cpp5
-rw-r--r--sources/pyside6/PySide6/glue/qtqml.cpp5
-rw-r--r--sources/pyside6/PySide6/glue/qtstatemachine.cpp5
-rw-r--r--sources/pyside6/PySide6/glue/qtwidgets.cpp31
-rw-r--r--sources/pyside6/PySide6/support/generate_pyi.py2
-rw-r--r--sources/pyside6/PySide6/templates/core_common.xml35
-rw-r--r--sources/pyside6/PySide6/templates/gui_common.xml2
-rw-r--r--sources/pyside6/PySide6/templates/opengl_common.xml2
-rw-r--r--sources/pyside6/doc/CMakeLists.txt1
-rw-r--r--sources/pyside6/doc/_templates/layout.html49
-rw-r--r--sources/pyside6/doc/_themes/pysidedocs/static/pyside.css29
-rw-r--r--sources/pyside6/doc/conf.py.in2
-rw-r--r--sources/pyside6/doc/contents.rst1
-rw-r--r--sources/pyside6/doc/deployment-nuitka.rst132
-rw-r--r--sources/pyside6/doc/deployment.rst10
-rw-r--r--sources/pyside6/doc/extras/QtCore.ClassInfo.rst17
-rw-r--r--sources/pyside6/doc/extras/QtQml.qmlRegisterSingletonInstance.rst25
-rw-r--r--sources/pyside6/doc/feature-why.rst9
-rw-r--r--sources/pyside6/doc/gettingstarted.rst7
-rw-r--r--sources/pyside6/doc/images/Deployment.svg26
-rw-r--r--sources/pyside6/doc/images/Desktop.svg26
-rw-r--r--sources/pyside6/doc/images/Dev.svg24
-rw-r--r--sources/pyside6/doc/images/Examples.svg24
-rw-r--r--sources/pyside6/doc/images/Support.svg24
-rw-r--r--sources/pyside6/doc/images/Training.svg24
-rw-r--r--sources/pyside6/doc/images/Tutorials.svg24
-rw-r--r--sources/pyside6/doc/images/cpp_python.svg142
-rw-r--r--sources/pyside6/doc/images/stopwatch.svg24
-rw-r--r--sources/pyside6/doc/index.rst14
-rw-r--r--sources/pyside6/doc/modules.rst160
-rw-r--r--sources/pyside6/doc/qtmodules/pyside-qtbluetooth.qdocconf.in2
-rw-r--r--sources/pyside6/doc/qtmodules/pyside-qtdbus.qdocconf.in2
-rw-r--r--sources/pyside6/doc/qtmodules/pyside-qtnetworkauth.qdocconf.in2
-rw-r--r--sources/pyside6/doc/qtmodules/pyside-qtpositioning.qdocconf.in4
-rw-r--r--sources/pyside6/doc/qtmodules/pyside-qtquickcontrols2.qdocconf.in2
-rw-r--r--sources/pyside6/doc/qtmodules/pyside-qtremoteobjects.qdocconf.in2
-rw-r--r--sources/pyside6/doc/qtmodules/pyside-qtserialport.qdocconf.in2
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/clickablebutton.pngbin0 -> 7059 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/clickablebutton.rst5
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/dialog.pngbin0 -> 21263 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/dialog.rst7
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/greenapplication.pngbin0 -> 2089 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/icons.pngbin3202 -> 1599 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/player-new.pngbin7818 -> 3369 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/player.pngbin5835 -> 2631 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/qml.rst50
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/signals_and_slots.rst229
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/signals_slots.pngbin0 -> 14787 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/tablewidget.pngbin17237 -> 14509 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/translations.pngbin0 -> 25318 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/translations.rst3
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/treewidget.pngbin10236 -> 3709 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/uifiles.pngbin0 -> 86503 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/uifiles.rst10
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/widgets.pngbin0 -> 23233 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/widgets.rst7
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/widgetstyling-no.pngbin26444 -> 11004 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/widgetstyling-simple-no.pngbin3834 -> 1206 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/widgetstyling-simple-yes.pngbin4743 -> 1596 bytes
-rw-r--r--sources/pyside6/doc/tutorials/basictutorial/widgetstyling-yes.pngbin32311 -> 24791 bytes
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize3/main.py2
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize3/main_window.py5
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize4/main.py2
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize4/main_widget.py2
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize4/main_window.py4
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize4/table_model.py4
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize5/main.py2
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize5/main_widget.py10
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize5/main_window.py4
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize5/table_model.py4
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize6/main.py2
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize6/main_widget.py16
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize6/main_window.py7
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/datavisualize6/table_model.py4
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/images/datavisualization_app.pngbin40458 -> 49419 bytes
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/index.rst4
-rw-r--r--sources/pyside6/doc/tutorials/datavisualize/plot_datapoints.rst2
-rw-r--r--sources/pyside6/doc/tutorials/expenses/expenses.rst3
-rw-r--r--sources/pyside6/doc/tutorials/expenses/main.py32
-rw-r--r--sources/pyside6/doc/tutorials/expenses/main_snake_prop.py22
-rw-r--r--sources/pyside6/doc/tutorials/expenses/steps/03-expenses.py1
-rw-r--r--sources/pyside6/doc/tutorials/expenses/steps/06-expenses.py1
-rw-r--r--sources/pyside6/doc/tutorials/expenses/steps/07-expenses.py1
-rw-r--r--sources/pyside6/doc/tutorials/expenses/steps/08-expenses.py1
-rw-r--r--sources/pyside6/doc/tutorials/expenses/steps/09-expenses.py5
-rw-r--r--sources/pyside6/doc/tutorials/expenses/steps/10-expenses.py11
-rw-r--r--sources/pyside6/doc/tutorials/index.rst195
-rw-r--r--sources/pyside6/doc/tutorials/pretutorial/distribution.rst2
-rw-r--r--sources/pyside6/doc/tutorials/pretutorial/tiobe.pngbin0 -> 49961 bytes
-rw-r--r--sources/pyside6/doc/tutorials/pretutorial/whatisshiboken.rst4
-rw-r--r--sources/pyside6/doc/tutorials/pretutorial/whyqtforpython.rst208
-rw-r--r--sources/pyside6/doc/tutorials/qmlapp/qmlapplication.rst12
-rw-r--r--sources/pyside6/doc/tutorials/qmlintegration/main.py1
-rw-r--r--sources/pyside6/doc/tutorials/qmlintegration/qmlintegration.rst48
-rw-r--r--sources/pyside6/doc/tutorials/qmlsqlintegration/chat.qml10
-rw-r--r--sources/pyside6/doc/tutorials/qmlsqlintegration/qmlsqlintegration.rst43
-rw-r--r--sources/pyside6/doc/videos.rst274
-rw-r--r--sources/pyside6/libpyside/class_property.cpp8
-rw-r--r--sources/pyside6/libpyside/dynamicqmetaobject.cpp8
-rw-r--r--sources/pyside6/libpyside/feature_select.cpp50
-rw-r--r--sources/pyside6/libpyside/pyside.cpp26
-rw-r--r--sources/pyside6/libpyside/pyside.h17
-rw-r--r--sources/pyside6/libpyside/pyside_p.h3
-rw-r--r--sources/pyside6/libpyside/pysideclassinfo.cpp25
-rw-r--r--sources/pyside6/libpyside/pysidemacros.h1
-rw-r--r--sources/pyside6/libpyside/pysidemetafunction.cpp3
-rw-r--r--sources/pyside6/libpyside/pysideproperty.cpp8
-rw-r--r--sources/pyside6/libpyside/pysideqenum.cpp6
-rw-r--r--sources/pyside6/libpyside/pysideqflags.cpp10
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp66
-rw-r--r--sources/pyside6/libpyside/pysidesignal.h2
-rw-r--r--sources/pyside6/libpyside/pysideslot.cpp3
-rw-r--r--sources/pyside6/libpyside/pysideweakref.cpp3
-rw-r--r--sources/pyside6/libpyside/signalmanager.cpp3
-rw-r--r--sources/pyside6/tests/QtCore/CMakeLists.txt1
-rw-r--r--sources/pyside6/tests/QtCore/bug_927.py24
-rw-r--r--sources/pyside6/tests/QtCore/classinfo_test.py29
-rw-r--r--sources/pyside6/tests/QtCore/feature_with_uic/window.py90
-rw-r--r--sources/pyside6/tests/QtCore/feature_with_uic/window.ui62
-rw-r--r--sources/pyside6/tests/QtCore/feature_with_uic_test.py88
-rw-r--r--sources/pyside6/tests/QtCore/qcbor_test.py4
-rw-r--r--sources/pyside6/tests/QtCore/qenum_test.py6
-rw-r--r--sources/pyside6/tests/QtCore/qinstallmsghandler_test.py1
-rw-r--r--sources/pyside6/tests/QtCore/qmodelindex_internalpointer_test.py1
-rw-r--r--sources/pyside6/tests/QtCore/qobject_destructor.py1
-rw-r--r--sources/pyside6/tests/QtCore/qobject_event_filter_test.py2
-rw-r--r--sources/pyside6/tests/QtCore/qobject_parent_test.py68
-rw-r--r--sources/pyside6/tests/QtCore/qtimer_timeout_test.py1
-rw-r--r--sources/pyside6/tests/QtCore/tr_noop_test.py5
-rw-r--r--sources/pyside6/tests/QtGui/CMakeLists.txt1
-rw-r--r--sources/pyside6/tests/QtGui/bug_367.py1
-rw-r--r--sources/pyside6/tests/QtGui/qfont_test.py60
-rw-r--r--sources/pyside6/tests/QtQml/CMakeLists.txt1
-rw-r--r--sources/pyside6/tests/QtQml/ModuleType.qml33
-rw-r--r--sources/pyside6/tests/QtQml/registerqmlfile.py55
-rw-r--r--sources/pyside6/tests/QtQml/registersingletontype.py14
-rw-r--r--sources/pyside6/tests/QtQml/registersingletontype.qml4
-rw-r--r--sources/pyside6/tests/QtStateMachine/qabstracttransition_test.py63
-rw-r--r--sources/pyside6/tests/QtSvg/qsvggenerator_test.py14
-rw-r--r--sources/pyside6/tests/QtUiTools/bug_909.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/CMakeLists.txt1
-rw-r--r--sources/pyside6/tests/QtWidgets/bug_1002.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/bug_1006.py2
-rw-r--r--sources/pyside6/tests/QtWidgets/bug_430.py14
-rw-r--r--sources/pyside6/tests/QtWidgets/bug_547.py3
-rw-r--r--sources/pyside6/tests/QtWidgets/bug_576.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/bug_585.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/bug_674.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/bug_811.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/event_filter_test.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/keep_reference_test.py17
-rw-r--r--sources/pyside6/tests/QtWidgets/qaccessible_test.py163
-rw-r--r--sources/pyside6/tests/QtWidgets/qlabel_test.py7
-rw-r--r--sources/pyside6/tests/QtWidgets/qlayout_ref_test.py49
-rw-r--r--sources/pyside6/tests/QtWidgets/qlayout_test.py2
-rw-r--r--sources/pyside6/tests/QtWidgets/qlistwidget_test.py4
-rw-r--r--sources/pyside6/tests/QtWidgets/qmainwindow_test.py2
-rw-r--r--sources/pyside6/tests/QtWidgets/qstandarditemmodel_test.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/qstyle_test.py1
-rw-r--r--sources/pyside6/tests/QtWidgets/qtextedit_test.py8
-rw-r--r--sources/pyside6/tests/QtWidgets/reference_count_test.py2
-rw-r--r--sources/pyside6/tests/QtWidgets/signature_test.py5
-rw-r--r--sources/pyside6/tests/pysidetest/CMakeLists.txt1
-rw-r--r--sources/pyside6/tests/pysidetest/embedding_test.py80
-rw-r--r--sources/pyside6/tests/pysidetest/new_inherited_functions_test.py7
-rw-r--r--sources/pyside6/tests/signals/ref03_test.py8
-rw-r--r--sources/pyside6/tests/signals/signal_manager_refcount_test.py8
-rw-r--r--sources/pyside6/tests/signals/slot_reference_count_test.py15
-rw-r--r--sources/shiboken6/ApiExtractor/CMakeLists.txt2
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetaargument.cpp26
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetaargument.h6
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp121
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.h8
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder_helpers.cpp200
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder_p.h11
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafield.cpp10
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafield.h1
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafunction.cpp131
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafunction.h8
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.cpp101
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.h7
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetatype.cpp239
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetatype.h47
-rw-r--r--sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp133
-rw-r--r--sources/shiboken6/ApiExtractor/clangparser/clangbuilder.h4
-rw-r--r--sources/shiboken6/ApiExtractor/clangparser/clangparser.cpp34
-rw-r--r--sources/shiboken6/ApiExtractor/clangparser/clangparser.h15
-rw-r--r--sources/shiboken6/ApiExtractor/clangparser/compilersupport.cpp156
-rw-r--r--sources/shiboken6/ApiExtractor/clangparser/compilersupport.h15
-rw-r--r--sources/shiboken6/ApiExtractor/conditionalstreamreader.cpp114
-rw-r--r--sources/shiboken6/ApiExtractor/conditionalstreamreader.h25
-rw-r--r--sources/shiboken6/ApiExtractor/dotview.cpp81
-rw-r--r--sources/shiboken6/ApiExtractor/dotview.h39
-rw-r--r--sources/shiboken6/ApiExtractor/doxygenparser.cpp2
-rw-r--r--sources/shiboken6/ApiExtractor/graph.h26
-rw-r--r--sources/shiboken6/ApiExtractor/messages.cpp70
-rw-r--r--sources/shiboken6/ApiExtractor/messages.h18
-rw-r--r--sources/shiboken6/ApiExtractor/modifications.cpp24
-rw-r--r--sources/shiboken6/ApiExtractor/modifications.h14
-rw-r--r--sources/shiboken6/ApiExtractor/parser/codemodel.cpp18
-rw-r--r--sources/shiboken6/ApiExtractor/parser/codemodel.h2
-rw-r--r--sources/shiboken6/ApiExtractor/tests/testdroptypeentries.cpp33
-rw-r--r--sources/shiboken6/ApiExtractor/tests/testdroptypeentries.h1
-rw-r--r--sources/shiboken6/ApiExtractor/tests/testenum.cpp155
-rw-r--r--sources/shiboken6/ApiExtractor/tests/testenum.h2
-rw-r--r--sources/shiboken6/ApiExtractor/typedatabase.cpp192
-rw-r--r--sources/shiboken6/ApiExtractor/typedatabase.h17
-rw-r--r--sources/shiboken6/ApiExtractor/typeparser.cpp5
-rw-r--r--sources/shiboken6/ApiExtractor/typesystem.cpp266
-rw-r--r--sources/shiboken6/ApiExtractor/typesystem.h84
-rw-r--r--sources/shiboken6/ApiExtractor/typesystem_enums.h9
-rw-r--r--sources/shiboken6/ApiExtractor/typesystem_typedefs.h1
-rw-r--r--sources/shiboken6/ApiExtractor/typesystemparser.cpp148
-rw-r--r--sources/shiboken6/ApiExtractor/typesystemparser.h2
-rw-r--r--sources/shiboken6/CMakeLists.txt22
-rw-r--r--sources/shiboken6/data/shiboken_helpers.cmake21
-rw-r--r--sources/shiboken6/doc/_templates/layout.html40
-rw-r--r--sources/shiboken6/doc/_themes/pysidedocs/static/pyside.css21
-rw-r--r--sources/shiboken6/doc/shibokengenerator.rst5
-rw-r--r--sources/shiboken6/doc/typesystem.rst2
-rw-r--r--sources/shiboken6/doc/typesystem_builtin_types.rst44
-rw-r--r--sources/shiboken6/doc/typesystem_containers.rst49
-rw-r--r--sources/shiboken6/doc/typesystem_converters.rst4
-rw-r--r--sources/shiboken6/doc/typesystem_manipulating_objects.rst7
-rw-r--r--sources/shiboken6/doc/typesystem_solving_compilation.rst8
-rw-r--r--sources/shiboken6/doc/typesystem_specifying_types.rst36
-rw-r--r--sources/shiboken6/doc/typesystem_variables.rst8
-rw-r--r--sources/shiboken6/generator/CMakeLists.txt1
-rw-r--r--sources/shiboken6/generator/generator.cpp18
-rw-r--r--sources/shiboken6/generator/generator.h3
-rw-r--r--sources/shiboken6/generator/main.cpp3
-rw-r--r--sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp17
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp1125
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.h91
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator_container.cpp251
-rw-r--r--sources/shiboken6/generator/shiboken/headergenerator.cpp2
-rw-r--r--sources/shiboken6/generator/shiboken/overloaddata.cpp688
-rw-r--r--sources/shiboken6/generator/shiboken/overloaddata.h176
-rw-r--r--sources/shiboken6/generator/shiboken/pytypenames.h2
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.cpp909
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.h105
-rw-r--r--sources/shiboken6/libshiboken/CMakeLists.txt8
-rw-r--r--sources/shiboken6/libshiboken/basewrapper.cpp344
-rw-r--r--sources/shiboken6/libshiboken/basewrapper.h72
-rw-r--r--sources/shiboken6/libshiboken/basewrapper_p.h21
-rw-r--r--sources/shiboken6/libshiboken/bindingmanager.cpp42
-rw-r--r--sources/shiboken6/libshiboken/bindingmanager.h5
-rw-r--r--sources/shiboken6/libshiboken/embed/signature_bootstrap.py102
-rw-r--r--sources/shiboken6/libshiboken/helper.cpp86
-rw-r--r--sources/shiboken6/libshiboken/pep384impl.cpp161
-rw-r--r--sources/shiboken6/libshiboken/pep384impl.h55
-rw-r--r--sources/shiboken6/libshiboken/pep384impl_doc.rst20
-rw-r--r--sources/shiboken6/libshiboken/sbkarrayconverter.cpp2
-rw-r--r--sources/shiboken6/libshiboken/sbkcontainer.cpp52
-rw-r--r--sources/shiboken6/libshiboken/sbkcontainer.h227
-rw-r--r--sources/shiboken6/libshiboken/sbkconverter.cpp93
-rw-r--r--sources/shiboken6/libshiboken/sbkconverter.h80
-rw-r--r--sources/shiboken6/libshiboken/sbkconverter_p.h50
-rw-r--r--sources/shiboken6/libshiboken/sbkcppstring.cpp85
-rw-r--r--sources/shiboken6/libshiboken/sbkcppstring.h56
-rw-r--r--sources/shiboken6/libshiboken/sbkenum.cpp54
-rw-r--r--sources/shiboken6/libshiboken/sbkenum.h4
-rw-r--r--sources/shiboken6/libshiboken/sbkfeature_base.cpp190
-rw-r--r--sources/shiboken6/libshiboken/sbkfeature_base.h56
-rw-r--r--sources/shiboken6/libshiboken/sbkpython.h20
-rw-r--r--sources/shiboken6/libshiboken/sbkstaticstrings.cpp1
-rw-r--r--sources/shiboken6/libshiboken/sbkstaticstrings.h1
-rw-r--r--sources/shiboken6/libshiboken/sbkstring.cpp28
-rw-r--r--sources/shiboken6/libshiboken/sbkstring.h3
-rw-r--r--sources/shiboken6/libshiboken/sbktypefactory.cpp138
-rw-r--r--sources/shiboken6/libshiboken/sbktypefactory.h64
-rw-r--r--sources/shiboken6/libshiboken/shibokenmacros.h2
-rw-r--r--sources/shiboken6/libshiboken/signature/signature.cpp13
-rw-r--r--sources/shiboken6/libshiboken/signature/signature_extend.cpp6
-rw-r--r--sources/shiboken6/libshiboken/signature/signature_globals.cpp2
-rw-r--r--sources/shiboken6/libshiboken/signature/signature_helper.cpp13
-rw-r--r--sources/shiboken6/libshiboken/signature/signature_p.h1
-rw-r--r--sources/shiboken6/libshiboken/voidptr.cpp11
-rw-r--r--sources/shiboken6/shibokenmodule/CMakeLists.txt41
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/pyi_generator.py12
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py8
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/mapping.py22
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py20
-rw-r--r--sources/shiboken6/shibokenmodule/py.typed.in1
-rw-r--r--sources/shiboken6/shibokenmodule/typesystem_shiboken.xml32
-rw-r--r--sources/shiboken6/tests/libminimal/listuser.cpp14
-rw-r--r--sources/shiboken6/tests/libminimal/listuser.h6
-rw-r--r--sources/shiboken6/tests/libsample/functions.cpp10
-rw-r--r--sources/shiboken6/tests/libsample/functions.h3
-rw-r--r--sources/shiboken6/tests/libsample/pen.cpp4
-rw-r--r--sources/shiboken6/tests/libsample/pen.h4
-rw-r--r--sources/shiboken6/tests/minimalbinding/listuser_test.py37
-rw-r--r--sources/shiboken6/tests/minimalbinding/typesystem_minimal.xml19
-rw-r--r--sources/shiboken6/tests/samplebinding/class_fields_test.py25
-rw-r--r--sources/shiboken6/tests/samplebinding/keep_reference_test.py17
-rw-r--r--sources/shiboken6/tests/samplebinding/multiple_derived_test.py8
-rw-r--r--sources/shiboken6/tests/samplebinding/objecttype_test.py2
-rw-r--r--sources/shiboken6/tests/samplebinding/objecttypelayout_test.py1
-rw-r--r--sources/shiboken6/tests/samplebinding/ownership_delete_parent_test.py3
-rw-r--r--sources/shiboken6/tests/samplebinding/ownership_reparenting_test.py1
-rw-r--r--sources/shiboken6/tests/samplebinding/ownership_transference_test.py2
-rw-r--r--sources/shiboken6/tests/samplebinding/point_test.py1
-rw-r--r--sources/shiboken6/tests/samplebinding/pointerholder_test.py1
-rw-r--r--sources/shiboken6/tests/samplebinding/privatector_test.py1
-rw-r--r--sources/shiboken6/tests/samplebinding/privatedtor_test.py2
-rw-r--r--sources/shiboken6/tests/samplebinding/sample_test.py8
-rw-r--r--sources/shiboken6/tests/samplebinding/time_test.py1
-rw-r--r--sources/shiboken6/tests/samplebinding/typesystem_sample.xml47
-rw-r--r--sources/shiboken6/tests/shibokenmodule/module_test.py6
-rw-r--r--sources/shiboken6/tests/smartbinding/typesystem_smart.xml4
-rw-r--r--sources/shiboken6/tests/test_generator/dummygenerator.cpp2
-rw-r--r--sources/shiboken6/tests/test_generator/dummygentest.cpp10
-rw-r--r--testing/command.py11
-rw-r--r--tools/create_changelog.py73
-rw-r--r--tools/debug_renamer.py81
-rw-r--r--tools/example_gallery/main.py3
447 files changed, 16977 insertions, 4043 deletions
diff --git a/build_scripts/config.py b/build_scripts/config.py
index ba89d04bd..320b2b80a 100644
--- a/build_scripts/config.py
+++ b/build_scripts/config.py
@@ -91,6 +91,7 @@ class Config(object):
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
]
self.setup_script_dir = None
@@ -133,7 +134,7 @@ class Config(object):
setup_kwargs['zip_safe'] = False
setup_kwargs['cmdclass'] = cmd_class_dict
setup_kwargs['version'] = package_version
- setup_kwargs['python_requires'] = ">=3.6, <3.10"
+ setup_kwargs['python_requires'] = ">=3.6, <3.11"
if quiet:
# Tells distutils / setuptools to be quiet, and only print warnings or errors.
diff --git a/build_scripts/wheel_override.py b/build_scripts/wheel_override.py
index 534ae54e9..0811a580b 100644
--- a/build_scripts/wheel_override.py
+++ b/build_scripts/wheel_override.py
@@ -88,7 +88,7 @@ class PysideBuildWheel(_bdist_wheel, DistUtilsCommandMixin):
# create a properly named package.
limited_api_enabled = OPTION["LIMITED_API"] == 'yes'
if limited_api_enabled:
- self.py_limited_api = "cp36.cp37.cp38.cp39"
+ self.py_limited_api = "cp36.cp37.cp38.cp39.cp310"
self._package_version = get_package_version()
diff --git a/coin/dependencies.yaml b/coin/dependencies.yaml
index ef1c3082a..0a1ea21aa 100644
--- a/coin/dependencies.yaml
+++ b/coin/dependencies.yaml
@@ -19,7 +19,6 @@ dependencies: [
"../../qt/qtnetworkauth",
"../../qt/qtqa",
"../../qt/qtquick3d",
- "../../qt/qtquickcontrols2",
"../../qt/qtquicktimeline",
"../../qt/qtremoteobjects",
"../../qt/qtscxml",
diff --git a/coin_build_instructions.py b/coin_build_instructions.py
index 2ab02b973..9c7d29008 100644
--- a/coin_build_instructions.py
+++ b/coin_build_instructions.py
@@ -116,7 +116,7 @@ def call_setup(python_ver, phase):
python3 = "python3"
if sys.platform == "win32":
python3 = os.path.join(os.getenv("PYTHON3_PATH"), "python.exe")
- run_instruction([python3, "-m", "pip", "install", "--user", "virtualenv==20.0.25"], "Failed to pin virtualenv")
+ run_instruction([python3, "-m", "pip", "install", "--user", "virtualenv==20.7.2"], "Failed to pin virtualenv")
# installing to user base might not be in PATH by default.
env_path = os.path.join(site.USER_BASE, "bin")
v_env = os.path.join(env_path, "virtualenv")
diff --git a/coin_test_instructions.py b/coin_test_instructions.py
index 95d79cd7d..116cecf92 100644
--- a/coin_test_instructions.py
+++ b/coin_test_instructions.py
@@ -71,7 +71,7 @@ def call_testrunner(python_ver, buildnro):
python3 = "python3"
if sys.platform == "win32":
python3 = os.path.join(os.getenv("PYTHON3_PATH"), "python.exe")
- run_instruction([python3, "-m", "pip", "install", "--user", "virtualenv==20.0.25"], "Failed to pin virtualenv") # installing to user base might not be in PATH by default.
+ run_instruction([python3, "-m", "pip", "install", "--user", "virtualenv==20.7.2"], "Failed to pin virtualenv") # installing to user base might not be in PATH by default.
# installing to user base might not be in PATH by default.
env_path = os.path.join(site.USER_BASE, "bin")
v_env = os.path.join(env_path, "virtualenv")
diff --git a/dist/changes-6.1.3 b/dist/changes-6.1.3
new file mode 100644
index 000000000..858a2030e
--- /dev/null
+++ b/dist/changes-6.1.3
@@ -0,0 +1,49 @@
+Qt for Python 6.1.3 is a bug-fix release.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+https://doc.qt.io/qtforpython/
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* PySide6 *
+****************************************************************************
+
+ - The Python Unicode API was updated to the newest
+ version when not in limited API mode, too.
+ - [PYSIDE-131] The `tr` function now works also for
+ PySide derived Python class instances with the right context, and
+ fix translation for derived types.
+ - [PYSIDE-1252] The tr() translation method of QObject
+ has been changed to be a class method. This makes it
+ possible to use tr() on a class without instantiation.
+ - [PYSIDE-1482] Add classes QChannel, QChannelComponent, QSharedMemory.
+ - [PYSIDE-1609] PySide6: Fix crashes in QObject.findChild()
+ - [PYSIDE-1614] Fix logging level being set when importing PySide6
+ - [PYSIDE-1617] Fix leak in QML ListProperty type
+ - [PYSIDE-1621] signature: make zip file access totally virtual,
+ and make embedding aware.
+ - [PYSIDE-1626] feature: fix the UIC switching problem
+ - [PYSIDE-1629] PySide6: Fix crash with qmlRegisterSingletonType() when invoked from JavaScript
+ - [PYSIDE-1636] Fix GLES builds
+ - [PYSIDE-1646] Fix the signature mapping after enabling macOS primitive types
+ - [PYSIDE-1647] Fix crash when constructing a QApplication in an embedded application
+
+****************************************************************************
+* Shiboken6 *
+****************************************************************************
+
+ - [PYSIDE-1621] Embedding of supporting Python files
+ is now completely virtual. No FS files are involved any longer.
+ - [PYSIDE-1626] Coexistence of different feature
+ selections works now, especially for UIC files and inheritance.
+ - [PYSIDE-1112] shiboken6/Documentation: Add a link from code injection to type system variables
+ - [PYSIDE-1252] ApiExtractor: add classmethod attribute to add-function for tr()
diff --git a/dist/changes-6.2.0 b/dist/changes-6.2.0
new file mode 100644
index 000000000..a31c1177f
--- /dev/null
+++ b/dist/changes-6.2.0
@@ -0,0 +1,222 @@
+Qt for Python 6.2.0 is a minor release.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+https://doc.qt.io/qtforpython/
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* PySide6 *
+****************************************************************************
+
+ - Crashes in QClipboard.mimeData(), QTextCursor.currentList() and
+ QTextCursor.currentTable() have been fixed.
+ - The Python Unicode API was updated to the newest version when not in limited
+ API mode, too.
+ - The function QUrl.fromFilePath supports now the os.PathLike structure in
+ addition to string arguments.
+ - QMultiMap and QMultiHash are now converted to a dict of key/list of values
+ (corresponding to defaultdict).
+ - QThreadPool().start(std::function) and tryStart(std::function) have been
+ added.
+
+ - [PYSIDE-131] The `tr` function now works also for PySide derived Python
+ class instances with the right context.
+ - [PYSIDE-487] Implement qmlRegisterSingletonInstance
+ - [PYSIDE-535] Tests which use reference counting need to be skipped in
+ upcoming PyPy builds.
+ - [PYSIDE-535] During replacement of type extender macros by functions,
+ a hidden enum/flags alias error was detected and fixed.
+ - [PYSIDE-1252] pyside6-lupdate and the related tools from Qt Linguist have
+ been re-added, enabling using the Qt translation system.
+ - [PYSIDE-1252] The tr() translation method of QObject has been changed to be
+ a class method. This makes it possible to use tr() on a class without
+ instantiation.
+ - [PYSIDE-1334] QObject.connect() now returns an instance of
+ QMetaObject.Connection which can be used to disconnect instead of a bool.
+ - [PYSIDE-1362] A crash in QCustom3DVolume::setTextureData() has been fixed.
+ - [PYSIDE-1378] Assistant is now shipped along with PySide.
+ - [PYSIDE-1436] Support Python 3.10
+ - [PYSIDE-1436] Feature switching needs to reset the internal type cache. This
+ was an omittion that becomes relevant in Python 3.10 .
+ - [PYSIDE-1482] A number of missing classes from the qtbase, qt3d,
+ qtdeclarative. repository have been added.
+ - [PYSIDE-1482] A number of free functions from QtQml have been added.
+ - [PYSIDE-1482] QSharedMemory was added.
+ - [PYSIDE-1499] pathlib.Path gets additionally accepted for all function
+ arguments which have a std::filesystem::path type.
+ - [PYSIDE-1570] The QtDBus module has been added.
+ - [PYSIDE-1570] The QtNetworkAuth module has been added.
+
+ - [PYSIDE-841] examples: clean and update code, add more screenshots, remove
+ version numbers from qml imports and new examples: dynamic spline, string
+ and object list models, markdowneditor, data surface, abstract list model
+ qml, opengl under qml, richtext/textedit, linguist, qsharedmemory.
+ - [PYSIDE-841] tutorials: update datavisualization and expenses
+ - [PYSIDE-862] Allow spaces in ClassInfo keys
+ - [PYSIDE-905] PySide6: Add Qt::FindChildOptions to QObject::findChild(ren)
+ - [PYSIDE-907] PySide6: Add QKey support for the setShortcut method
+ - [PYSIDE-1019] __feature__: Support generation of modified .pyi files and fix
+ default instances.
+ - [PYSIDE-1019] pyi_generator: Optimize imports
+ - [PYSIDE-1019] feature: move getFeatureSelectId to Shiboken and refactor
+ - [PYSIDE-1019] Shiboken: Remove cheating macros
+ - [PYSIDE-1033] cmake: Fix option --sanitize-address
+ - [PYSIDE-1112] sample binding: Document how to force MSVC in case CMake
+ detects clang
+ - [PYSIDE-1112] PySide6: Update documentation on Qt Designer and resource
+ files
+ - [PYSIDE-1160] PySide6: Expose QHostInfo.lookupHost()
+ - [PYSIDE-1252] PySide6: Add entry points for the Qt Linguist tools
+ - [PYSIDE-1252] ApiExtractor: add classmethod attribute to add-function for
+ tr()
+ - [PYSIDE-1252] ApiExtractor: add classmethod attribute to add-function, fix
+ - [PYSIDE-1329] PySide6: Fix signature of QObject.tr()
+ - [PYSIDE-1334] Return QMetaObject.Connection from QObject.connect()
+ - [PYSIDE-1362] Fix crash in QCustom3DVolume::setTextureData()
+ - [PYSIDE-1370] PySide6: Add QSharedMemory
+ - [PYSIDE-1378] PySide6: Add assistant executable
+ - [PYSIDE-1378] build scripts: Extract helper functions to patch executables
+ - [PYSIDE-1378] Build scripts/UNIX: Extract helper function to copy GUI
+ executables
+ - [PYSIDE-1378] PySide6: Add some information on the tools
+ - [PYSIDE-1415] Turn generate_pyi into a general pyi_generator tool
+ - [PYSIDE-1415] Remove SimpleNamespace Python Implementation
+ - [PYSIDE-1437] Revert "Allow calling CI's build scripts with python2"
+ - [PYSIDE-1438] Fix QSurfaceDataProxy::resetArray() crash
+ - [PYSIDE-1455] Turn off numpy support in libpyside by default
+ - [PYSIDE-1455] Fix Designer plugin to load on Linux/macOS, add hints for trouble-shooting.
+ - [PYSIDE-1467] PySide6: Fix signature of CoreApplication.instance()
+ - [PYSIDE-1482] Re-add QtMultimedia/Widgets, fix examples, and missing
+ classes.
+ - [PYSIDE-1482] PySide6/signature: Add PySideSignalInstance
+ - [PYSIDE-1482] libpyside: Add type check for PySideSignalInstanceType
+ - [PYSIDE-1482] Add classes QChannel, QChannelComponent, QSignalSpy and more
+ non-template QML functions
+ - [PYSIDE-1482] PySide6/QSignalSpy: Add constructor taking a signal
+ - [PYSIDE-1482] Add further global functions
+ - [PYSIDE-1482] VoidPtr: Add setters and getters for the size, and isWritable
+ - [PYSIDE-1499] cppgenerator: remove a left-over "this" to get rid of
+ a warning
+ - [PYSIDE-1499] build support for pathlib.Path, migrating examples, and qml load functions
+ - [PYSIDE-1523] Document the usage of Nuitka
+ - [PYSIDE-1556] Fix cmake argument for standalone macOS
+ - [PYSIDE-1563] Fix crashes when using the QImage(uchar *) data constructors
+ - [PYSIDE-1563] Revert "Fix crashes when using the QImage(uchar *) data
+ constructors"
+ - [PYSIDE-1563] Fix error about not holding the GIL when releasing QImage
+ memory
+ - [PYSIDE-1566] Fix Designer plugin to load on macOS
+ - [PYSIDE-1568] CMake: Rename the ENABLE_ platform variables
+ - [PYSIDE-1568] Remove QtX11Extras, QtMacExtras and per-platform typesystem
+ files
+ - [PYSIDE-1568] Introduce conditional processing instructions to typesystem
+ XML
+ - [PYSIDE-1570] Add QtDBus module, QtNetworkAuth QtWebEngineQuick and initial
+ Support for QtBluetooth
+ - [PYSIDE-1570] Re-add QtWebEngine
+ - [PYSIDE-1570] Fix assert when retrieving wrapper from different thread
+ - [PYSIDE-1571] PySide6: Add BluetoothServiceInfo::Alternative, Sequence
+ - [PYSIDE-1583] PySide6: Extend the porting guide
+ - [PYSIDE-1584] mdi/application examples: Fix startup without settings file
+ - [PYSIDE-1585] PySide6: Refactor qvariant conversion code
+ - [PYSIDE-1588] Use replaced types in functions signatures
+ - [PYSIDE-1589] nuitka: Fix slot access for compiled functions
+ - [PYSIDE-1593] PyClassProperty: Correct the decorator and publish the class
+ - [PYSIDE-1599] testing: enforce that .pyi files are always tested
+ - [PYSIDE-1609] PySide6: Fix crashes in QObject.findChild()
+ - [PYSIDE-1609] PySide6: Add a test for QObject.findChildren() by type
+ - [PYSIDE-1611] PySide6: Add missing API of QQuickFramebufferObject.Renderer
+ - [PYSIDE-1614] Fix logging level being set when importing PySide6
+ - [PYSIDE-1617] Fix leak in QML ListProperty type
+ - [PYSIDE-1619] Add fallback case for QSettings.value
+ - [PYSIDE-1621] signature: make zip file access totally virtual
+ - [PYSIDE-1621] signature: update and make embedding aware
+ - [PYSIDE-1621] Remove signature loader completely from physical FS
+ - [PYSIDE-1623] PySide6: Add Qt Quick Controls 2 to the documentation
+ - [PYSIDE-1625] PySide6: Fix QMenu.exec_()
+ - [PYSIDE-1626] feature: fix the UIC switching problem
+ - [PYSIDE-1626] PySide6: Work around uic feature test failure
+ - [PYSIDE-1629] PySide6: Fix crash with qmlRegisterSingletonType() when
+ invoked from JavaScript
+ - [PYSIDE-1636] Fix GLES builds
+ - [PYSIDE-1639] Allow threads for QInputDialog templates, and QAbstractSocket methods.
+ - [PYSIDE-1646] Fix for OpenGL types on macOS
+ - [PYSIDE-1647] Fix crash when constructing a QApplication in an embedded
+ application
+ - [PYSIDE-1650] PySide6: Add QAccessible::installFactory()
+ - [PYSIDE-1650] PySide6: Add QAccessibleActionInterface
+ - [PYSIDE-1659] PySide6: Document QUiLoader restriction wrt signal/slot
+ connections
+ - [PYSIDE-1662] Fix Qt Quick painteditem example to work, and run from
+ a different directory
+ - [PYSIDE-1663] Add QWebEnginePage::setWebChannel(QWebChannel*,quint32)
+
+ - [QTBUG-75870] qtpaths is now used to query Qt properties.
+ - [QTBUG-75870] build scripts: Remove qtchooser handling, replace qmake mkspec
+ parsing by cmake, and introduce qtpaths as qmake replacement
+ - [QTBUG-95649] Disable gestures from QtSensors
+
+****************************************************************************
+* Shiboken6 *
+****************************************************************************
+
+ - [PYSIDE-535] Accept empty dicts as alternative to setting unused
+ keyword dicts to nullptr.
+ - [PYSIDE-535] The type extension macros are replaced by normal function
+ calls. This is not only a pre-requisite for PyPy support but also an
+ improvement of type safety.
+ - [PYSIDE-535] Type creation was completely encapsulated. The
+ implementation can now be rewritten for PyPy.
+ - [PYSIDE-535] Define SbkObjectType to be a PyTypeObject, and remove
+ SbkObjectType from the API
+ - [PYSIDE-535] SbkObjectType is now a typedef for PyTypeObject and
+ SbkType_FromSpec() has been changed to return a PyType_Object *.
+ - [PYSIDE-535] It is now possible to derive classes from enum types like
+ `QtCore.Key` in earlier Python versions.
+ - [PYSIDE-1334] operator bool can now be used for bool conversions
+ (nb_bool) besides Qt-style isNull() methods.
+ - [PYSIDE-1436] The Zip importer was rewritten for the Python 3.4 API
+ which avoids warnings in Python 3.10 .
+ - [PYSIDE-1436] The parser for .pyi files needed an update because of
+ undocumented changes in typing.py for Python 3.10 .
+ - [PYSIDE-1436] Binary flags operators did check cppArg only, but not
+ cppSelf. This is necessary when arguments are swapped. Recognized in
+ Python 3.10 due to improved error checks in debug mode.
+ - [PYSIDE-1436] A very old refcounting bug from 2012 in the sample XML
+ led to a crash in Python 3.10 . This bug was found because the refcounting
+ of Python is more exact, now.
+ - [PYSIDE-1588] It is now possible to specify a function argument type
+ to appear in the .pyi files.
+ - [PYSIDE-1605] Support for opaque C++ sequence scontainers has been added,
+ allowing to pass a wrapped C++ container directly instead of converting
+ it back and forth from Python sequences.
+ - [PYSIDE-1626] Coexistence of different feature selections works now,
+ especially for UIC files and inheritance.
+ - [PYSIDE-1621] Python support files are now always embedded. There is
+ no longer a physical copy installed in the file system.
+ - [PYSIDE-1637] The temporary alias shiboken6.shiboken6 for
+ the Shiboken module was removed. Now there is an unambiguous
+ shiboken6.Shiboken, only.
+ - [PYSIDE-1653] The handling of hidden base class member functions and
+ using declarations has been fixed.
+ - [PYSIDE-1655] stack-use-after-scope ASAN issues in the type system parser
+ have been fixed.
+ - [PYSIDE-1660] CPython types like PyObject, PySequence are now built into
+ shiboken6 and no longer need to be specified in the typesystem files.
+ - [PYSIDE-1568] Construction of abstract classes whose C++ wrapper is disabled
+ has been disabled.
+ - It is now possible to specify a check function for custom types in the
+ typesystem.
+ - A new, simpler normalization function has been introduced for signatures
+ of added functions (which means for example that const-ref is preserved).
+ - The replacement of %PYARG_0 in C++ wrapper classes (native) has been
+ improved and no longer requires adding casts to PyObject *.
diff --git a/examples/bluetooth/btscanner/btscanner.pyproject b/examples/bluetooth/btscanner/btscanner.pyproject
new file mode 100644
index 000000000..208487fe7
--- /dev/null
+++ b/examples/bluetooth/btscanner/btscanner.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["main.py", "device.py", "service.py", "device.ui", "service.ui"]
+}
diff --git a/examples/bluetooth/btscanner/device.py b/examples/bluetooth/btscanner/device.py
new file mode 100644
index 000000000..ba221b155
--- /dev/null
+++ b/examples/bluetooth/btscanner/device.py
@@ -0,0 +1,166 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+from PySide6.QtCore import QPoint, Qt, Slot
+from PySide6.QtGui import QColor
+from PySide6.QtWidgets import QDialog, QListWidgetItem, QListWidget, QMenu
+from PySide6.QtBluetooth import (QBluetoothAddress, QBluetoothDeviceDiscoveryAgent,
+ QBluetoothDeviceInfo, QBluetoothLocalDevice)
+
+from ui_device import Ui_DeviceDiscovery
+from service import ServiceDiscoveryDialog
+
+
+class DeviceDiscoveryDialog(QDialog):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._local_device = QBluetoothLocalDevice()
+ self._ui = Ui_DeviceDiscovery()
+ self._ui.setupUi(self)
+ # In case of multiple Bluetooth adapters it is possible to set adapter
+ # which will be used. Example code:
+ #
+ # address = QBluetoothAddress("XX:XX:XX:XX:XX:XX")
+ # discoveryAgent = QBluetoothDeviceDiscoveryAgent(address)
+
+ self._discovery_agent = QBluetoothDeviceDiscoveryAgent()
+
+ self._ui.scan.clicked.connect(self.start_scan)
+ self._discovery_agent.deviceDiscovered.connect(self.add_device)
+ self._discovery_agent.finished.connect(self.scan_finished)
+ self._ui.list.itemActivated.connect(self.item_activated)
+ self._local_device.hostModeStateChanged.connect(self.host_mode_state_changed)
+
+ self.host_mode_state_changed(self._local_device.hostMode())
+ # add context menu for devices to be able to pair device
+ self._ui.list.setContextMenuPolicy(Qt.CustomContextMenu)
+ self._ui.list.customContextMenuRequested.connect(self.display_pairing_menu)
+ self._local_device.pairingFinished.connect(self.pairing_done)
+
+ @Slot(QBluetoothDeviceInfo)
+ def add_device(self, info):
+ a = info.address().toString()
+ label = f"{a} {info.name()}"
+ items = self._ui.list.findItems(label, Qt.MatchExactly)
+ if not items:
+ item = QListWidgetItem(label)
+ pairing_status = self._local_device.pairingStatus(info.address())
+ if (pairing_status == QBluetoothLocalDevice.Paired
+ or pairing_status == QBluetoothLocalDevice.AuthorizedPaired):
+ item.setForeground(QColor(Qt.green))
+ else:
+ item.setForeground(QColor(Qt.black))
+ self._ui.list.addItem(item)
+
+ @Slot()
+ def start_scan(self):
+ self._discovery_agent.start()
+ self._ui.scan.setEnabled(False)
+
+ @Slot()
+ def scan_finished(self):
+ self._ui.scan.setEnabled(True)
+
+ @Slot(QListWidgetItem)
+ def item_activated(self, item):
+ text = item.text()
+ index = text.find(' ')
+ if index == -1:
+ return
+
+ address = QBluetoothAddress(text[0:index])
+ name = text[index + 1:]
+
+ d = ServiceDiscoveryDialog(name, address)
+ d.exec()
+
+ @Slot(bool)
+ def on_discoverable_clicked(self, clicked):
+ if clicked:
+ self._local_device.setHostMode(QBluetoothLocalDevice.HostDiscoverable)
+ else:
+ self._local_device.setHostMode(QBluetoothLocalDevice.HostConnectable)
+
+ @Slot(bool)
+ def on_power_clicked(self, clicked):
+ if clicked:
+ self._local_device.powerOn()
+ else:
+ self._local_device.setHostMode(QBluetoothLocalDevice.HostPoweredOff)
+
+ @Slot(QBluetoothLocalDevice.HostMode)
+ def host_mode_state_changed(self, mode):
+ self._ui.power.setChecked(mode != QBluetoothLocalDevice.HostPoweredOff)
+ self._ui.discoverable.setChecked(mode == QBluetoothLocalDevice.HostDiscoverable)
+
+ on = mode != QBluetoothLocalDevice.HostPoweredOff
+ self._ui.scan.setEnabled(on)
+ self._ui.discoverable.setEnabled(on)
+
+ @Slot(QPoint)
+ def display_pairing_menu(self, pos):
+ if self._ui.list.count() == 0:
+ return
+ menu = QMenu(self)
+ pair_action = menu.addAction("Pair")
+ remove_pair_action = menu.addAction("Remove Pairing")
+ chosen_action = menu.exec(self._ui.list.viewport().mapToGlobal(pos))
+ current_item = self._ui.list.currentItem()
+
+ text = current_item.text()
+ index = text.find(' ')
+ if index == -1:
+ return
+
+ address = QBluetoothAddress(text[0:index])
+ if chosen_action == pair_action:
+ self._local_device.requestPairing(address, QBluetoothLocalDevice.Paired)
+ elif chosen_action == remove_pair_action:
+ self._local_device.requestPairing(address, QBluetoothLocalDevice.Unpaired)
+
+ @Slot(QBluetoothAddress, QBluetoothLocalDevice.Pairing)
+ def pairing_done(self, address, pairing):
+ items = self._ui.list.findItems(address.toString(), Qt.MatchContains)
+
+ color = QColor(Qt.red)
+ if pairing == QBluetoothLocalDevice.Paired or pairing == QBluetoothLocalDevice.AuthorizedPaired:
+ color = QColor(Qt.green)
+ for item in items:
+ item.setForeground(color)
diff --git a/examples/bluetooth/btscanner/device.ui b/examples/bluetooth/btscanner/device.ui
new file mode 100644
index 000000000..fa81c5cb4
--- /dev/null
+++ b/examples/bluetooth/btscanner/device.ui
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DeviceDiscovery</class>
+ <widget class="QDialog" name="DeviceDiscovery">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>411</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Bluetooth Scanner</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QListWidget" name="list"/>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Local Device</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QCheckBox" name="power">
+ <property name="text">
+ <string>Bluetooth Powered On</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="discoverable">
+ <property name="text">
+ <string>Discoverable</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QPushButton" name="scan">
+ <property name="text">
+ <string>Scan</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clear">
+ <property name="text">
+ <string>Clear</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="quit">
+ <property name="text">
+ <string>Quit</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>quit</sender>
+ <signal>clicked()</signal>
+ <receiver>DeviceDiscovery</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>323</x>
+ <y>275</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>396</x>
+ <y>268</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>clear</sender>
+ <signal>clicked()</signal>
+ <receiver>list</receiver>
+ <slot>clear()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>188</x>
+ <y>276</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>209</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/examples/bluetooth/btscanner/doc/btscanner.rst b/examples/bluetooth/btscanner/doc/btscanner.rst
new file mode 100644
index 000000000..d99af3be5
--- /dev/null
+++ b/examples/bluetooth/btscanner/doc/btscanner.rst
@@ -0,0 +1,4 @@
+Bluetooth Scanner Example
+=========================
+
+An example showing how to locate Bluetooth devices.
diff --git a/examples/bluetooth/btscanner/main.py b/examples/bluetooth/btscanner/main.py
new file mode 100644
index 000000000..ff364f55e
--- /dev/null
+++ b/examples/bluetooth/btscanner/main.py
@@ -0,0 +1,55 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide6 port of the bluetooth/btscanner example from Qt v6.x"""
+
+import sys
+
+from PySide6.QtCore import Qt
+from PySide6.QtWidgets import QApplication, QWidget
+
+from device import DeviceDiscoveryDialog
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ d = DeviceDiscoveryDialog()
+ d.exec()
+ sys.exit(0)
diff --git a/examples/bluetooth/btscanner/service.py b/examples/bluetooth/btscanner/service.py
new file mode 100644
index 000000000..e3916082e
--- /dev/null
+++ b/examples/bluetooth/btscanner/service.py
@@ -0,0 +1,85 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+from PySide6.QtCore import Qt, Slot
+from PySide6.QtWidgets import QDialog
+from PySide6.QtBluetooth import (QBluetoothAddress, QBluetoothServiceInfo,
+ QBluetoothServiceDiscoveryAgent, QBluetoothLocalDevice)
+
+from ui_service import Ui_ServiceDiscovery
+
+
+class ServiceDiscoveryDialog(QDialog):
+ def __init__(self, name, address, parent=None):
+ super().__init__(parent)
+ self._ui = Ui_ServiceDiscovery()
+ self._ui.setupUi(self)
+
+ # Using default Bluetooth adapter
+ local_device = QBluetoothLocalDevice()
+ adapter_address = QBluetoothAddress(local_device.address())
+
+ # In case of multiple Bluetooth adapters it is possible to
+ # set which adapter will be used by providing MAC Address.
+ # Example code:
+ #
+ # adapterAddress = QBluetoothAddress("XX:XX:XX:XX:XX:XX")
+ # discoveryAgent = QBluetoothServiceDiscoveryAgent(adapterAddress)
+
+ self._discovery_agent = QBluetoothServiceDiscoveryAgent(adapter_address)
+ self._discovery_agent.setRemoteAddress(address)
+
+ self.setWindowTitle(name)
+
+ self._discovery_agent.serviceDiscovered.connect(self.add_service)
+ self._discovery_agent.finished.connect(self._ui.status.hide)
+ self._discovery_agent.start()
+
+ @Slot(QBluetoothServiceInfo)
+ def add_service(self, info):
+ line = info.serviceName()
+ if not line:
+ return
+
+ if info.serviceDescription():
+ line += "\n\t" + info.serviceDescription()
+ if info.serviceProvider():
+ line += "\n\t" + info.serviceProvider()
+ self._ui.list.addItem(line)
diff --git a/examples/bluetooth/btscanner/service.ui b/examples/bluetooth/btscanner/service.ui
new file mode 100644
index 000000000..4ca12ee05
--- /dev/null
+++ b/examples/bluetooth/btscanner/service.ui
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ServiceDiscovery</class>
+ <widget class="QDialog" name="ServiceDiscovery">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>539</width>
+ <height>486</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Available Services</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QListWidget" name="list"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="status">
+ <property name="text">
+ <string>Querying...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>ServiceDiscovery</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>396</x>
+ <y>457</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>535</x>
+ <y>443</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>ServiceDiscovery</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>339</x>
+ <y>464</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>535</x>
+ <y>368</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/examples/bluetooth/btscanner/ui_device.py b/examples/bluetooth/btscanner/ui_device.py
new file mode 100644
index 000000000..f351854d7
--- /dev/null
+++ b/examples/bluetooth/btscanner/ui_device.py
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'device.ui'
+##
+## Created by: Qt User Interface Compiler version 6.2.0
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QCheckBox, QDialog, QGroupBox,
+ QHBoxLayout, QListWidget, QListWidgetItem, QPushButton,
+ QSizePolicy, QVBoxLayout)
+
+class Ui_DeviceDiscovery(object):
+ def setupUi(self, DeviceDiscovery):
+ if not DeviceDiscovery.objectName():
+ DeviceDiscovery.setObjectName(u"DeviceDiscovery")
+ DeviceDiscovery.resize(400, 411)
+ self.verticalLayout = QVBoxLayout(DeviceDiscovery)
+ self.verticalLayout.setObjectName(u"verticalLayout")
+ self.list = QListWidget(DeviceDiscovery)
+ self.list.setObjectName(u"list")
+
+ self.verticalLayout.addWidget(self.list)
+
+ self.groupBox = QGroupBox(DeviceDiscovery)
+ self.groupBox.setObjectName(u"groupBox")
+ self.horizontalLayout_2 = QHBoxLayout(self.groupBox)
+ self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
+ self.power = QCheckBox(self.groupBox)
+ self.power.setObjectName(u"power")
+ self.power.setChecked(True)
+
+ self.horizontalLayout_2.addWidget(self.power)
+
+ self.discoverable = QCheckBox(self.groupBox)
+ self.discoverable.setObjectName(u"discoverable")
+ self.discoverable.setChecked(True)
+
+ self.horizontalLayout_2.addWidget(self.discoverable)
+
+
+ self.verticalLayout.addWidget(self.groupBox)
+
+ self.horizontalLayout = QHBoxLayout()
+ self.horizontalLayout.setObjectName(u"horizontalLayout")
+ self.scan = QPushButton(DeviceDiscovery)
+ self.scan.setObjectName(u"scan")
+
+ self.horizontalLayout.addWidget(self.scan)
+
+ self.clear = QPushButton(DeviceDiscovery)
+ self.clear.setObjectName(u"clear")
+
+ self.horizontalLayout.addWidget(self.clear)
+
+ self.quit = QPushButton(DeviceDiscovery)
+ self.quit.setObjectName(u"quit")
+
+ self.horizontalLayout.addWidget(self.quit)
+
+
+ self.verticalLayout.addLayout(self.horizontalLayout)
+
+
+ self.retranslateUi(DeviceDiscovery)
+ self.quit.clicked.connect(DeviceDiscovery.accept)
+ self.clear.clicked.connect(self.list.clear)
+
+ QMetaObject.connectSlotsByName(DeviceDiscovery)
+ # setupUi
+
+ def retranslateUi(self, DeviceDiscovery):
+ DeviceDiscovery.setWindowTitle(QCoreApplication.translate("DeviceDiscovery", u"Bluetooth Scanner", None))
+ self.groupBox.setTitle(QCoreApplication.translate("DeviceDiscovery", u"Local Device", None))
+ self.power.setText(QCoreApplication.translate("DeviceDiscovery", u"Bluetooth Powered On", None))
+ self.discoverable.setText(QCoreApplication.translate("DeviceDiscovery", u"Discoverable", None))
+ self.scan.setText(QCoreApplication.translate("DeviceDiscovery", u"Scan", None))
+ self.clear.setText(QCoreApplication.translate("DeviceDiscovery", u"Clear", None))
+ self.quit.setText(QCoreApplication.translate("DeviceDiscovery", u"Quit", None))
+ # retranslateUi
diff --git a/examples/bluetooth/btscanner/ui_service.py b/examples/bluetooth/btscanner/ui_service.py
new file mode 100644
index 000000000..c5a37a933
--- /dev/null
+++ b/examples/bluetooth/btscanner/ui_service.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'service.ui'
+##
+## Created by: Qt User Interface Compiler version 6.2.1
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QAbstractButton, QApplication, QDialog, QDialogButtonBox,
+ QLabel, QListWidget, QListWidgetItem, QSizePolicy,
+ QVBoxLayout)
+
+class Ui_ServiceDiscovery(object):
+ def setupUi(self, ServiceDiscovery):
+ if not ServiceDiscovery.objectName():
+ ServiceDiscovery.setObjectName(u"ServiceDiscovery")
+ ServiceDiscovery.resize(539, 486)
+ self.verticalLayout = QVBoxLayout(ServiceDiscovery)
+ self.verticalLayout.setObjectName(u"verticalLayout")
+ self.list = QListWidget(ServiceDiscovery)
+ self.list.setObjectName(u"list")
+
+ self.verticalLayout.addWidget(self.list)
+
+ self.status = QLabel(ServiceDiscovery)
+ self.status.setObjectName(u"status")
+
+ self.verticalLayout.addWidget(self.status)
+
+ self.buttonBox = QDialogButtonBox(ServiceDiscovery)
+ self.buttonBox.setObjectName(u"buttonBox")
+ self.buttonBox.setStandardButtons(QDialogButtonBox.Close)
+
+ self.verticalLayout.addWidget(self.buttonBox)
+
+
+ self.retranslateUi(ServiceDiscovery)
+ self.buttonBox.accepted.connect(ServiceDiscovery.accept)
+ self.buttonBox.rejected.connect(ServiceDiscovery.reject)
+
+ QMetaObject.connectSlotsByName(ServiceDiscovery)
+ # setupUi
+
+ def retranslateUi(self, ServiceDiscovery):
+ ServiceDiscovery.setWindowTitle(QCoreApplication.translate("ServiceDiscovery", u"Available Services", None))
+ self.status.setText(QCoreApplication.translate("ServiceDiscovery", u"Querying...", None))
+ # retranslateUi
diff --git a/examples/charts/areachart/areachart.py b/examples/charts/areachart/areachart.py
new file mode 100644
index 000000000..a65cf2c86
--- /dev/null
+++ b/examples/charts/areachart/areachart.py
@@ -0,0 +1,104 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide6 port of the areachart example from Qt v6.x"""
+
+import sys
+from PySide6.QtCore import QPointF, Qt
+from PySide6.QtWidgets import QMainWindow, QApplication
+from PySide6.QtCharts import QChart, QChartView, QLineSeries, QAreaSeries
+from PySide6.QtGui import QGradient, QPen, QLinearGradient, QPainter
+
+
+class TestChart(QMainWindow):
+ def __init__(self):
+ super().__init__()
+
+ self.series_0 = QLineSeries()
+ self.series_1 = QLineSeries()
+
+ self.series_0.append(QPointF(1, 5))
+ self.series_0.append(QPointF(3, 7))
+ self.series_0.append(QPointF(7, 6))
+ self.series_0.append(QPointF(9, 7))
+ self.series_0.append(QPointF(12, 6))
+ self.series_0.append(QPointF(16, 7))
+ self.series_0.append(QPointF(18, 5))
+
+ self.series_1.append(QPointF(1, 3))
+ self.series_1.append(QPointF(3, 4))
+ self.series_1.append(QPointF(7, 3))
+ self.series_1.append(QPointF(8, 2))
+ self.series_1.append(QPointF(12, 3))
+ self.series_1.append(QPointF(16, 4))
+ self.series_1.append(QPointF(18, 3))
+
+ self.series = QAreaSeries(self.series_0, self.series_1)
+ self.series.setName("Batman")
+ self.pen = QPen(0x059605)
+ self.pen.setWidth(3)
+ self.series.setPen(self.pen)
+
+ self.gradient = QLinearGradient(QPointF(0, 0), QPointF(0, 1))
+ self.gradient.setColorAt(0.0, 0x3cc63c)
+ self.gradient.setColorAt(1.0, 0x26f626)
+ self.gradient.setCoordinateMode(QGradient.ObjectBoundingMode)
+ self.series.setBrush(self.gradient)
+
+ self.chart = QChart()
+ self.chart.addSeries(self.series)
+ self.chart.setTitle("Simple areachart example")
+ self.chart.createDefaultAxes()
+ self.chart.axes(Qt.Horizontal)[0].setRange(0, 20)
+ self.chart.axes(Qt.Vertical)[0].setRange(0, 10)
+
+ self._chart_view = QChartView(self.chart)
+ self._chart_view.setRenderHint(QPainter.Antialiasing)
+
+ self.setCentralWidget(self._chart_view)
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ window = TestChart()
+ window.show()
+ window.resize(400, 300)
+ sys.exit(app.exec())
diff --git a/examples/charts/areachart/areachart.pyproject b/examples/charts/areachart/areachart.pyproject
new file mode 100644
index 000000000..b4a6f9d65
--- /dev/null
+++ b/examples/charts/areachart/areachart.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["areachart.py"]
+}
diff --git a/examples/charts/areachart/doc/areachart.png b/examples/charts/areachart/doc/areachart.png
new file mode 100644
index 000000000..d03838443
--- /dev/null
+++ b/examples/charts/areachart/doc/areachart.png
Binary files differ
diff --git a/examples/charts/areachart/doc/areachart.rst b/examples/charts/areachart/doc/areachart.rst
new file mode 100644
index 000000000..c6cd718d7
--- /dev/null
+++ b/examples/charts/areachart/doc/areachart.rst
@@ -0,0 +1,8 @@
+Area Chart Example
+==================
+
+The example shows how to create an area Chart
+
+.. image:: areachart.png
+ :width: 400
+ :alt: Area Chart Screenshot
diff --git a/examples/charts/barchart/barchart.py b/examples/charts/barchart/barchart.py
new file mode 100644
index 000000000..8ae0dc5ff
--- /dev/null
+++ b/examples/charts/barchart/barchart.py
@@ -0,0 +1,106 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide6 port of the linechart example from Qt v6.x"""
+
+import sys
+
+from PySide6.QtCharts import (QBarCategoryAxis, QBarSeries, QBarSet, QChart,
+ QChartView, QValueAxis)
+from PySide6.QtCore import Qt
+from PySide6.QtGui import QPainter
+from PySide6.QtWidgets import QApplication, QMainWindow
+
+
+class TestChart(QMainWindow):
+ def __init__(self):
+ super().__init__()
+
+ self.set_0 = QBarSet("Jane")
+ self.set_1 = QBarSet("John")
+ self.set_2 = QBarSet("Axel")
+ self.set_3 = QBarSet("Mary")
+ self.set_4 = QBarSet("Samantha")
+
+ self.set_0.append([1, 2, 3, 4, 5, 6])
+ self.set_1.append([5, 0, 0, 4, 0, 7])
+ self.set_2.append([3, 5, 8, 13, 8, 5])
+ self.set_3.append([5, 6, 7, 3, 4, 5])
+ self.set_4.append([9, 7, 5, 3, 1, 2])
+
+ self.series = QBarSeries()
+ self.series.append(self.set_0)
+ self.series.append(self.set_1)
+ self.series.append(self.set_2)
+ self.series.append(self.set_3)
+ self.series.append(self.set_4)
+
+ self.chart = QChart()
+ self.chart.addSeries(self.series)
+ self.chart.setTitle("Simple barchart example")
+ self.chart.setAnimationOptions(QChart.SeriesAnimations)
+
+ self.categories = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
+ self.axis_x = QBarCategoryAxis()
+ self.axis_x.append(self.categories)
+ self.chart.addAxis(self.axis_x, Qt.AlignBottom)
+ self.series.attachAxis(self.axis_x)
+
+ self.axis_y = QValueAxis()
+ self.axis_y.setRange(0, 15)
+ self.chart.addAxis(self.axis_y, Qt.AlignLeft)
+ self.series.attachAxis(self.axis_y)
+
+ self.chart.legend().setVisible(True)
+ self.chart.legend().setAlignment(Qt.AlignBottom)
+
+ self._chart_view = QChartView(self.chart)
+ self._chart_view.setRenderHint(QPainter.Antialiasing)
+
+ self.setCentralWidget(self._chart_view)
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ window = TestChart()
+ window.show()
+ window.resize(420, 300)
+ sys.exit(app.exec())
diff --git a/examples/charts/barchart/barchart.pyproject b/examples/charts/barchart/barchart.pyproject
new file mode 100644
index 000000000..4ca819426
--- /dev/null
+++ b/examples/charts/barchart/barchart.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["barchart.py"]
+}
diff --git a/examples/charts/barchart/doc/barchart.png b/examples/charts/barchart/doc/barchart.png
new file mode 100644
index 000000000..da08217fc
--- /dev/null
+++ b/examples/charts/barchart/doc/barchart.png
Binary files differ
diff --git a/examples/charts/barchart/doc/barchart.rst b/examples/charts/barchart/doc/barchart.rst
new file mode 100644
index 000000000..b9a499721
--- /dev/null
+++ b/examples/charts/barchart/doc/barchart.rst
@@ -0,0 +1,8 @@
+Bar Chart Example
+==================
+
+The example shows how to create a Bar chart.
+
+.. image:: barchart.png
+ :width: 400
+ :alt: Bar Chart Screenshot
diff --git a/examples/datavisualization/surface/doc/surface.rst b/examples/datavisualization/surface/doc/surface.rst
new file mode 100644
index 000000000..65674bf91
--- /dev/null
+++ b/examples/datavisualization/surface/doc/surface.rst
@@ -0,0 +1,23 @@
+Surface Example
+===============
+
+Using Q3DSurface in a widget application.
+
+The surface example shows how to make a simple 3D surface graph using
+Q3DSurface and combining the use of widgets for adjusting several adjustable
+qualities. This example demonstrates the following features:
+
+* How to set up a basic QSurfaceDataProxy and set data for it.
+* How to use QHeightMapSurfaceDataProxy for showing 3D height maps.
+* Three different selection modes for studying the graph.
+* Axis range usage for displaying selected portions of the graph.
+* Changing theme.
+* How to set a custom surface gradient.
+
+For instructions about how to interact with the graph, see `this page`_.
+
+.. image:: surface_mountain.png
+ :width: 400
+ :alt: Surface Example Screenshot
+
+.. _`this page`: https://doc.qt.io/qt-6/qtdatavisualization-interacting-with-data.html
diff --git a/examples/datavisualization/surface/doc/surface_mountain.png b/examples/datavisualization/surface/doc/surface_mountain.png
new file mode 100644
index 000000000..ba9652394
--- /dev/null
+++ b/examples/datavisualization/surface/doc/surface_mountain.png
Binary files differ
diff --git a/examples/datavisualization/surface/main.py b/examples/datavisualization/surface/main.py
new file mode 100644
index 000000000..3b0bd095a
--- /dev/null
+++ b/examples/datavisualization/surface/main.py
@@ -0,0 +1,218 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import sys
+
+from PySide6.QtCore import QSize, Qt
+from PySide6.QtDataVisualization import Q3DSurface
+from PySide6.QtGui import QBrush, QIcon, QLinearGradient, QPainter, QPixmap
+from PySide6.QtWidgets import (QApplication, QComboBox, QGroupBox, QHBoxLayout,
+ QLabel, QMessageBox, QPushButton, QRadioButton,
+ QSizePolicy, QSlider, QVBoxLayout, QWidget)
+
+from surfacegraph import SurfaceGraph
+
+THEMES = ["Qt", "Primary Colors", "Digia", "Stone Moss", "Army Blue", "Retro", "Ebony", "Isabelle"]
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ graph = Q3DSurface()
+ container = QWidget.createWindowContainer(graph)
+
+ if not graph.hasContext():
+ msgBox = QMessageBox()
+ msgBox.setText("Couldn't initialize the OpenGL context.")
+ msgBox.exec()
+ sys.exit(-1)
+
+ screenSize = graph.screen().size()
+ container.setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.6))
+ container.setMaximumSize(screenSize)
+ container.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+ container.setFocusPolicy(Qt.StrongFocus)
+
+ widget = QWidget()
+ hLayout = QHBoxLayout(widget)
+ vLayout = QVBoxLayout()
+ hLayout.addWidget(container, 1)
+ hLayout.addLayout(vLayout)
+ vLayout.setAlignment(Qt.AlignTop)
+
+ widget.setWindowTitle("Surface example")
+
+ modelGroupBox = QGroupBox("Model")
+
+ sqrtSinModelRB = QRadioButton(widget)
+ sqrtSinModelRB.setText("Sqrt& Sin")
+ sqrtSinModelRB.setChecked(False)
+
+ heightMapModelRB = QRadioButton(widget)
+ heightMapModelRB.setText("Height Map")
+ heightMapModelRB.setChecked(False)
+
+ modelVBox = QVBoxLayout()
+ modelVBox.addWidget(sqrtSinModelRB)
+ modelVBox.addWidget(heightMapModelRB)
+ modelGroupBox.setLayout(modelVBox)
+
+ selectionGroupBox = QGroupBox("Selection Mode")
+
+ modeNoneRB = QRadioButton(widget)
+ modeNoneRB.setText("No selection")
+ modeNoneRB.setChecked(False)
+
+ modeItemRB = QRadioButton(widget)
+ modeItemRB.setText("Item")
+ modeItemRB.setChecked(False)
+
+ modeSliceRowRB = QRadioButton(widget)
+ modeSliceRowRB.setText("Row Slice")
+ modeSliceRowRB.setChecked(False)
+
+ modeSliceColumnRB = QRadioButton(widget)
+ modeSliceColumnRB.setText("Column Slice")
+ modeSliceColumnRB.setChecked(False)
+
+ selectionVBox = QVBoxLayout()
+ selectionVBox.addWidget(modeNoneRB)
+ selectionVBox.addWidget(modeItemRB)
+ selectionVBox.addWidget(modeSliceRowRB)
+ selectionVBox.addWidget(modeSliceColumnRB)
+ selectionGroupBox.setLayout(selectionVBox)
+
+ axisMinSliderX = QSlider(Qt.Horizontal, widget)
+ axisMinSliderX.setMinimum(0)
+ axisMinSliderX.setTickInterval(1)
+ axisMinSliderX.setEnabled(True)
+ axisMaxSliderX = QSlider(Qt.Horizontal, widget)
+ axisMaxSliderX.setMinimum(1)
+ axisMaxSliderX.setTickInterval(1)
+ axisMaxSliderX.setEnabled(True)
+ axisMinSliderZ = QSlider(Qt.Horizontal, widget)
+ axisMinSliderZ.setMinimum(0)
+ axisMinSliderZ.setTickInterval(1)
+ axisMinSliderZ.setEnabled(True)
+ axisMaxSliderZ = QSlider(Qt.Horizontal, widget)
+ axisMaxSliderZ.setMinimum(1)
+ axisMaxSliderZ.setTickInterval(1)
+ axisMaxSliderZ.setEnabled(True)
+
+ themeList = QComboBox(widget)
+ themeList.addItems(THEMES)
+
+ colorGroupBox = QGroupBox("Custom gradient")
+
+ grBtoY = QLinearGradient(0, 0, 1, 100)
+ grBtoY.setColorAt(1.0, Qt.black)
+ grBtoY.setColorAt(0.67, Qt.blue)
+ grBtoY.setColorAt(0.33, Qt.red)
+ grBtoY.setColorAt(0.0, Qt.yellow)
+
+ pm = QPixmap(24, 100)
+ pmp = QPainter(pm)
+ pmp.setBrush(QBrush(grBtoY))
+ pmp.setPen(Qt.NoPen)
+ pmp.drawRect(0, 0, 24, 100)
+ pmp.end()
+
+ gradientBtoYPB = QPushButton(widget)
+ gradientBtoYPB.setIcon(QIcon(pm))
+ gradientBtoYPB.setIconSize(QSize(24, 100))
+
+ grGtoR = QLinearGradient(0, 0, 1, 100)
+ grGtoR.setColorAt(1.0, Qt.darkGreen)
+ grGtoR.setColorAt(0.5, Qt.yellow)
+ grGtoR.setColorAt(0.2, Qt.red)
+ grGtoR.setColorAt(0.0, Qt.darkRed)
+ pmp.begin(pm)
+ pmp.setBrush(QBrush(grGtoR))
+ pmp.drawRect(0, 0, 24, 100)
+ pmp.end()
+
+ gradientGtoRPB = QPushButton(widget)
+ gradientGtoRPB.setIcon(QIcon(pm))
+ gradientGtoRPB.setIconSize(QSize(24, 100))
+
+ colorHBox = QHBoxLayout()
+ colorHBox.addWidget(gradientBtoYPB)
+ colorHBox.addWidget(gradientGtoRPB)
+ colorGroupBox.setLayout(colorHBox)
+
+ vLayout.addWidget(modelGroupBox)
+ vLayout.addWidget(selectionGroupBox)
+ vLayout.addWidget(QLabel("Column range"))
+ vLayout.addWidget(axisMinSliderX)
+ vLayout.addWidget(axisMaxSliderX)
+ vLayout.addWidget(QLabel("Row range"))
+ vLayout.addWidget(axisMinSliderZ)
+ vLayout.addWidget(axisMaxSliderZ)
+ vLayout.addWidget(QLabel("Theme"))
+ vLayout.addWidget(themeList)
+ vLayout.addWidget(colorGroupBox)
+
+ widget.show()
+
+ modifier = SurfaceGraph(graph)
+
+ heightMapModelRB.toggled.connect(modifier.enableHeightMapModel)
+ sqrtSinModelRB.toggled.connect(modifier.enableSqrtSinModel)
+ modeNoneRB.toggled.connect(modifier.toggleModeNone)
+ modeItemRB.toggled.connect(modifier.toggleModeItem)
+ modeSliceRowRB.toggled.connect(modifier.toggleModeSliceRow)
+ modeSliceColumnRB.toggled.connect(modifier.toggleModeSliceColumn)
+ axisMinSliderX.valueChanged.connect(modifier.adjustXMin)
+ axisMaxSliderX.valueChanged.connect(modifier.adjustXMax)
+ axisMinSliderZ.valueChanged.connect(modifier.adjustZMin)
+ axisMaxSliderZ.valueChanged.connect(modifier.adjustZMax)
+ themeList.currentIndexChanged[int].connect(modifier.changeTheme)
+ gradientBtoYPB.pressed.connect(modifier.setBlackToYellowGradient)
+ gradientGtoRPB.pressed.connect(modifier.setGreenToRedGradient)
+
+ modifier.setAxisMinSliderX(axisMinSliderX)
+ modifier.setAxisMaxSliderX(axisMaxSliderX)
+ modifier.setAxisMinSliderZ(axisMinSliderZ)
+ modifier.setAxisMaxSliderZ(axisMaxSliderZ)
+
+ sqrtSinModelRB.setChecked(True)
+ modeItemRB.setChecked(True)
+ themeList.setCurrentIndex(2)
+
+ sys.exit(app.exec())
diff --git a/examples/datavisualization/surface/mountain.png b/examples/datavisualization/surface/mountain.png
new file mode 100644
index 000000000..9138c710a
--- /dev/null
+++ b/examples/datavisualization/surface/mountain.png
Binary files differ
diff --git a/examples/datavisualization/surface/surface.pyproject b/examples/datavisualization/surface/surface.pyproject
new file mode 100644
index 000000000..598a6541f
--- /dev/null
+++ b/examples/datavisualization/surface/surface.pyproject
@@ -0,0 +1,4 @@
+{
+ "files": ["main.py",
+ "surfacegraph.py"]
+}
diff --git a/examples/datavisualization/surface/surfacegraph.py b/examples/datavisualization/surface/surfacegraph.py
new file mode 100644
index 000000000..8af18b550
--- /dev/null
+++ b/examples/datavisualization/surface/surfacegraph.py
@@ -0,0 +1,275 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import math
+
+from PySide6.QtCore import QObject, Qt, Slot
+from PySide6.QtDataVisualization import (Q3DTheme, QAbstract3DGraph,
+ QHeightMapSurfaceDataProxy,
+ QSurface3DSeries, QSurfaceDataItem,
+ QSurfaceDataProxy, QValue3DAxis)
+from PySide6.QtGui import QImage, QLinearGradient, QVector3D
+from PySide6.QtWidgets import QSlider
+
+sampleCountX = 50
+sampleCountZ = 50
+heightMapGridStepX = 6
+heightMapGridStepZ = 6
+sampleMin = -8.0
+sampleMax = 8.0
+
+
+class SurfaceGraph(QObject):
+ def __init__(self, surface, parent=None):
+ QObject.__init__(self, parent)
+
+ self.m_graph = surface
+ self.m_graph.setAxisX(QValue3DAxis())
+ self.m_graph.setAxisY(QValue3DAxis())
+ self.m_graph.setAxisZ(QValue3DAxis())
+
+ self.m_sqrtSinProxy = QSurfaceDataProxy()
+ self.m_sqrtSinSeries = QSurface3DSeries(self.m_sqrtSinProxy)
+ self.fillSqrtSinProxy()
+
+ heightMapImage = QImage("mountain.png")
+ self.m_heightMapProxy = QHeightMapSurfaceDataProxy(heightMapImage)
+ self.m_heightMapSeries = QSurface3DSeries(self.m_heightMapProxy)
+ self.m_heightMapSeries.setItemLabelFormat("(@xLabel, @zLabel): @yLabel")
+ self.m_heightMapProxy.setValueRanges(34.0, 40.0, 18.0, 24.0)
+
+ self.m_heightMapWidth = heightMapImage.width()
+ self.m_heightMapHeight = heightMapImage.height()
+
+ self.m_axisMinSliderX = QSlider()
+ self.m_axisMaxSliderX = QSlider()
+ self.m_axisMinSliderZ = QSlider()
+ self.m_axisMaxSliderZ = QSlider()
+ self.m_rangeMinX = 0.0
+ self.m_rangeMinZ = 0.0
+ self.m_stepX = 0.0
+ self.m_stepZ = 0.0
+
+ def fillSqrtSinProxy(self):
+ stepX = (sampleMax - sampleMin) / float(sampleCountX - 1)
+ stepZ = (sampleMax - sampleMin) / float(sampleCountZ - 1)
+
+ dataArray = []
+ for i in range(sampleCountZ):
+ newRow = []
+ # Keep values within range bounds, since just adding step can cause
+ # minor drift due to the rounding errors.
+ z = min(sampleMax, (i * stepZ + sampleMin))
+ for j in range(sampleCountX):
+ x = min(sampleMax, (j * stepX + sampleMin))
+ R = math.sqrt(z * z + x * x) + 0.01
+ y = (math.sin(R) / R + 0.24) * 1.61
+ newRow.append(QSurfaceDataItem(QVector3D(x, y, z)))
+ dataArray.append(newRow)
+
+ self.m_sqrtSinProxy.resetArray(dataArray)
+
+ def enableSqrtSinModel(self, enable):
+ if enable:
+ self.m_sqrtSinSeries.setDrawMode(QSurface3DSeries.DrawSurfaceAndWireframe)
+ self.m_sqrtSinSeries.setFlatShadingEnabled(True)
+
+ self.m_graph.axisX().setLabelFormat("%.2f")
+ self.m_graph.axisZ().setLabelFormat("%.2f")
+ self.m_graph.axisX().setRange(sampleMin, sampleMax)
+ self.m_graph.axisY().setRange(0.0, 2.0)
+ self.m_graph.axisZ().setRange(sampleMin, sampleMax)
+ self.m_graph.axisX().setLabelAutoRotation(30)
+ self.m_graph.axisY().setLabelAutoRotation(90)
+ self.m_graph.axisZ().setLabelAutoRotation(30)
+
+ self.m_graph.removeSeries(self.m_heightMapSeries)
+ self.m_graph.addSeries(self.m_sqrtSinSeries)
+
+ # Reset range sliders for Sqrt&Sin
+ self.m_rangeMinX = sampleMin
+ self.m_rangeMinZ = sampleMin
+ self.m_stepX = (sampleMax - sampleMin) / float(sampleCountX - 1)
+ self.m_stepZ = (sampleMax - sampleMin) / float(sampleCountZ - 1)
+ self.m_axisMinSliderX.setMaximum(sampleCountX - 2)
+ self.m_axisMinSliderX.setValue(0)
+ self.m_axisMaxSliderX.setMaximum(sampleCountX - 1)
+ self.m_axisMaxSliderX.setValue(sampleCountX - 1)
+ self.m_axisMinSliderZ.setMaximum(sampleCountZ - 2)
+ self.m_axisMinSliderZ.setValue(0)
+ self.m_axisMaxSliderZ.setMaximum(sampleCountZ - 1)
+ self.m_axisMaxSliderZ.setValue(sampleCountZ - 1)
+
+ def enableHeightMapModel(self, enable):
+ if enable:
+ self.m_heightMapSeries.setDrawMode(QSurface3DSeries.DrawSurface)
+ self.m_heightMapSeries.setFlatShadingEnabled(False)
+
+ self.m_graph.axisX().setLabelFormat("%.1f N")
+ self.m_graph.axisZ().setLabelFormat("%.1f E")
+ self.m_graph.axisX().setRange(34.0, 40.0)
+ self.m_graph.axisY().setAutoAdjustRange(True)
+ self.m_graph.axisZ().setRange(18.0, 24.0)
+
+ self.m_graph.axisX().setTitle("Latitude")
+ self.m_graph.axisY().setTitle("Height")
+ self.m_graph.axisZ().setTitle("Longitude")
+
+ self.m_graph.removeSeries(self.m_sqrtSinSeries)
+ self.m_graph.addSeries(self.m_heightMapSeries)
+
+ # Reset range sliders for height map
+ mapGridCountX = self.m_heightMapWidth / heightMapGridStepX
+ mapGridCountZ = self.m_heightMapHeight / heightMapGridStepZ
+ self.m_rangeMinX = 34.0
+ self.m_rangeMinZ = 18.0
+ self.m_stepX = 6.0 / float(mapGridCountX - 1)
+ self.m_stepZ = 6.0 / float(mapGridCountZ - 1)
+ self.m_axisMinSliderX.setMaximum(mapGridCountX - 2)
+ self.m_axisMinSliderX.setValue(0)
+ self.m_axisMaxSliderX.setMaximum(mapGridCountX - 1)
+ self.m_axisMaxSliderX.setValue(mapGridCountX - 1)
+ self.m_axisMinSliderZ.setMaximum(mapGridCountZ - 2)
+ self.m_axisMinSliderZ.setValue(0)
+ self.m_axisMaxSliderZ.setMaximum(mapGridCountZ - 1)
+ self.m_axisMaxSliderZ.setValue(mapGridCountZ - 1)
+
+ def adjustXMin(self, minimum):
+ minX = self.m_stepX * float(minimum) + self.m_rangeMinX
+
+ maximum = self.m_axisMaxSliderX.value()
+ if minimum >= maximum:
+ maximum = minimum + 1
+ self.m_axisMaxSliderX.setValue(maximum)
+ maxX = self.m_stepX * maximum + self.m_rangeMinX
+
+ self.setAxisXRange(minX, maxX)
+
+ def adjustXMax(self, maximum):
+ maxX = self.m_stepX * float(maximum) + self.m_rangeMinX
+
+ minimum = self.m_axisMinSliderX.value()
+ if maximum <= minimum:
+ minimum = maximum - 1
+ self.m_axisMinSliderX.setValue(minimum)
+ minX = self.m_stepX * minimum + self.m_rangeMinX
+
+ self.setAxisXRange(minX, maxX)
+
+ def adjustZMin(self, minimum):
+ minZ = self.m_stepZ * float(minimum) + self.m_rangeMinZ
+
+ maximum = self.m_axisMaxSliderZ.value()
+ if minimum >= maximum:
+ maximum = minimum + 1
+ self.m_axisMaxSliderZ.setValue(maximum)
+ maxZ = self.m_stepZ * maximum + self.m_rangeMinZ
+
+ self.setAxisZRange(minZ, maxZ)
+
+ def adjustZMax(self, maximum):
+ maxX = self.m_stepZ * float(maximum) + self.m_rangeMinZ
+
+ minimum = self.m_axisMinSliderZ.value()
+ if maximum <= minimum:
+ minimum = maximum - 1
+ self.m_axisMinSliderZ.setValue(minimum)
+ minX = self.m_stepZ * minimum + self.m_rangeMinZ
+
+ self.setAxisZRange(minX, maxX)
+
+ def setAxisXRange(self, minimum, maximum):
+ self.m_graph.axisX().setRange(minimum, maximum)
+
+ def setAxisZRange(self, minimum, maximum):
+ self.m_graph.axisZ().setRange(minimum, maximum)
+
+ @Slot()
+ def changeTheme(self, theme):
+ self.m_graph.activeTheme().setType(Q3DTheme.Theme(theme))
+
+ def setBlackToYellowGradient(self):
+ gr = QLinearGradient()
+ gr.setColorAt(0.0, Qt.black)
+ gr.setColorAt(0.33, Qt.blue)
+ gr.setColorAt(0.67, Qt.red)
+ gr.setColorAt(1.0, Qt.yellow)
+
+ self.m_graph.seriesList()[0].setBaseGradient(gr)
+ self.m_graph.seriesList()[0].setColorStyle(Q3DTheme.ColorStyleRangeGradient)
+
+ def setGreenToRedGradient(self):
+ gr = QLinearGradient()
+ gr.setColorAt(0.0, Qt.darkGreen)
+ gr.setColorAt(0.5, Qt.yellow)
+ gr.setColorAt(0.8, Qt.red)
+ gr.setColorAt(1.0, Qt.darkRed)
+
+ series = self.m_graph.seriesList()[0]
+ series.setBaseGradient(gr)
+ series.setColorStyle(Q3DTheme.ColorStyleRangeGradient)
+
+ def toggleModeNone(self):
+ self.m_graph.setSelectionMode(QAbstract3DGraph.SelectionNone)
+
+ def toggleModeItem(self):
+ self.m_graph.setSelectionMode(QAbstract3DGraph.SelectionItem)
+
+ def toggleModeSliceRow(self):
+ self.m_graph.setSelectionMode(
+ QAbstract3DGraph.SelectionItemAndRow | QAbstract3DGraph.SelectionSlice
+ )
+
+ def toggleModeSliceColumn(self):
+ self.m_graph.setSelectionMode(
+ QAbstract3DGraph.SelectionItemAndColumn | QAbstract3DGraph.SelectionSlice
+ )
+
+ def setAxisMinSliderX(self, slider):
+ self.m_axisMinSliderX = slider
+
+ def setAxisMaxSliderX(self, slider):
+ self.m_axisMaxSliderX = slider
+
+ def setAxisMinSliderZ(self, slider):
+ self.m_axisMinSliderZ = slider
+
+ def setAxisMaxSliderZ(self, slider):
+ self.m_axisMaxSliderZ = slider
diff --git a/examples/declarative/editingmodel/MovingRectangle.qml b/examples/declarative/editingmodel/MovingRectangle.qml
new file mode 100644
index 000000000..0d835af1c
--- /dev/null
+++ b/examples/declarative/editingmodel/MovingRectangle.qml
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt for Python examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+import QtQuick
+import QtQuick.Controls
+
+Rectangle {
+ id: root
+ property int modelIndex
+ property Item dragParent
+ property Item sizeParent
+ property alias text: zone.text
+ property alias bgColor: root.color
+
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ verticalCenter: parent.verticalCenter
+ }
+ color: backgroundColor
+ anchors.fill: sizeParent
+ border.color: "yellow"
+ border.width: 0
+ TextArea {
+ id: zone
+ anchors.centerIn: parent
+ text: display
+ onTextChanged: model.edit = text
+ }
+
+ MouseArea {
+ id: zoneMouseArea
+ anchors.fill: parent
+
+ acceptedButtons: Qt.MiddleButton
+ onClicked: function(mouse) {
+ if (mouse.button == Qt.MiddleButton)
+ lv.model.remove(index)
+ else
+ mouse.accepted = false
+ }
+ }
+ DragHandler {
+ id: dragHandler
+ xAxis {
+
+ enabled: true
+ minimum: 0
+ maximum: lv.width - droparea.width
+ }
+ yAxis.enabled: false
+ acceptedButtons: Qt.LeftButton
+ }
+ Drag.active: dragHandler.active
+ Drag.source: root
+ Drag.hotSpot.x: width / 2
+
+ states: [
+ State {
+ when: dragHandler.active
+ ParentChange {
+ target: root
+ parent: root.dragParent
+ }
+
+ AnchorChanges {
+ target: root
+ anchors.horizontalCenter: undefined
+ anchors.verticalCenter: undefined
+ }
+ PropertyChanges {
+ target: root
+ opacity: 0.6
+ border.width: 3
+ }
+ }
+ ]
+}
diff --git a/examples/declarative/editingmodel/doc/editingmodel.rst b/examples/declarative/editingmodel/doc/editingmodel.rst
new file mode 100644
index 000000000..d76bebc22
--- /dev/null
+++ b/examples/declarative/editingmodel/doc/editingmodel.rst
@@ -0,0 +1,14 @@
+QAbstractListModel in QML
+=========================
+
+This example shows how to add, remove and move items inside a QML
+ListView, but showing and editing the data via roles using a
+QAbstractListModel from Python.
+
+You can add new elements and reset the view using the two top buttons,
+remove elements by 'middle click' the element, and move the elements
+with a 'left click' plus dragging the item around.
+
+.. image:: qabstractlistmodelqml.png
+ :width: 400
+ :alt: QAbstractListModel/ListView Screenshot
diff --git a/examples/declarative/editingmodel/doc/qabstractlistmodelqml.png b/examples/declarative/editingmodel/doc/qabstractlistmodelqml.png
new file mode 100644
index 000000000..6e181fba1
--- /dev/null
+++ b/examples/declarative/editingmodel/doc/qabstractlistmodelqml.png
Binary files differ
diff --git a/examples/declarative/editingmodel/main.py b/examples/declarative/editingmodel/main.py
new file mode 100644
index 000000000..6aee0d224
--- /dev/null
+++ b/examples/declarative/editingmodel/main.py
@@ -0,0 +1,59 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import sys
+from pathlib import Path
+
+from PySide6.QtCore import QUrl
+from PySide6.QtGui import QGuiApplication
+from PySide6.QtQml import QQmlApplicationEngine, qmlRegisterType
+
+from model import BaseModel
+
+if __name__ == "__main__":
+ app = QGuiApplication(sys.argv)
+ qmlRegisterType(BaseModel, "BaseModel", 1, 0, "BaseModel")
+ engine = QQmlApplicationEngine()
+ qml_file = Path(__file__).parent / "main.qml"
+ engine.load(QUrl.fromLocalFile(qml_file))
+
+ if not engine.rootObjects():
+ sys.exit(-1)
+ sys.exit(app.exec())
diff --git a/examples/declarative/editingmodel/main.pyproject b/examples/declarative/editingmodel/main.pyproject
new file mode 100644
index 000000000..71272a973
--- /dev/null
+++ b/examples/declarative/editingmodel/main.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["model.py","main.qml","main.py","MovingRectangle.qml"]
+}
diff --git a/examples/declarative/editingmodel/main.qml b/examples/declarative/editingmodel/main.qml
new file mode 100644
index 000000000..8624be6cf
--- /dev/null
+++ b/examples/declarative/editingmodel/main.qml
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt for Python examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Window
+import BaseModel
+
+Window {
+ title: "Moving Rectangle"
+ width: 800
+ height: 480
+ visible: true
+ id: mainWindow
+
+ Column {
+ spacing: 20
+ anchors.fill: parent
+ id: mainColumn
+ Text {
+ padding: 20
+ font.pointSize: 10
+ width: 600
+ wrapMode: Text.Wrap
+ text: "This example shows how to add, remove and move items inside a QML ListView.\n
+It shows and edits data via roles using QAbstractListModel on the Python side.\n
+Use the 'Middle click' on top of a rectangle to remove an item.\n
+'Left click' and drag to move the items."
+ }
+
+ Button {
+ anchors {
+ left: mainColumn.left
+ right: mainColumn.right
+ margins: 30
+ }
+ text: "Reset view"
+ onClicked: lv.model.reset()
+ }
+
+ Button {
+ anchors {
+ left: mainColumn.left
+ right: mainColumn.right
+ margins: 30
+ }
+ text: "Add element"
+ onClicked: lv.model.append()
+ }
+
+ ListView {
+ id: lv
+ anchors {
+ left: mainColumn.left
+ right: mainColumn.right
+ margins: 30
+ }
+
+ height: 200
+ model: BaseModel {}
+ orientation: ListView.Horizontal
+ displaced: Transition {
+ NumberAnimation {
+ properties: "x,y"
+ easing.type: Easing.OutQuad
+ }
+ }
+ delegate: DropArea {
+ id: droparea
+ width: ratio * lv.width
+ height: lv.height
+
+ onEntered: function (drag) {
+ let dragindex = drag.source.modelIndex
+ if (index === dragindex)
+ return
+ lv.model.move(dragindex, index)
+ }
+
+ MovingRectangle {
+ modelIndex: index
+ dragParent: lv
+ sizeParent: droparea
+ }
+ }
+
+ MouseArea {
+ id: lvMousearea
+ anchors.fill: lv
+ z: -1
+ }
+ Rectangle {
+ id: lvBackground
+ anchors.fill: lv
+ anchors.margins: -border.width
+ color: "white"
+ border.color: "black"
+ border.width: 5
+ z: -1
+ }
+ Component.onCompleted: {
+ lv.model.reset()
+ }
+ }
+ }
+}
diff --git a/examples/declarative/editingmodel/model.py b/examples/declarative/editingmodel/model.py
new file mode 100644
index 000000000..99736e714
--- /dev/null
+++ b/examples/declarative/editingmodel/model.py
@@ -0,0 +1,187 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+
+from PySide6.QtCore import (QAbstractListModel, QByteArray, QModelIndex, Qt,
+ Slot)
+from PySide6.QtGui import QColor
+
+
+class BaseModel(QAbstractListModel):
+
+ RatioRole = Qt.UserRole + 1
+
+ def __init__(self, parent=None):
+ super().__init__(parent=parent)
+ self.db = []
+
+ def rowCount(self, parent=QModelIndex()):
+ return len(self.db)
+
+ def roleNames(self):
+ default = super().roleNames()
+ default[self.RatioRole] = QByteArray(b"ratio")
+ default[Qt.BackgroundRole] = QByteArray(b"backgroundColor")
+ return default
+
+ def data(self, index, role: int):
+ if not self.db:
+ ret = None
+ elif not index.isValid():
+ ret = None
+ elif role == Qt.DisplayRole:
+ ret = self.db[index.row()]["text"]
+ elif role == Qt.BackgroundRole:
+ ret = self.db[index.row()]["bgColor"]
+ elif role == self.RatioRole:
+ ret = self.db[index.row()]["ratio"]
+ else:
+ ret = None
+ return ret
+
+ def setData(self, index, value, role):
+ if not index.isValid():
+ return False
+ if role == Qt.EditRole:
+ self.db[index.row()]["text"] = value
+ return True
+
+ @Slot(result=bool)
+ def append(self):
+ """Slot to append a row at the end"""
+ return self.insertRow(self.rowCount())
+
+ def insertRow(self, row):
+ """Insert a single row at row"""
+ return self.insertRows(row, 0)
+
+ def insertRows(self, row: int, count, index=QModelIndex()):
+ """Insert n rows (n = 1 + count) at row"""
+
+ self.beginInsertRows(QModelIndex(), row, row + count)
+
+ # start database work
+ if len(self.db):
+ newid = max(x["id"] for x in self.db) + 1
+ else:
+ newid = 1
+ for i in range(count + 1): # at least one row
+ self.db.insert(
+ row, {"id": newid, "text": "new", "bgColor": QColor("purple"), "ratio": 0.2}
+ )
+ # end database work
+ self.endInsertRows()
+ return True
+
+ @Slot(int, int, result=bool)
+ def move(self, source: int, target: int):
+ """Slot to move a single row from source to target"""
+ return self.moveRow(QModelIndex(), source, QModelIndex(), target)
+
+ def moveRow(self, sourceParent, sourceRow, dstParent, dstChild):
+ """Move a single row"""
+ return self.moveRows(sourceParent, sourceRow, 0, dstParent, dstChild)
+
+ def moveRows(self, sourceParent, sourceRow, count, dstParent, dstChild):
+ """Move n rows (n=1+ count) from sourceRow to dstChild"""
+
+ if sourceRow == dstChild:
+ return False
+
+ elif sourceRow > dstChild:
+ end = dstChild
+
+ else:
+ end = dstChild + 1
+
+ self.beginMoveRows(QModelIndex(), sourceRow, sourceRow + count, QModelIndex(), end)
+
+ # start database work
+ pops = self.db[sourceRow : sourceRow + count + 1]
+ if sourceRow > dstChild:
+ self.db = (
+ self.db[:dstChild]
+ + pops
+ + self.db[dstChild:sourceRow]
+ + self.db[sourceRow + count + 1 :]
+ )
+ else:
+ start = self.db[:sourceRow]
+ middle = self.db[dstChild : dstChild + 1]
+ endlist = self.db[dstChild + count + 1 :]
+ self.db = start + middle + pops + endlist
+ # end database work
+
+ self.endMoveRows()
+ return True
+
+ @Slot(int, result=bool)
+ def remove(self, row: int):
+ """Slot to remove one row"""
+ return self.removeRow(row)
+
+ def removeRow(self, row, parent=QModelIndex()):
+ """Remove one row at index row"""
+ return self.removeRows(row, 0, parent)
+
+ def removeRows(self, row: int, count: int, parent=QModelIndex()):
+ """Remove n rows (n=1+count) starting at row"""
+ self.beginRemoveRows(QModelIndex(), row, row + count)
+
+ # start database work
+ self.db = self.db[:row] + self.db[row + count + 1 :]
+ # end database work
+
+ self.endRemoveRows()
+ return True
+
+ @Slot(result=bool)
+ def reset(self):
+ self.beginResetModel()
+ self.resetInternalData() # should work without calling it ?
+ self.endResetModel()
+ return True
+
+ def resetInternalData(self):
+ self.db = [
+ {"id": 3, "bgColor": QColor("red"), "ratio": 0.15, "text": "first"},
+ {"id": 1, "bgColor": QColor("blue"), "ratio": 0.1, "text": "second"},
+ {"id": 2, "bgColor": QColor("green"), "ratio": 0.2, "text": "third"},
+ ]
diff --git a/examples/declarative/openglunderqml/doc/openglunderqml.rst b/examples/declarative/openglunderqml/doc/openglunderqml.rst
new file mode 100644
index 000000000..6a89a99d9
--- /dev/null
+++ b/examples/declarative/openglunderqml/doc/openglunderqml.rst
@@ -0,0 +1,21 @@
+OpenGL under QML Squircle
+=========================
+
+The OpenGL under QML example shows how an application can make use of the
+QQuickWindow::beforeRendering() signal to draw custom OpenGL content under a Qt
+Quick scene. This signal is emitted at the start of every frame, before the
+scene graph starts its rendering, thus any OpenGL draw calls that are made as
+a response to this signal, will stack under the Qt Quick items.
+
+As an alternative, applications that wish to render OpenGL content on top of
+the Qt Quick scene, can do so by connecting to the
+QQuickWindow::afterRendering() signal.
+
+In this example, we will also see how it is possible to have values that are
+exposed to QML which affect the OpenGL rendering. We animate the threshold
+value using a NumberAnimation in the QML file and this value is used by the
+OpenGL shader program that draws the squircles.
+
+.. image:: squircle.png
+ :width: 400
+ :alt: Squircle Screenshot
diff --git a/examples/declarative/openglunderqml/doc/squircle.png b/examples/declarative/openglunderqml/doc/squircle.png
new file mode 100644
index 000000000..c099a6b7e
--- /dev/null
+++ b/examples/declarative/openglunderqml/doc/squircle.png
Binary files differ
diff --git a/examples/declarative/openglunderqml/main.py b/examples/declarative/openglunderqml/main.py
new file mode 100644
index 000000000..26e059f93
--- /dev/null
+++ b/examples/declarative/openglunderqml/main.py
@@ -0,0 +1,66 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import sys
+from pathlib import Path
+
+from PySide6.QtCore import QUrl
+from PySide6.QtGui import QGuiApplication
+from PySide6.QtQml import qmlRegisterType
+from PySide6.QtQuick import QQuickView, QQuickWindow, QSGRendererInterface
+
+from squircle import Squircle
+
+if __name__ == "__main__":
+ app = QGuiApplication(sys.argv)
+
+ QQuickWindow.setGraphicsApi(QSGRendererInterface.OpenGLRhi)
+ qmlRegisterType(Squircle, "OpenGLUnderQML", 1, 0, "Squircle")
+
+ view = QQuickView()
+ view.setResizeMode(QQuickView.SizeRootObjectToView)
+ qml_file = Path(__file__).parent / "main.qml"
+ view.setSource(QUrl.fromLocalFile(qml_file))
+
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+
+ sys.exit(app.exec())
diff --git a/examples/declarative/openglunderqml/main.qml b/examples/declarative/openglunderqml/main.qml
new file mode 100644
index 000000000..7edcf523b
--- /dev/null
+++ b/examples/declarative/openglunderqml/main.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick
+import OpenGLUnderQML
+
+Item {
+
+ width: 320
+ height: 480
+
+ Squircle {
+ SequentialAnimation on t {
+ NumberAnimation { to: 1; duration: 2500; easing.type: Easing.InQuad }
+ NumberAnimation { to: 0; duration: 2500; easing.type: Easing.OutQuad }
+ loops: Animation.Infinite
+ running: true
+ }
+ }
+ Rectangle {
+ color: Qt.rgba(1, 1, 1, 0.7)
+ radius: 10
+ border.width: 1
+ border.color: "white"
+ anchors.fill: label
+ anchors.margins: -10
+ }
+
+ Text {
+ id: label
+ color: "black"
+ wrapMode: Text.WordWrap
+ text: "The background here is a squircle rendered with raw OpenGL using the 'beforeRender()' signal in QQuickWindow. This text label and its border is rendered using QML"
+ anchors.right: parent.right
+ anchors.left: parent.left
+ anchors.bottom: parent.bottom
+ anchors.margins: 20
+ }
+}
diff --git a/examples/declarative/openglunderqml/openglunderqml.pyproject b/examples/declarative/openglunderqml/openglunderqml.pyproject
new file mode 100644
index 000000000..e7cfbc570
--- /dev/null
+++ b/examples/declarative/openglunderqml/openglunderqml.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": [ "main.py", "main.qml", "squircle.py", "squirclerenderer.py"]
+}
diff --git a/examples/declarative/openglunderqml/squircle.py b/examples/declarative/openglunderqml/squircle.py
new file mode 100644
index 000000000..8d2cbca84
--- /dev/null
+++ b/examples/declarative/openglunderqml/squircle.py
@@ -0,0 +1,107 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+from PySide6.QtCore import Property, QRunnable, Qt, Signal, Slot
+from PySide6.QtQuick import QQuickItem, QQuickWindow
+
+from squirclerenderer import SquircleRenderer
+
+
+class CleanupJob(QRunnable):
+ def __init__(self, renderer):
+ super().__init__()
+ self._renderer = renderer
+
+ def run(self):
+ del self._renderer
+
+
+class Squircle(QQuickItem):
+
+ tChanged = Signal()
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._t = 0.0
+ self._renderer = None
+ self.windowChanged.connect(self.handleWindowChanged)
+
+ def t(self):
+ return self._t
+
+ def setT(self, value):
+ if self._t == value:
+ return
+ self._t = value
+ self.tChanged.emit()
+ if self.window():
+ self.window().update()
+
+ @Slot(QQuickWindow)
+ def handleWindowChanged(self, win):
+ if win:
+ win.beforeSynchronizing.connect(self.sync, type=Qt.DirectConnection)
+ win.sceneGraphInvalidated.connect(self.cleanup, type=Qt.DirectConnection)
+ win.setColor(Qt.black)
+ self.sync()
+
+ def cleanup(self):
+ del self._renderer
+ self._renderer = None
+
+ @Slot()
+ def sync(self):
+ if not self._renderer:
+ self._renderer = SquircleRenderer()
+ self.window().beforeRendering.connect(self._renderer.init, Qt.DirectConnection)
+ self.window().beforeRenderPassRecording.connect(
+ self._renderer.paint, Qt.DirectConnection
+ )
+ self._renderer.setViewportSize(self.window().size() * self.window().devicePixelRatio())
+ self._renderer.setT(self._t)
+ self._renderer.setWindow(self.window())
+
+ def releaseResources(self):
+ self.window().scheduleRenderJob(
+ CleanupJob(self._renderer), QQuickWindow.BeforeSynchronizingStage
+ )
+ self._renderer = None
+
+ t = Property(float, t, setT, notify=tChanged)
diff --git a/examples/declarative/openglunderqml/squirclerenderer.py b/examples/declarative/openglunderqml/squirclerenderer.py
new file mode 100644
index 000000000..12cd93bb8
--- /dev/null
+++ b/examples/declarative/openglunderqml/squirclerenderer.py
@@ -0,0 +1,141 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+from textwrap import dedent
+
+import numpy as np
+from OpenGL.GL import (GL_ARRAY_BUFFER, GL_BLEND, GL_DEPTH_TEST, GL_FLOAT,
+ GL_ONE, GL_SRC_ALPHA, GL_TRIANGLE_STRIP)
+from PySide6.QtCore import QSize, Slot
+from PySide6.QtGui import QOpenGLFunctions
+from PySide6.QtOpenGL import (QOpenGLShader, QOpenGLShaderProgram,
+ QOpenGLVersionProfile)
+from PySide6.QtQuick import QQuickWindow, QSGRendererInterface
+
+VERTEX_SHADER = dedent(
+ """\
+ attribute highp vec4 vertices;
+ varying highp vec2 coords;
+ void main() {
+ gl_Position = vertices;
+ coords = vertices.xy;
+ }
+ """
+)
+FRAGMENT_SHADER = dedent(
+ """\
+ uniform lowp float t;
+ varying highp vec2 coords;
+ void main() {
+ lowp float i = 1. - (pow(abs(coords.x), 4.) + pow(abs(coords.y), 4.));
+ i = smoothstep(t - 0.8, t + 0.8, i);
+ i = floor(i * 20.) / 20.;
+ gl_FragColor = vec4(coords * .5 + .5, i, i);
+ }
+ """
+)
+
+
+class SquircleRenderer(QOpenGLFunctions):
+ def __init__(self):
+ QOpenGLFunctions.__init__(self)
+ self._viewport_size = QSize()
+ self._t = 0.0
+ self._program = None
+ self._window = QQuickWindow()
+ self.profile = QOpenGLVersionProfile()
+ self.gl = None
+
+ def setT(self, t):
+ self._t = t
+
+ def setViewportSize(self, size):
+ self._viewport_size = size
+
+ def setWindow(self, window):
+ self._window = window
+
+ @Slot()
+ def init(self):
+ if not self._program:
+ rif = self._window.rendererInterface()
+ assert (
+ rif.graphicsApi() == QSGRendererInterface.OpenGL
+ or rif.graphicsApi() == QSGRendererInterface.OpenGLRhy
+ )
+ self.initializeOpenGLFunctions()
+ self._program = QOpenGLShaderProgram()
+ self._program.addCacheableShaderFromSourceCode(QOpenGLShader.Vertex, VERTEX_SHADER)
+ self._program.addCacheableShaderFromSourceCode(QOpenGLShader.Fragment, FRAGMENT_SHADER)
+ self._program.bindAttributeLocation("vertices", 0)
+ self._program.link()
+
+ @Slot()
+ def paint(self):
+ # Play nice with the RHI. Not strictly needed when the scenegraph uses
+ # OpenGL directly.
+ self._window.beginExternalCommands()
+
+ self._program.bind()
+
+ self._program.enableAttributeArray(0)
+
+ values = np.array([-1, -1, 1, -1, -1, 1, 1, 1], dtype="single")
+
+ # This example relies on (deprecated) client-side pointers for the vertex
+ # input. Therefore, we have to make sure no vertex buffer is bound.
+ self.glBindBuffer(GL_ARRAY_BUFFER, 0)
+
+ self._program.setAttributeArray(0, GL_FLOAT, values, 2)
+ self._program.setUniformValue1f("t", self._t)
+
+ self.glViewport(0, 0, self._viewport_size.width(), self._viewport_size.height())
+
+ self.glDisable(GL_DEPTH_TEST)
+
+ self.glEnable(GL_BLEND)
+ self.glBlendFunc(GL_SRC_ALPHA, GL_ONE)
+
+ self.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
+
+ self._program.disableAttributeArray(0)
+ self._program.release()
+
+ self._window.endExternalCommands()
diff --git a/examples/declarative/referenceexamples/adding/adding.pyproject b/examples/declarative/referenceexamples/adding/adding.pyproject
new file mode 100644
index 000000000..46df4b253
--- /dev/null
+++ b/examples/declarative/referenceexamples/adding/adding.pyproject
@@ -0,0 +1,5 @@
+{
+ "files": ["example.qml",
+ "main.py",
+ "person.py"]
+}
diff --git a/examples/declarative/referenceexamples/adding/doc/adding.rst b/examples/declarative/referenceexamples/adding/doc/adding.rst
new file mode 100644
index 000000000..b060f3c2c
--- /dev/null
+++ b/examples/declarative/referenceexamples/adding/doc/adding.rst
@@ -0,0 +1,65 @@
+Extending QML - Adding Types Example
+====================================
+
+The Adding Types Example shows how to add a new object type, ``Person``, to QML.
+The ``Person`` type can be used from QML like this:
+
+.. code-block:: javascript
+
+ import examples.adding.people
+
+ Person {
+ name: "Bob Jones"
+ shoe_size: 12
+ }
+
+Declare the Person Class
+------------------------
+
+All QML types map to C++ types. Here we declare a basic C++ Person class
+with the two properties we want accessible on the QML type - name and shoeSize.
+Although in this example we use the same name for the C++ class as the QML
+type, the C++ class can be named differently, or appear in a namespace.
+
+The Person class implementation is quite basic. The property accessors simply
+return members of the object instance.
+
+.. code-block:: python
+
+ from PySide6.QtCore import QObject, Property
+ from PySide6.QtQml import QmlElement
+
+ # To be used on the @QmlElement decorator
+ # (QML_IMPORT_MINOR_VERSION is optional)
+ QML_IMPORT_NAME = "examples.adding.people"
+ QML_IMPORT_MAJOR_VERSION = 1
+
+
+ @QmlElement
+ class Person(QObject):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._name = ''
+ self._shoe_size = 0
+
+ @Property(str)
+ def name(self):
+ return self._name
+
+ @name.setter
+ def name(self, n):
+ self._name = n
+
+ @Property(int)
+ def shoe_size(self):
+ return self._shoe_size
+
+ @shoe_size.setter
+ def shoe_size(self, s):
+ self._shoe_size = s
+
+Running the Example
+-------------------
+
+The main.py file in the example includes a simple shell application that
+loads and runs the QML snippet shown at the beginning of this page.
diff --git a/examples/declarative/referenceexamples/adding/example.qml b/examples/declarative/referenceexamples/adding/example.qml
new file mode 100644
index 000000000..e452b2283
--- /dev/null
+++ b/examples/declarative/referenceexamples/adding/example.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt for Python examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import examples.adding.people
+
+Person {
+ name: "Bob Jones"
+ shoe_size: 12
+}
diff --git a/examples/declarative/referenceexamples/adding/main.py b/examples/declarative/referenceexamples/adding/main.py
new file mode 100644
index 000000000..ffa10e9d3
--- /dev/null
+++ b/examples/declarative/referenceexamples/adding/main.py
@@ -0,0 +1,67 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide6 port of the qml/examples/qml/referenceexamples/adding example from Qt v6.x"""
+
+from pathlib import Path
+import sys
+
+from PySide6.QtCore import QCoreApplication, QUrl
+from PySide6.QtQml import QQmlComponent, QQmlEngine
+
+from person import Person
+
+
+if __name__ == '__main__':
+ app = QCoreApplication(sys.argv)
+
+ qml_file = Path(__file__).parent / "example.qml"
+ url = QUrl.fromLocalFile(qml_file)
+ engine = QQmlEngine()
+ component = QQmlComponent(engine, url)
+
+ person = component.create()
+ if person:
+ print(f"The person's name is {person.name}")
+ print(f"They wear a {person.shoe_size} sized shoe")
+ else:
+ print(component.errors())
+ del engine
+ sys.exit(0)
diff --git a/examples/declarative/referenceexamples/adding/person.py b/examples/declarative/referenceexamples/adding/person.py
new file mode 100644
index 000000000..23ac5378d
--- /dev/null
+++ b/examples/declarative/referenceexamples/adding/person.py
@@ -0,0 +1,72 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+from PySide6.QtCore import QObject, Property
+from PySide6.QtQml import QmlElement
+
+# To be used on the @QmlElement decorator
+# (QML_IMPORT_MINOR_VERSION is optional)
+QML_IMPORT_NAME = "examples.adding.people"
+QML_IMPORT_MAJOR_VERSION = 1
+
+
+@QmlElement
+class Person(QObject):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._name = ''
+ self._shoe_size = 0
+
+ @Property(str)
+ def name(self):
+ return self._name
+
+ @name.setter
+ def name(self, n):
+ self._name = n
+
+ @Property(int)
+ def shoe_size(self):
+ return self._shoe_size
+
+ @shoe_size.setter
+ def shoe_size(self, s):
+ self._shoe_size = s
+
diff --git a/examples/declarative/rendercontrol/rendercontrol_opengl/cuberenderer.py b/examples/declarative/rendercontrol/rendercontrol_opengl/cuberenderer.py
new file mode 100644
index 000000000..90cd78e65
--- /dev/null
+++ b/examples/declarative/rendercontrol/rendercontrol_opengl/cuberenderer.py
@@ -0,0 +1,223 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import ctypes
+import numpy
+from OpenGL.GL import (GL_COLOR_BUFFER_BIT, GL_CULL_FACE, GL_CW,
+ GL_DEPTH_BUFFER_BIT, GL_DEPTH_TEST, GL_FALSE, GL_FLOAT,
+ GL_TEXTURE_2D, GL_TRIANGLES)
+
+from PySide6.QtGui import (QMatrix4x4, QOffscreenSurface, QOpenGLContext,
+ QOpenGLFunctions, QWindow)
+from PySide6.QtOpenGL import (QOpenGLBuffer, QOpenGLShader,
+ QOpenGLShaderProgram, QOpenGLVertexArrayObject)
+from shiboken6 import VoidPtr
+
+
+VERTEXSHADER_SOURCE = """attribute highp vec4 vertex;
+attribute lowp vec2 coord;
+varying lowp vec2 v_coord;
+uniform highp mat4 matrix;
+void main() {
+ v_coord = coord;
+ gl_Position = matrix * vertex;
+}
+"""
+
+
+FRAGMENTSHADER_SOURCE = """varying lowp vec2 v_coord;
+uniform sampler2D sampler;
+void main() {
+ gl_FragColor = vec4(texture2D(sampler, v_coord).rgb, 1.0);
+}
+"""
+
+
+FLOAT_SIZE = ctypes.sizeof(ctypes.c_float)
+
+
+VERTEXES = numpy.array([-0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5,
+ 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5,
+ 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5,
+
+ 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5,
+ -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5,
+ -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5,
+
+ 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5,
+ -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5,
+ -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5,
+ 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5],
+ dtype=numpy.float32)
+
+
+TEX_COORDS = numpy.array([0.0, 0.0, 1.0, 1.0, 1.0, 0.0,
+ 1.0, 1.0, 0.0, 0.0, 0.0, 1.0,
+ 1.0, 1.0, 1.0, 0.0, 0.0, 1.0,
+ 0.0, 0.0, 0.0, 1.0, 1.0, 0.0,
+
+ 1.0, 1.0, 1.0, 0.0, 0.0, 1.0,
+ 0.0, 0.0, 0.0, 1.0, 1.0, 0.0,
+ 0.0, 0.0, 1.0, 1.0, 1.0, 0.0,
+ 1.0, 1.0, 0.0, 0.0, 0.0, 1.0,
+
+ 0.0, 1.0, 1.0, 0.0, 1.0, 1.0,
+ 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
+ 1.0, 0.0, 1.0, 1.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0, 1.0, 1.0], dtype=numpy.float32)
+
+
+class CubeRenderer():
+ def __init__(self, offscreenSurface):
+ self.m_angle = 0
+ self.m_offscreenSurface = offscreenSurface
+ self.m_context = None
+ self.m_program = None
+ self.m_vbo = None
+ self.m_vao = None
+ self.m_matrixLoc = 0
+ self.m_proj = QMatrix4x4()
+
+ def __del__(self):
+ # Use a temporary offscreen surface to do the cleanup. There may not
+ # be a native window surface available anymore at self stage.
+ self.m_context.makeCurrent(self.m_offscreenSurface)
+ del self.m_program
+ del self.m_vbo
+ del self.m_vao
+ self.m_context.doneCurrent()
+
+ def init(self, w, share):
+ self.m_context = QOpenGLContext()
+ self.m_context.setShareContext(share)
+ self.m_context.setFormat(w.requestedFormat())
+ self.m_context.create()
+ if not self.m_context.makeCurrent(w):
+ return
+
+ f = self.m_context.functions()
+ f.glClearColor(0.0, 0.1, 0.25, 1.0)
+ f.glViewport(0, 0, w.width() * w.devicePixelRatio(),
+ w.height() * w.devicePixelRatio())
+
+ self.m_program = QOpenGLShaderProgram()
+ self.m_program.addCacheableShaderFromSourceCode(QOpenGLShader.Vertex,
+ VERTEXSHADER_SOURCE)
+ self.m_program.addCacheableShaderFromSourceCode(QOpenGLShader.Fragment,
+ FRAGMENTSHADER_SOURCE)
+ self.m_program.bindAttributeLocation("vertex", 0)
+ self.m_program.bindAttributeLocation("coord", 1)
+ self.m_program.link()
+ self.m_matrixLoc = self.m_program.uniformLocation("matrix")
+
+ self.m_vao = QOpenGLVertexArrayObject()
+ self.m_vao.create()
+ vaoBinder = QOpenGLVertexArrayObject.Binder(self.m_vao)
+
+ self.m_vbo = QOpenGLBuffer()
+ self.m_vbo.create()
+ self.m_vbo.bind()
+
+ vertexCount = 36
+ self.m_vbo.allocate(FLOAT_SIZE * vertexCount * 5)
+ vertex_data = VERTEXES.tobytes()
+ tex_coord_data = TEX_COORDS.tobytes()
+ self.m_vbo.write(0, VoidPtr(vertex_data),
+ FLOAT_SIZE * vertexCount * 3)
+ self.m_vbo.write(FLOAT_SIZE * vertexCount * 3,
+ VoidPtr(tex_coord_data),
+ FLOAT_SIZE * vertexCount * 2)
+ self.m_vbo.release()
+
+ if self.m_vao.isCreated():
+ self.setupVertexAttribs()
+
+ def resize(self, w, h):
+ self.m_proj.setToIdentity()
+ self.m_proj.perspective(45, w / float(h), 0.01, 100.0)
+
+ def setupVertexAttribs(self):
+ self.m_vbo.bind()
+ self.m_program.enableAttributeArray(0)
+ self.m_program.enableAttributeArray(1)
+ f = self.m_context.functions()
+
+ null = VoidPtr(0)
+ pointer = VoidPtr(36 * 3 * FLOAT_SIZE)
+ f.glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, null)
+ f.glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, pointer)
+ self.m_vbo.release()
+
+ def render(self, w, share, texture):
+ if not self.m_context:
+ self.init(w, share)
+
+ if not self.m_context.makeCurrent(w):
+ return
+
+ f = self.m_context.functions()
+ f.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
+
+ if texture:
+ f.glBindTexture(GL_TEXTURE_2D, texture)
+ f.glFrontFace(GL_CW) # because our cube's vertex data is such
+ f.glEnable(GL_CULL_FACE)
+ f.glEnable(GL_DEPTH_TEST)
+
+ self.m_program.bind()
+ vaoBinder = QOpenGLVertexArrayObject.Binder(self.m_vao)
+ # If VAOs are not supported, set the vertex attributes every time.
+ if not self.m_vao.isCreated():
+ self.setupVertexAttribs()
+
+ m = QMatrix4x4()
+ m.translate(0, 0, -2)
+ m.rotate(90, 0, 0, 1)
+ m.rotate(self.m_angle, 0.5, 1, 0)
+ self.m_angle += 0.5
+
+ self.m_program.setUniformValue(self.m_matrixLoc, self.m_proj * m)
+
+ # Draw the cube.
+ f.glDrawArrays(GL_TRIANGLES, 0, 36)
+
+ self.m_context.swapBuffers(w)
diff --git a/examples/declarative/rendercontrol/rendercontrol_opengl/demo.qml b/examples/declarative/rendercontrol/rendercontrol_opengl/demo.qml
new file mode 100644
index 000000000..aeffc7646
--- /dev/null
+++ b/examples/declarative/rendercontrol/rendercontrol_opengl/demo.qml
@@ -0,0 +1,208 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt for Python examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Particles 2.0
+
+Rectangle {
+ id: root
+
+ gradient: Gradient {
+ GradientStop { position: 0; color: mouse.pressed ? "lightsteelblue" : "steelblue" }
+ GradientStop { position: 1; color: "black" }
+ }
+
+ Text {
+ anchors.centerIn: parent
+ text: "Qt Quick in a texture"
+ font.pointSize: 40
+ color: "white"
+
+ SequentialAnimation on rotation {
+ PauseAnimation { duration: 2500 }
+ NumberAnimation { from: 0; to: 360; duration: 5000; easing.type: Easing.InOutCubic }
+ loops: Animation.Infinite
+ }
+ }
+
+ ParticleSystem {
+ id: particles
+ anchors.fill: parent
+
+ ImageParticle {
+ id: smoke
+ system: particles
+ anchors.fill: parent
+ groups: ["A", "B"]
+ source: "qrc:///particleresources/glowdot.png"
+ colorVariation: 0
+ color: "#00111111"
+ }
+ ImageParticle {
+ id: flame
+ anchors.fill: parent
+ system: particles
+ groups: ["C", "D"]
+ source: "qrc:///particleresources/glowdot.png"
+ colorVariation: 0.1
+ color: "#00ff400f"
+ }
+
+ Emitter {
+ id: fire
+ system: particles
+ group: "C"
+
+ y: parent.height
+ width: parent.width
+
+ emitRate: 350
+ lifeSpan: 3500
+
+ acceleration: PointDirection { y: -17; xVariation: 3 }
+ velocity: PointDirection {xVariation: 3}
+
+ size: 24
+ sizeVariation: 8
+ endSize: 4
+ }
+
+ TrailEmitter {
+ id: fireSmoke
+ group: "B"
+ system: particles
+ follow: "C"
+ width: root.width
+ height: root.height - 68
+
+ emitRatePerParticle: 1
+ lifeSpan: 2000
+
+ velocity: PointDirection {y:-17*6; yVariation: -17; xVariation: 3}
+ acceleration: PointDirection {xVariation: 3}
+
+ size: 36
+ sizeVariation: 8
+ endSize: 16
+ }
+
+ TrailEmitter {
+ id: fireballFlame
+ anchors.fill: parent
+ system: particles
+ group: "D"
+ follow: "E"
+
+ emitRatePerParticle: 120
+ lifeSpan: 180
+ emitWidth: TrailEmitter.ParticleSize
+ emitHeight: TrailEmitter.ParticleSize
+ emitShape: EllipseShape{}
+
+ size: 16
+ sizeVariation: 4
+ endSize: 4
+ }
+
+ TrailEmitter {
+ id: fireballSmoke
+ anchors.fill: parent
+ system: particles
+ group: "A"
+ follow: "E"
+
+ emitRatePerParticle: 128
+ lifeSpan: 2400
+ emitWidth: TrailEmitter.ParticleSize
+ emitHeight: TrailEmitter.ParticleSize
+ emitShape: EllipseShape{}
+
+ velocity: PointDirection {yVariation: 16; xVariation: 16}
+ acceleration: PointDirection {y: -16}
+
+ size: 24
+ sizeVariation: 8
+ endSize: 8
+ }
+
+ Emitter {
+ id: balls
+ system: particles
+ group: "E"
+
+ y: parent.height
+ width: parent.width
+
+ emitRate: 2
+ lifeSpan: 7000
+
+ velocity: PointDirection {y:-17*4*2; xVariation: 6*6}
+ acceleration: PointDirection {y: 17*2; xVariation: 6*6}
+
+ size: 8
+ sizeVariation: 4
+ }
+
+ Turbulence { //A bit of turbulence makes the smoke look better
+ anchors.fill: parent
+ groups: ["A","B"]
+ strength: 32
+ system: particles
+ }
+ }
+
+ onWidthChanged: particles.reset()
+ onHeightChanged: particles.reset()
+
+ MouseArea {
+ id: mouse
+ anchors.fill: parent
+ }
+}
diff --git a/examples/declarative/rendercontrol/rendercontrol_opengl/doc/rendercontrol_opengl.rst b/examples/declarative/rendercontrol/rendercontrol_opengl/doc/rendercontrol_opengl.rst
new file mode 100644
index 000000000..f47567f52
--- /dev/null
+++ b/examples/declarative/rendercontrol/rendercontrol_opengl/doc/rendercontrol_opengl.rst
@@ -0,0 +1,5 @@
+QQuickRenderControl OpenGL Example
+==================================
+
+The QQuickRenderControl OpenGL Example shows how to render a Qt Quick scene into a
+texture that is then used by a non-Quick based OpenGL renderer.
diff --git a/examples/declarative/rendercontrol/rendercontrol_opengl/main.py b/examples/declarative/rendercontrol/rendercontrol_opengl/main.py
new file mode 100644
index 000000000..84a857838
--- /dev/null
+++ b/examples/declarative/rendercontrol/rendercontrol_opengl/main.py
@@ -0,0 +1,57 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import sys
+from PySide6.QtGui import QGuiApplication
+from PySide6.QtQuick import QQuickWindow, QSGRendererInterface
+
+from window_singlethreaded import WindowSingleThreaded
+
+
+if __name__ == "__main__":
+ app = QGuiApplication(sys.argv)
+ # only functional when Qt Quick is also using OpenGL
+ QQuickWindow.setGraphicsApi(QSGRendererInterface.OpenGLRhi)
+ window = WindowSingleThreaded()
+ window.resize(1024, 768)
+ window.show()
+ ex = app.exec()
+ del window
+ sys.exit(ex)
diff --git a/examples/declarative/rendercontrol/rendercontrol_opengl/rendercontrol_opengl.pyproject b/examples/declarative/rendercontrol/rendercontrol_opengl/rendercontrol_opengl.pyproject
new file mode 100644
index 000000000..b2e80ab23
--- /dev/null
+++ b/examples/declarative/rendercontrol/rendercontrol_opengl/rendercontrol_opengl.pyproject
@@ -0,0 +1,6 @@
+{
+ "files": ["cuberenderer.py",
+ "main.py",
+ "window_singlethreaded.py",
+ "demo.qml"]
+}
diff --git a/examples/declarative/rendercontrol/rendercontrol_opengl/window_singlethreaded.py b/examples/declarative/rendercontrol/rendercontrol_opengl/window_singlethreaded.py
new file mode 100644
index 000000000..08b3236a2
--- /dev/null
+++ b/examples/declarative/rendercontrol/rendercontrol_opengl/window_singlethreaded.py
@@ -0,0 +1,308 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import numpy
+from pathlib import Path
+import sys
+import weakref
+from OpenGL.GL import (GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER,
+ GL_NEAREST, GL_RGBA, GL_TEXTURE_2D, GL_UNSIGNED_BYTE)
+
+from PySide6.QtGui import (QMatrix4x4, QMouseEvent, QOffscreenSurface,
+ QOpenGLContext, QOpenGLFunctions, QScreen, QSurface,
+ QSurfaceFormat, QWindow)
+from PySide6.QtOpenGL import (QOpenGLFramebufferObject, QOpenGLTexture,
+ QOpenGLShaderProgram, QOpenGLVertexArrayObject,
+ QOpenGLBuffer)
+from PySide6.QtQml import QQmlComponent, QQmlEngine
+from PySide6.QtQuick import (QQuickGraphicsDevice,
+ QQuickItem, QQuickRenderControl,
+ QQuickRenderTarget, QQuickWindow)
+from PySide6.QtCore import QCoreApplication, QTimer, QUrl
+from shiboken6 import VoidPtr
+
+from cuberenderer import CubeRenderer
+
+
+class RenderControl(QQuickRenderControl):
+ def __init__(self, window=None):
+ super().__init__()
+ self._window = window
+
+ def renderWindow(self, offset):
+ return self._window() # Dereference the weak reference
+
+
+class WindowSingleThreaded(QWindow):
+
+ def __init__(self):
+ super().__init__()
+ self.m_rootItem = None
+ self.m_device = None
+ self.m_texture_ids = numpy.array([0], dtype=numpy.uint32)
+
+ self.m_quickInitialized = False
+ self.m_quickReady = False
+ self.m_dpr = 0
+ self.m_status_conn_id = None
+ self.setSurfaceType(QSurface.OpenGLSurface)
+
+ format = QSurfaceFormat()
+ # Qt Quick may need a depth and stencil buffer. Always make sure these
+ # are available.
+ format.setDepthBufferSize(16)
+ format.setStencilBufferSize(8)
+ self.setFormat(format)
+
+ self.m_context = QOpenGLContext()
+ self.m_context.setFormat(format)
+ self.m_context.create()
+
+ self.m_offscreenSurface = QOffscreenSurface()
+ # Pass m_context.format(), not format. Format does not specify and
+ # color buffer sizes, while the context, that has just been created,
+ # reports a format that has these values filled in. Pass self to the
+ # offscreen surface to make sure it will be compatible with the
+ # context's configuration.
+ self.m_offscreenSurface.setFormat(self.m_context.format())
+ self.m_offscreenSurface.create()
+
+ self.m_cubeRenderer = CubeRenderer(self.m_offscreenSurface)
+
+ self.m_renderControl = RenderControl(weakref.ref(self))
+
+ # Create a QQuickWindow that is associated with out render control.
+ # Note that this window never gets created or shown, meaning that
+ # will never get an underlying native (platform) window.
+ self.m_quickWindow = QQuickWindow(self.m_renderControl)
+
+ # Create a QML engine.
+ self.m_qmlEngine = QQmlEngine()
+ if not self.m_qmlEngine.incubationController():
+ c = self.m_quickWindow.incubationController()
+ self.m_qmlEngine.setIncubationController(c)
+
+ # When Quick says there is a need to render, we will not render
+ # immediately. Instead, a timer with a small interval is used
+ # to get better performance.
+ self.m_updateTimer = QTimer()
+ self.m_updateTimer.setSingleShot(True)
+ self.m_updateTimer.setInterval(5)
+ self.m_updateTimer.timeout.connect(self.render)
+
+ # Now hook up the signals. For simplicy we don't differentiate between
+ # renderRequested (only render is needed, no sync) and sceneChanged
+ # (polish and sync is needed too).
+ self.m_quickWindow.sceneGraphInitialized.connect(self.createTexture)
+ self.m_quickWindow.sceneGraphInvalidated.connect(self.destroyTexture)
+ self.m_renderControl.renderRequested.connect(self.requestUpdate)
+ self.m_renderControl.sceneChanged.connect(self.requestUpdate)
+
+ # Just recreating the texture on resize is not sufficient, when moving
+ # between screens with different devicePixelRatio the QWindow size may
+ # remain the same but the texture dimension is to change regardless.
+ self.screenChanged.connect(self.handleScreenChange)
+
+ def __del__(self):
+ # Make sure the context is current while doing cleanup. Note that
+ # we use the offscreen surface here because passing 'self' at self
+ # point is not safe: the underlying platform window may already be
+ # destroyed. To avoid all the trouble, use another surface that is
+ # valid for sure.
+ self.m_context.makeCurrent(self.m_offscreenSurface)
+
+ del self.m_qmlComponent
+ del self.m_qmlEngine
+ del self.m_quickWindow
+ del self.m_renderControl
+
+ if self.texture_id():
+ self.m_context.functions().glDeleteTextures(1, self.m_texture_ids)
+
+ self.m_context.doneCurrent()
+
+ def texture_id(self):
+ return self.m_texture_ids[0]
+
+ def set_texture_id(self, texture_id):
+ self.m_texture_ids[0] = texture_id
+
+ def createTexture(self):
+ # The scene graph has been initialized. It is now time to create a
+ # texture and associate it with the QQuickWindow.
+ self.m_dpr = self.devicePixelRatio()
+ self.m_textureSize = self.size() * self.m_dpr
+ f = self.m_context.functions()
+ f.glGenTextures(1, self.m_texture_ids)
+ f.glBindTexture(GL_TEXTURE_2D, self.texture_id())
+
+ f.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
+ f.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
+ null = VoidPtr(0)
+ f.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.m_textureSize.width(),
+ self.m_textureSize.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, null)
+ target = QQuickRenderTarget.fromOpenGLTexture(self.texture_id(),
+ self.m_textureSize)
+ self.m_quickWindow.setRenderTarget(target)
+
+ def destroyTexture(self):
+ self.m_context.functions().glDeleteTextures(1, self.m_texture_ids)
+ self.set_texture_id(0)
+
+ def render(self):
+ if not self.m_context.makeCurrent(self.m_offscreenSurface):
+ return
+
+ # Polish, synchronize and render the next frame (into our texture).
+ # In this example everything happens on the same thread and therefore
+ # all three steps are performed in succession from here. In a threaded
+ # setup the render() call would happen on a separate thread.
+ self.m_renderControl.beginFrame()
+ self.m_renderControl.polishItems()
+ self.m_renderControl.sync()
+ self.m_renderControl.render()
+ self.m_renderControl.endFrame()
+
+ QOpenGLFramebufferObject.bindDefault()
+ self.m_context.functions().glFlush()
+
+ self.m_quickReady = True
+
+ # Get something onto the screen.
+ texture_id = self.texture_id() if self.m_quickReady else 0
+ self.m_cubeRenderer.render(self, self.m_context, texture_id)
+
+ def requestUpdate(self):
+ if not self.m_updateTimer.isActive():
+ self.m_updateTimer.start()
+
+ def run(self):
+ if self.m_status_conn_id:
+ self.m_qmlComponent.statusChanged.disconnect(self.m_status_conn_id)
+ self.m_status_conn_id = None
+
+ if self.m_qmlComponent.isError():
+ for error in self.m_qmlComponent.errors():
+ print(error.url().toString(), error.line(), error.toString())
+ return
+
+ self.m_rootItem = self.m_qmlComponent.create()
+ if self.m_qmlComponent.isError():
+ for error in self.m_qmlComponent.errors():
+ print(error.url().toString(), error.line(), error.toString())
+ return
+
+ if not self.m_rootItem:
+ print("run: Not a QQuickItem")
+ del self.m_rootItem
+
+ # The root item is ready. Associate it with the window.
+ self.m_rootItem.setParentItem(self.m_quickWindow.contentItem())
+
+ # Update item and rendering related geometries.
+ self.updateSizes()
+
+ # Initialize the render control and our OpenGL resources.
+ self.m_context.makeCurrent(self.m_offscreenSurface)
+ self.m_device = QQuickGraphicsDevice.fromOpenGLContext(self.m_context)
+ self.m_quickWindow.setGraphicsDevice(self.m_device)
+ self.m_renderControl.initialize()
+ self.m_quickInitialized = True
+
+ def updateSizes(self):
+ # Behave like SizeRootObjectToView.
+ w = self.width()
+ h = self.height()
+ self.m_rootItem.setWidth(w)
+ self.m_rootItem.setHeight(h)
+ self.m_quickWindow.setGeometry(0, 0, w, h)
+ self.m_cubeRenderer.resize(w, h)
+
+ def startQuick(self, filename):
+ url = QUrl.fromLocalFile(filename)
+ self.m_qmlComponent = QQmlComponent(self.m_qmlEngine, url)
+ if self.m_qmlComponent.isLoading():
+ self.m_status_conn_id = self.m_qmlComponent.statusChanged.connect(self.run)
+ else:
+ self.run()
+
+ def exposeEvent(self, event):
+ if self.isExposed() and not self.m_quickInitialized:
+ texture_id = self.texture_id() if self.m_quickReady else 0
+ self.m_cubeRenderer.render(self, self.m_context, texture_id)
+ qml_file = Path(__file__).parent / "demo.qml"
+ self.startQuick(qml_file)
+
+ def resizeTexture(self):
+ if self.m_rootItem and self.m_context.makeCurrent(self.m_offscreenSurface):
+ self.m_context.functions().glDeleteTextures(1, self.m_texture_ids)
+ self.set_texture_id(0)
+ self.createTexture()
+ self.m_context.doneCurrent()
+ self.updateSizes()
+ self.render()
+
+ def resizeEvent(self, event):
+ # If self is a resize after the scene is up and running, recreate the
+ # texture and the Quick item and scene.
+ if (self.texture_id()
+ and self.m_textureSize != self.size() * self.devicePixelRatio()):
+ self.resizeTexture()
+
+ def handleScreenChange(self):
+ if self.m_dpr != self.devicePixelRatio():
+ self.resizeTexture()
+
+ def mousePressEvent(self, e):
+ # Use the constructor taking position and globalPosition. That puts
+ # position into the event's position and scenePosition, and
+ # globalPosition into the event's globalPosition. This way the
+ # scenePosition in `e` is ignored and is replaced by position.
+ # This is necessary because QQuickWindow thinks of itself as
+ # a top-level window always.
+ mappedEvent = QMouseEvent(e.type(), e.position(), e.globalPosition(),
+ e.button(), e.buttons(), e.modifiers())
+ QCoreApplication.sendEvent(self.m_quickWindow, mappedEvent)
+
+ def mouseReleaseEvent(self, e):
+ mappedEvent = QMouseEvent(e.type(), e.position(), e.globalPosition(),
+ e.button(), e.buttons(), e.modifiers())
+ QCoreApplication.sendEvent(self.m_quickWindow, mappedEvent)
diff --git a/examples/declarative/stringlistmodel/doc/stringlistmodel.png b/examples/declarative/stringlistmodel/doc/stringlistmodel.png
index 6058c5930..eeb9b518a 100644
--- a/examples/declarative/stringlistmodel/doc/stringlistmodel.png
+++ b/examples/declarative/stringlistmodel/doc/stringlistmodel.png
Binary files differ
diff --git a/examples/declarative/textproperties/doc/textproperties.rst b/examples/declarative/textproperties/doc/textproperties.rst
index a67e35f0f..81829dfdc 100644
--- a/examples/declarative/textproperties/doc/textproperties.rst
+++ b/examples/declarative/textproperties/doc/textproperties.rst
@@ -4,6 +4,6 @@ Text Properties Example
A Python application that demonstrates how to load a qml file
using Material design, to change the look of text.
-.. image:: scrolling.png
+.. image:: textproperties.png
:width: 400
:alt: Text Properties Screenshot
diff --git a/examples/installer_test/hello.py b/examples/installer_test/hello.py
index 94d82d4ab..775fe1532 100644
--- a/examples/installer_test/hello.py
+++ b/examples/installer_test/hello.py
@@ -62,8 +62,7 @@ from PySide6.QtWidgets import (QApplication, QLabel, QPushButton,
from PySide6.QtCore import Slot, Qt, QTimer
is_compiled = "__compiled__" in globals() # Nuitka
-uses_embedding = sys.pyside_uses_embedding # PyInstaller
-auto_quit = "Nuitka" if is_compiled else "PyInst" if uses_embedding else False
+auto_quit = "Nuitka" if is_compiled else "PyInst"
class MyWidget(QWidget):
diff --git a/examples/quick/painteditem/main.qml b/examples/quick/painteditem/main.qml
index 182fdc986..3b5999ae0 100644
--- a/examples/quick/painteditem/main.qml
+++ b/examples/quick/painteditem/main.qml
@@ -62,7 +62,7 @@ Item {
anchors.top: parent.top
id: balloonView
delegate: TextBalloon {
- anchors.right: index % 2 == 0 ? undefined : parent.right
+ anchors.right: index % 2 == 0 ? undefined : balloonView.contentItem.right
height: 60
rightAligned: index % 2 == 0 ? false : true
width: balloonWidth
diff --git a/examples/quick/painteditem/painteditem.py b/examples/quick/painteditem/painteditem.py
index ff744063a..04a9116a8 100644
--- a/examples/quick/painteditem/painteditem.py
+++ b/examples/quick/painteditem/painteditem.py
@@ -1,6 +1,6 @@
#############################################################################
##
-## Copyright (C) 2020 The Qt Company Ltd.
+## Copyright (C) 2021 The Qt Company Ltd.
## Contact: http://www.qt.io/licensing/
##
## This file is part of the Qt for Python examples of the Qt Toolkit.
@@ -38,6 +38,7 @@
##
#############################################################################
+from pathlib import Path
import sys
from PySide6.QtGui import QPainter, QBrush, QColor
@@ -60,7 +61,7 @@ class TextBalloon(QQuickPaintedItem):
return self._rightAligned
@rightAligned.setter
- def rightAlignedSet(self, value):
+ def rightAligned(self, value):
self._rightAligned = value
self.rightAlignedChanged.emit()
@@ -97,7 +98,8 @@ if __name__ == "__main__":
view = QQuickView()
view.setResizeMode(QQuickView.SizeRootObjectToView)
qmlRegisterType(TextBalloon, "TextBalloonPlugin", 1, 0, "TextBalloon")
- view.setSource(QUrl.fromLocalFile("main.qml"))
+ qml_file = Path(__file__).parent / "main.qml"
+ view.setSource(QUrl.fromLocalFile(qml_file))
if view.status() == QQuickView.Error:
sys.exit(-1)
diff --git a/examples/quickcontrols2/gallery/gallery.py b/examples/quickcontrols2/gallery/gallery.py
index f4c3f3795..adb6896f8 100644
--- a/examples/quickcontrols2/gallery/gallery.py
+++ b/examples/quickcontrols2/gallery/gallery.py
@@ -60,7 +60,7 @@ import sys
import platform
from PySide6.QtGui import QGuiApplication, QIcon
-from PySide6.QtCore import QSettings
+from PySide6.QtCore import QSettings, QUrl
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtQuickControls2 import QQuickStyle
@@ -88,7 +88,7 @@ if __name__ == "__main__":
built_in_styles.append("Windows")
engine.setInitialProperties({"builtInStyles": built_in_styles})
- engine.load(":/gallery.qml")
+ engine.load(QUrl.fromLocalFile(":/gallery.qml"))
rootObjects = engine.rootObjects()
if not rootObjects:
sys.exit(-1)
diff --git a/examples/scriptableapplication/pythonutils.cpp b/examples/scriptableapplication/pythonutils.cpp
index 18ac35112..c23bc46e9 100644
--- a/examples/scriptableapplication/pythonutils.cpp
+++ b/examples/scriptableapplication/pythonutils.cpp
@@ -135,7 +135,7 @@ bool bindAppObject(const QString &moduleName, const QString &name,
return false;
PyTypeObject *typeObject = SbkAppLibTypes[index];
- PyObject *po = Shiboken::Conversions::pointerToPython(reinterpret_cast<SbkObjectType *>(typeObject), o);
+ PyObject *po = Shiboken::Conversions::pointerToPython(typeObject, o);
if (!po) {
qWarning() << __FUNCTION__ << "Failed to create wrapper for" << o;
return false;
diff --git a/examples/webenginewidgets/markdowneditor/document.py b/examples/webenginewidgets/markdowneditor/document.py
new file mode 100644
index 000000000..348323704
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/document.py
@@ -0,0 +1,61 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+
+from PySide6.QtCore import QObject, Property, Signal
+
+
+class Document(QObject):
+
+ textChanged = Signal(str)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._text = ''
+
+ def text(self):
+ return self._text
+
+ def setText(self, t):
+ if t != self._text:
+ self._text = t
+ self.textChanged.emit(t)
+
+ text = Property(str, text, setText, notify=textChanged)
diff --git a/examples/webenginewidgets/markdowneditor/main.py b/examples/webenginewidgets/markdowneditor/main.py
new file mode 100644
index 000000000..08d07a036
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/main.py
@@ -0,0 +1,57 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide6 Markdown Editor Example"""
+
+import sys
+
+from PySide6.QtCore import QCoreApplication
+from PySide6.QtWidgets import QApplication
+
+from mainwindow import MainWindow
+import rc_markdowneditor
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ QCoreApplication.setOrganizationName("QtExamples")
+ window = MainWindow()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/webenginewidgets/markdowneditor/mainwindow.py b/examples/webenginewidgets/markdowneditor/mainwindow.py
new file mode 100644
index 000000000..4f19f4323
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/mainwindow.py
@@ -0,0 +1,173 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+
+from PySide6.QtCore import QDir, QFile, QIODevice, QUrl, Qt, Slot
+from PySide6.QtGui import QFontDatabase
+from PySide6.QtWebChannel import QWebChannel
+from PySide6.QtWidgets import QDialog, QFileDialog, QMainWindow, QMessageBox
+
+from ui_mainwindow import Ui_MainWindow
+from document import Document
+from previewpage import PreviewPage
+
+
+class MainWindow(QMainWindow):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.m_file_path = ''
+ self.m_content = Document()
+ self._ui = Ui_MainWindow()
+ self._ui.setupUi(self)
+ font = QFontDatabase.systemFont(QFontDatabase.FixedFont)
+ self._ui.editor.setFont(font)
+ self._ui.preview.setContextMenuPolicy(Qt.NoContextMenu)
+ self._page = PreviewPage(self)
+ self._ui.preview.setPage(self._page)
+
+ self._ui.editor.textChanged.connect(self.plainTextEditChanged)
+
+ self._channel = QWebChannel(self)
+ self._channel.registerObject("content", self.m_content)
+ self._page.setWebChannel(self._channel)
+
+ self._ui.preview.setUrl(QUrl("qrc:/index.html"))
+
+ self._ui.actionNew.triggered.connect(self.onFileNew)
+ self._ui.actionOpen.triggered.connect(self.onFileOpen)
+ self._ui.actionSave.triggered.connect(self.onFileSave)
+ self._ui.actionSaveAs.triggered.connect(self.onFileSaveAs)
+ self._ui.actionExit.triggered.connect(self.close)
+
+ self._ui.editor.document().modificationChanged.connect(self._ui.actionSave.setEnabled)
+
+ defaultTextFile = QFile(":/default.md")
+ defaultTextFile.open(QIODevice.ReadOnly)
+ data = defaultTextFile.readAll()
+ self._ui.editor.setPlainText(data.data().decode('utf8'))
+
+ @Slot(str)
+ def plainTextEditChanged(self):
+ self.m_content.setText(self._ui.editor.toPlainText())
+
+ @Slot(str)
+ def openFile(self, path):
+ f = QFile(path)
+ name = QDir.toNativeSeparators(path)
+ if not f.open(QIODevice.ReadOnly):
+ error = f.errorString()
+ QMessageBox.warning(self, self.windowTitle(),
+ f"Could not open file {name}: {error}")
+ return
+ self.m_file_path = path
+ data = f.readAll()
+ self._ui.editor.setPlainText(data.data().decode('utf8'))
+ self.statusBar().showMessage(f"Opened {name}")
+
+ def isModified(self):
+ return self._ui.editor.document().isModified()
+
+ @Slot()
+ def onFileNew(self):
+ if self.isModified():
+ m = "You have unsaved changes. Do you want to create a new document anyway?"
+ button = QMessageBox.question(self, self.windowTitle(), m)
+ if button != QMessageBox.Yes:
+ return
+
+ self.m_file_path = ''
+ self._ui.editor.setPlainText(tr("## New document"))
+ self._ui.editor.document().setModified(False)
+
+ @Slot()
+ def onFileOpen(self):
+ if self.isModified():
+ m = "You have unsaved changes. Do you want to open a new document anyway?"
+ button = QMessageBox.question(self, self.windowTitle(), m)
+ if button != QMessageBox.Yes:
+ return
+ dialog = QFileDialog(self)
+ dialog.setWindowTitle("Open MarkDown File")
+ dialog.setMimeTypeFilters(["text/markdown"])
+ dialog.setAcceptMode(QFileDialog.AcceptOpen)
+ if dialog.exec() == QDialog.Accepted:
+ self.openFile(dialog.selectedFiles()[0])
+
+ @Slot()
+ def onFileSave(self):
+ if not self.m_file_path:
+ self.onFileSaveAs()
+ if not self.m_file_path:
+ return
+
+ f = QFile(self.m_file_path)
+ name = QDir.toNativeSeparators(self.m_file_path)
+ if not f.open(QIODevice.WriteOnly | QIODevice.Text):
+ error = f.errorString()
+ QMessageBox.warning(self, windowTitle(),
+ f"Could not write to file {name}: {error}")
+ return
+ text = self._ui.editor.toPlainText()
+ f.write(bytes(text, encoding='utf8'))
+ f.close()
+ self.statusBar().showMessage(f"Wrote {name}")
+
+ @Slot()
+ def onFileSaveAs(self):
+ dialog = QFileDialog(self)
+ dialog.setWindowTitle("Open MarkDown File")
+ dialog.setMimeTypeFilters(["text/markdown"])
+ dialog.setAcceptMode(QFileDialog.AcceptSave)
+ dialog.setDefaultSuffix("md")
+ if dialog.exec() != QDialog.Accepted:
+ return
+ path = dialog.selectedFiles()[0]
+ self.m_file_path = path
+ self.onFileSave()
+
+ def closeEvent(self, event):
+ if self.isModified():
+ m = "You have unsaved changes. Do you want to exit anyway?"
+ button = QMessageBox.question(self, self.windowTitle(), m)
+ if button != QMessageBox.Yes:
+ event.ignore()
+ else:
+ event.accept()
diff --git a/examples/webenginewidgets/markdowneditor/mainwindow.ui b/examples/webenginewidgets/markdowneditor/mainwindow.ui
new file mode 100644
index 000000000..f4e29ad95
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/mainwindow.ui
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>600</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MarkDown Editor</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QSplitter" name="splitter">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <widget class="QPlainTextEdit" name="editor"/>
+ <widget class="QWebEngineView" name="preview" native="true"/>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>26</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menu_File">
+ <property name="title">
+ <string>&amp;File</string>
+ </property>
+ <addaction name="actionNew"/>
+ <addaction name="actionOpen"/>
+ <addaction name="actionSave"/>
+ <addaction name="actionSaveAs"/>
+ <addaction name="separator"/>
+ <addaction name="actionExit"/>
+ </widget>
+ <addaction name="menu_File"/>
+ </widget>
+ <widget class="QStatusBar" name="statusbar"/>
+ <action name="actionOpen">
+ <property name="text">
+ <string>&amp;Open...</string>
+ </property>
+ <property name="toolTip">
+ <string>Open document</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+O</string>
+ </property>
+ </action>
+ <action name="actionSave">
+ <property name="text">
+ <string>&amp;Save</string>
+ </property>
+ <property name="toolTip">
+ <string>Save current document</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+S</string>
+ </property>
+ </action>
+ <action name="actionExit">
+ <property name="text">
+ <string>E&amp;xit</string>
+ </property>
+ <property name="toolTip">
+ <string>Exit editor</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Q</string>
+ </property>
+ </action>
+ <action name="actionSaveAs">
+ <property name="text">
+ <string>Save &amp;As...</string>
+ </property>
+ <property name="toolTip">
+ <string>Save document under different name</string>
+ </property>
+ </action>
+ <action name="actionNew">
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ <property name="toolTip">
+ <string>Create new document</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+N</string>
+ </property>
+ </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/examples/webenginewidgets/markdowneditor/markdowneditor.pyproject b/examples/webenginewidgets/markdowneditor/markdowneditor.pyproject
new file mode 100644
index 000000000..b10b12512
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/markdowneditor.pyproject
@@ -0,0 +1,9 @@
+{
+ "files": ["document.py",
+ "main.py",
+ "mainwindow.py",
+ "mainwindow.ui",
+ "previewpage.py",
+ "resources/markdowneditor.qrc",
+ "ui_mainwindow.py"]
+}
diff --git a/examples/webenginewidgets/markdowneditor/previewpage.py b/examples/webenginewidgets/markdowneditor/previewpage.py
new file mode 100644
index 000000000..e28af5b1a
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/previewpage.py
@@ -0,0 +1,55 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+from PySide6.QtGui import QDesktopServices
+from PySide6.QtWebEngineCore import QWebEnginePage
+
+
+class PreviewPage(QWebEnginePage):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ def acceptNavigationRequest(self, url, type, isMainFrame):
+ # Only allow qrc:/index.html.
+ if url.scheme() == "qrc":
+ return True
+ QDesktopServices.openUrl(url)
+ return False
diff --git a/examples/webenginewidgets/markdowneditor/rc_markdowneditor.py b/examples/webenginewidgets/markdowneditor/rc_markdowneditor.py
new file mode 100644
index 000000000..aa4f38a45
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/rc_markdowneditor.py
@@ -0,0 +1,852 @@
+# Resource object code (Python 3)
+# Created by: object code
+# Created by: The Resource Compiler for Qt version 6.2.0
+# WARNING! All changes made in this file will be lost!
+
+from PySide6 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x01\xdd\
+#\
+# WebEngine Mark\
+down Editor Exam\
+ple\x0a\x0aThis exampl\
+e uses [QWebEngi\
+neView](http://d\
+oc.qt.io/qt-5/qw\
+ebengineview.htm\
+l)\x0ato preview te\
+xt written using\
+ the [Markdown](\
+https://en.wikip\
+edia.org/wiki/Ma\
+rkdown)\x0asyntax.\x0a\
+\x0a### Acknowledgm\
+ents\x0a\x0aThe conver\
+sion from Markdo\
+wn to HTML is do\
+ne with the help\
+ of the\x0a[marked \
+JavaScript libra\
+ry](https://gith\
+ub.com/chjj/mark\
+ed) by _Christop\
+her Jeffrey_.\x0aTh\
+e [style sheet](\
+https://kevinbur\
+ke.bitbucket.io/\
+markdowncss/)\x0awa\
+s created by _Ke\
+vin Burke_.\x0a\
+\x00\x00\x02\xb2\
+<\
+!doctype html>\x0a<\
+html lang=\x22en\x22>\x0a\
+<meta charset=\x22u\
+tf-8\x22>\x0a<head>\x0a \
+<link rel=\x22style\
+sheet\x22 type=\x22tex\
+t/css\x22 href=\x223rd\
+party/markdown.c\
+ss\x22>\x0a <script s\
+rc=\x223rdparty/mar\
+ked.js\x22></script\
+>\x0a <script src=\
+\x22qrc:/qtwebchann\
+el/qwebchannel.j\
+s\x22></script>\x0a</h\
+ead>\x0a<body>\x0a <d\
+iv id=\x22placehold\
+er\x22></div>\x0a <sc\
+ript>\x0a 'use str\
+ict';\x0a\x0a var pla\
+ceholder = docum\
+ent.getElementBy\
+Id('placeholder'\
+);\x0a\x0a var update\
+Text = function(\
+text) {\x0a pl\
+aceholder.innerH\
+TML = marked(tex\
+t);\x0a }\x0a\x0a new Q\
+WebChannel(qt.we\
+bChannelTranspor\
+t,\x0a function(\
+channel) {\x0a \
+ var content = c\
+hannel.objects.c\
+ontent;\x0a up\
+dateText(content\
+.text);\x0a co\
+ntent.textChange\
+d.connect(update\
+Text);\x0a }\x0a )\
+;\x0a </script>\x0a</\
+body>\x0a</html>\x0a\x0a\x0a\
+\x0a\
+\x00\x00\x06V\
+\x00\
+\x00\x17ex\x9c\xb5XKs\xdb6\x10\xbe\xfbW\xec\
+\xd8\x93\xc6\xce\x90\x0e%Q\xb2DM\x0f\x99\x1c\xda\x1c\
+\xda\xe9!\xb7\xc6\x07\x90\x04E\x8c)\x82\x05!\xcbN\
+\xc6\xff\xbd\x8b\x07)\xf0\xa1D\x89\x12\xd9z\x10\x0b\xec\
+.\xbe\xdd\xfd\x16d\xcc\xd3\xe7/\x17\x80\xaf-\x11\x1b\
+VF\x10\x00\xd9I\xbe\xd6c\x19/\xa5\x9f\x91-+\
+\x9e#\xf8\x83r\x9cA<\xf8\x87\x14D\xb2\x92{P\
+S\xc1235\xe1\x05\x17\x11\x5c\x85\xfae\xc6\x0aV\
+R?\xa7l\x93\xcb\x08&kk\xe6\xc9\xdf\xb3T\xe6\
+\x11\xac\x16A\xf5dF+\x92\xa6\xac\xdcD0\xd3C\
+/\x17\xf9\xc4\x83|\x8a\xef\x19\xbeC\xf8\xd2\xb11\xd1\
+/\xc7\xc5\xbd\xb5\x11\x06\xc1p1\xbe\xe7\x1eT\xe0n\
+\xd3\x8f\xb9\x94|\x1b\xc14\x1c\xb8`U\xd8\xf9Z\x7f\
+\xcd>S\xd4\xbe\xb4\xbeM\x87\xb2\xd9\xa2\xd1\xf3\xf6\x0d\
+|\xcc)\x18\x03\xd6\x1c\xb0\x1a\xea-)\x8a[\xf8 \
+_\xd7\x90\xd2\x9amJ\x9a\x82\xe4\x10S\xd8\xd5\xf8s\
+\xcfd\x0e\x1bA\x9eaK%\x01I\x9f\xa4\xd6\x07o\
+pJ\xc1\xf7@\xa0\xe2\xb5\x04\xc9dAo\xe1\xcd\xdb\
+N\xd4\xd4>0t\x0b\xeb\xe1l\xe8\xa1\xd9)\xca\xc2\
+\x11\xd9\xc4\xca\xe6C\xd9\xc4\xee\x9a\xf4\x82\x10\x04\xabU\
+\x96\xad\xbb\xb93\x84R]?R!YB\x0a\x9f\x14\
+\xb8\xed\x08bRS\x95\x1bZm\x94s\x94[\xe5j\
+\xd7~J\x13.0\xc38N-\xb9\x9a\xe6\xda\xcd\xb2\
+\xc5\xc2\x84\x99D\x8f\xacf\x12\xb1\xebxV\xedDU\
+h\xdd\xbb\xc2\x03^Xi\xdf)\xc7\xe7\x97\x8b\x82\xd9\
+Y\x9d\x94m C\xa9R\xa5\xbf\xbaiT\xd0\xcc\x99\
+Wy\xd01\xe9\xa2\xd8\xe6\xc7\x88\x85^]\xccC[\
+\x04\x95\xa0\x03\xe71\xcc\xa3\x8b\x96A[L\xfb\x1cA\
+\xf1\xeb\x8a$h\x18u\xf8{A*\xa5/\xe1)u\
+]k*\xfb=/k^\x90\xda\x83\xbfxI\x12,\
+\xecweJ\x0a\xaa.\xf1b\x8b\x9fZ\xdbXU\xdf\
+\xce\xd7\x83\xbd\xcel\xc6\xd4\xac\xb5\x97\xb2\xba*\x08\xda\
+\x8a\x0b\x9e<\xd8%\x05'\xa8B(M\xd6s\xb3\x97\
+\xd9\xca\x02\xa0'\xff\xb7\xe3\xb2Q\x13s\x91Ra`\
+\xbf\x9d\xd3-\xa0\xdf,\x85+Ji?\xf5`J\xb7\
+\xebA\xac\x82\x01p\xe1\xddb`\x0c\x12&\xe9 \x88\
+\x93p,\x86\xd3\x16w\x93\x7fWq\xa6\xfez\x1a\x95\
+\xc2(\xa6\x19oC\x9a\xa0^Z\xe2\xfe_\x7f\x9a\x06\
+\x93\x10>\x05\xc1\xbb\xe0\xb5Z\xe6\xae\xabzU\xb7X\
+,\x86;X4\xa4\xd9\x94Q7\x91\xda\xc2\xb2\xe5\xa7\
+\x80\xe8\xd5\x80\xe6|\xfc\x0a\xba\xb5\xb6Z\xad\xb4C\xc8\
+i\xefU\xee\x18\x22\x929\xd2\x99\x82@\xd1Z\xc2\xab\
+g\x1dA\xf8\x88\x0c&\xb1\x92?\x94\x89\xa6\xa7\x8bx\
+\x87\x14Xz\x17\xac\xacv\xd2\xbb\xc0\x9a\xa7\x09~+\
+W\x88\xa0\x86O\xdc\xb4\x09\x82W\xca|\x87L\x8eS\
+\x07\x12c_\xb8eij*\xdf\x9a\x06mZ\x1b\xea\
+dm\xc9\x05\xb2\xb1\xd6\xa1\xc8\x07\x13q\x1f\x81\x22\x93\
+\xd8]\x1eE\xfe\x96\x7f\xf63\x9e\xecj\x9f\x95%\x15\
+V\xe1P\xa0M\x98\xe4\xb4\x8ew\xdbI\x07\x8a\x7f\xe5\
+sE\x7f\xbf4c\x97\xf7\xddQAk*\xfb\x83\xf5\
+.\xde2\x1c\xd5f\x92\x9d\xa85\xcfq\x86\x19$\x94\
+1l\x80\xf1\x03\xc3\x00W\x15%\x82\x94\xaa\xf0\x8dz\
+e\xdc\xd1\x94\xe44y\x88\xf9\xd3\xbd\xdd\x89\x19\x15$\
+e\xfc\x88\xf2\x17\x15|\x05\x92P\xc5\x9c\xd2\x8c\xec\x0a\
+\x09I.\xf8\x96\xc2o\x901\x81I\xfd\x84'\x01\x89\
+G\x82M\xad\x02o0*\xb9\xbc\xb6\xee\xb3-\xd9\xd0\
+\xcb\xfb\x1b\x0f:\xb1o\xbcF\x7fT\x0ah\xb4lU\
+\xa81\xbd1\x85\xf3W\xe4GE\x98\xb4\x1d\x00\x11\x96\
+$\xb7\x00\x8e\xa1\xa5\x1c\xcb\x18-\xd2\xf5/wl\xcc\
+/\xcc(k\xd3\x8c8=\xf0\xa8\xcb\xa65bw\x22\
+X\x96'TY\xc3\xf6\x97\x7f\xd2\xe2\x91\xaa\xc2\x81\xbf\
+\xe9\x8e^z\xd0\x0e \xf1\x0bF\xb0\x85\xd5\xa4\xac\xfd\
+\xf6t7\xe0\xf6\xde\xb1\xebPNG\xaa\xacw\xe8j\
+\x8e\x14g%\xe6@k\xd0S\xa9\x10\xe8\xd6QE\xea\
+z\x8fEz\x7f\x80\xa7\x01L\xdbh\x9b\x14+\xf5F\
+\xda^e\xf9t:\xb1|\xda\x16w\xe8\xa0\xf1\xfd\x00\
+\x19\x1c\x00\xfa\xd7\x0d\xfd.\x03\xf5\xb7v\xa8\x05\xcfi\
+M\xcbK\x92\xa4\x9b\xab\xba3*\xc4v5\xb6\xd0\xca\
+M\xd31\xd1\xd8\xe8K\x93>n\x102VP\x13\x83\
+\xf6\xd4rgTt\x8f2wFC'\xf1\x1a\xa1\xb9\
+\xa50\x9dd#\xe83p\xa4e\xc4:\xa19/\xd0\
+\x0d\xcd\x1b\x86U\x9dQ\x13x\x0b\xc6\xa1\xad\x1e\x8aE\
+{y\xc2\x8a\x93\xd3b\xb4z\x1ak\x12\x0b\x0f\xcf\x9b\
+\xfa\x5cj\xd0\xd3\x08\x10\x01\xc1\xed\x14\x0fO\xba\xe6s\
+\x92b\x8bt\xc6\xdb0\xfc\xf8\xf23\x0c\xbbL\xa6g\
+\xa8\xe4F\xb2\xc6^\xafr\x09\xa3\x0eb\x13\x93\xeb\xc0\
+\x03\xfb\x7f;\xb9\xe9\x12\xdcw-\xfb\xde\x15\xc3\x8a\x8d\
+t[\xedd`\x1b\xa0F\xd6\x84\xc7\x5c\xeb aB\
+\xa9\xbd\x1f\xee\x18l~\xdbd\xd0\xb6\x97xO8Y\
+,=\x98\xce\x16\xca\x81\xe5\xcd\x8fc\xe4\xa9\xd3\x12,\
+\x1bY_\xf5\xe2GA<I\xefOWi*\xd3\x1c\
+\x19t-\x9a\x9f_gE\x97\x05a\xe2R\xe1Om\
+5\xa3\x94y\x84\xf6\xc2\xe3\xb4\x17\x8e\xd2^\xd8W7\
+\x0el`\xa0\x9b\xce\xe7\x08[\xfb\x81U\xa6\xc1U3\
+\xa6#\xd0\x07\xf3og\xc1Y\x9a\x7f\x8dR\x92<l\
+\x04\xdf\x95\xa9\x7f\xb8\xd7_\x84I\xda\x13\x0a\x8ag\x11\
+u\xff\xa6\xbf\xfd\xa7\x9eX\x1f\xfa\x22\xf0\x1fr\xb9-\
+\xfc\x8d\x02\x1c\x0fA\xd7\x86\xa0<}\x13\x02\x92W\xf6\
+\x97i\xe2\x1edx\xae\xbc\xbe\x0a\xc2U\x92\xc6\xea\xbc\
+\xc8\xaf\xad\xf1\x9b\xbeo\x8d~\x05\xaeQz0\xa2\xf5\
+Z-^\xe3\xfeQ\x05\xf5y\xebm\xea\x9c\xbaC\x8d\
+\xa9_\xa3\xe0:x\xd5Z\xb9\xe9\x08\xd4\xad\xd0\xc1\xee\
+7\x0c\x9f\xe5<?k\xf9\xe9k\x0fOot\x99\xeb\
+\xdb\xd1&s\x03\xf0\x9d\xa4u\x12r\xdad\xf9\xe0\xf0\
+\x13\x04a\xbc\x22N=\x1bt\x9d\x84\x9de\xcb\x89[\
+\xd9n\x0fER\xac\x9bNI\x8ab\xb4C\x8f\xcc\xf9\
+\x86\xb8\xdbp\xec\xe6\xdd\xef\xc6\xa5\x91\xce\xd4\xe1\xebS\
+\x8644\xed\x8d\xea\xe1\x11Z\x0fg'd\x15o}\
+G\xbc\xe7\x86\xf7\x8e<ok\x15\x93D\xb2G:\xbc\
+[\xebq\x8e\xea;wc\xbdg~\x16?\x9e\xa7\xf6\
+gk<\xfeX@\xe3\xd3}\xbe\xe8<\x0bx\xb9\xf8\
+\x1f\xcb!7\x81\
+\x00\x00&L\
+\x00\
+\x00\x91Dx\x9c\xed=ks\xdbF\x92\xdf\xf5+F\
+r\xd6\x00\xf8\x94\xe4\xacoC=\x98\xac\xb3\xb7\x9b+\
+g\xedJ\xbcUwGP2HB$l\x10\xe0\x02\
+\xa0%\x9d \xff\xf6\xeb\xeey\xe3AIvruU\
+w\xde\x8dM\xce\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4t\x0f\x87\
+\x9d\xce\x1e\xeb\xb0u\x90}\x0c\x17\xac\xcf\x02\xfa\xb8H\
+\xaf\x13\xb6\x09\xb2<\xcc\xb0\xf6U\xba\xb9\xcd\xa2\xe5\xaa\
+`\xee\xdcc\xc7\x87GG}\xf8\xeb\xdb\x1e{\xb5\xca\
+\xa2\xbcH7\xab0c\xff\x16^]e\xe1\xed\x80\xb9\
+?\xff\xf4\x8e\xbd\x8e\xe6a\x92\x87\x0b\x0f\xdb\xaf\x8ab\
+\x93\x8f\x86\xc3eT\xac\xb6\xb3\xc1<]\x0fy\x87\x1f\
+r\xf1\x01\xa0\x86{{'\xee\xd56\x99\x17Q\x9a\xb8\
+Y\x9a\x16\x1e\xbb\xdbs\xb6y\xc8\xf2\x22\x8b\xe6\x85s\
+\xb2\xb77\xe4\xe4\xfe9N\xe7\x1f\xfb\xaf\xc3Oa\xcc\
+\xfe\x9a\x05k@\xc21|\x0a26\xc3Jv\x06\x8d\
+\x19K\xc2\xeb8J\xc2\x11\x1b^\xf8Iw\xd8\x83\xa2\
+y\xba\xa0\xef.\xbb\xfb\xf6~\x02\xc5\xd3\xae\x9ft<\
+^y\x15&\xf30\x1f\xb1$M7\xf8}\x95!(\
+\xbb;\xec\xbd\xb8w\xdd\xf1\xa8\xcf:\xde\xdd\x8b\xde}\
+\x09\x9f/\x8d\xcf~G|\xf1\xf0K\xd2-\xbf\xf1\x08\
+\xdf*\x0c\x16Q\xb2$$\x1d\xf7\xd9\xddQ\xef\xe5\xbd\
+\x07\x9fx\xbfc\xfc8\x1e=\xebB\xe3\xb1\xdd0\xd9\
+\x14\xc1,\x0e5%4\xaa\x7fn\xd3B\x12\x8f$\x9d\
+\xb3\xb1\x0b\xd3\x14,\xb3`\xb3*\x09i\x87S\x00x\
+\xc4\x90b\x98!\xde\x04\xaaf\xdb8\xf6\xd8\xc4\xcf\xfd\
+_\xa1{\x80\x5ce\xe5\x22\xbc*\xfd\xe4\xee\xb8w\xef\
+\x8e\xf7\x194\xdf\xf7\x8f\x10\x8ey\xc0\x97\xd2\xcf;r\
+,\xc5:\x1e1Grc<r\xd8p\xc8\xd2\x0d\xce\
+W\x10\xb3(Y\x84I\x11\xe07\x00f\xac\xcb\x9cS\
+7\x9fg\xd1\xa6(7YX\xe6\xc5m\x1cz\x13\xdf\
+\xcf\xcf\xa7\xf8\xb7\x0f$t\x90\x84\xd3\xa1\xef\x1f\x9d\x03\
+\xf1H\xbd\xcfy@\xa8\xdd#Ob*Af\xd6\x80\
+^@\xb9\x16\xd8\xb1\x06;\xf5\xfd\xb1F\x0e_\xce\x01\
+\xb2\xc3\xc1^\x18`\xfb\x93\x1f\xfa\xffi\x90a\x80}\
+k\x82\xf9\xfe\xe4\xd5\x8f?\xbc\xfb\x01\xfe5\xd1N\xe1\
+\xffF\x93?\x1aM\x86c\xb7\x08\x968\x09\xac[\x02\
+H9\x1c\x9f{\xd6x}\xcelE\xfeK\xa350\
+\xbf\xc62w\x12\xf4\xff\x0bi\xbd\xee\xf3\xd9\x0d\x0aX\
+\x0f\xb3m\x11z\x9d1H\xfd\xf8\xdc\x1d\x9f\xf9\xfe\x0a\
+y\xb7\xbb\xa7\x7f\xf1`\xba\xc2\x84\x01\x81\x06\xc1M}\
+\x9a]\x02\xc6\xceS\xba\x98\xc7i\x0e2o\xf6\xe29\
+(@ hz5\xf9\x137\x0efa\xec\xf9\xd3\x11\
+\xeb\xf8\x09\x8c\xe4t\x8c\xeb\x02\xc4\xa3\xeb\x9d#n\xe2\
+!\xd5\x94\x08\x81\xf2[D\x05P\xe7\x8di\xdd\x18\xcb\
+\xa5\xb2Xbc\xdd\x89\xb5\xe6!\x02\xf7\xac\xec{H\
+o\xb5\xbdZDF\x0b\x82\x00\xe6\xc0\x12\x11\xe8J\x89\
+\xb7\x14\xcb\x0f\xe4m\x88\x94\x1a3\x9e\x94>\xce8N\
+\xe5\xa8\xca\xd6r\xbf\xdf\xf7<AOGP\x1e\xde\xd0\
+\xf2\xe4\xa5\xc3\xbd{\xd0r\xb4\xd6\x07\x97\xc4\x1fPd\
+8C0\x07\xfe\x94\x96\xb6?\x81\xffM\xa7\xb8\xda\xf1\
+_X\xe5'\xb2\x01q\x877\x18\x1d\x10\xec\xc1\x18\xe0\
+\x0e@Z\xbd\xceA\xe9L.\x1cZ=80\xfe\x19\
+\xc8\x00\x06;\xa5\x0fcv=\x98k\xcfS\xe8`\xba\
+\x00W\xb8\x88\x0aW\x15\xa0\xa8\x0e\xb2p\x13\x07\xf3\xd0\
+u\x88@\xa7\xc7Lzm\x08\xa2HC\xf0\xe9C\x88\
+eX\xfc\x12.\xc3\x1b\xd7S\xe3E\x9d\x13\x16\x82\xfc\
+I\xa7\xdb\x9f\x96\xfe\xa2\xeb\x0f4EQ\x11\xae\xb1\xde\
+\xd2e\x17jH\x86\xe6\x12\xaa\xb0Smj\x8c\x06K\
+z\xccY\xae\x1d\x8b\xe4!\x22\x18.%\xc9\x9c\xa86\
+\x92Q\xb7\xdaX\xb1\xe4\x91\xf8\x14\x93V\x19p\xc8A\
+\x95F\xab\xecH\xc8~\xeb^co6\x5c\x8a={\
+\x14\x0e\xcc\x95\x81\xd4\x81E\xa8\xe6p\x90\xa7\xdbl\x1e\
+\xf2u\xd96\xb2K\x10i\x18\x99\x13,\x16Y\x98\xe7\
+e\x90\x15\xd1\x1c$8\xc8\xa3EX\xce\x82\x9c\xffu\
+\x95&E\xa9\xb7\xa6r\x96.n\xcby@{\x82\xb3\
+'T7\xe8\xed0\x03\x0d\x1e\xe3\x7f\xcb,\xddn\xca\
+\xc5\x02\xb6\x9d\x22\x88\xe2\xbc\x5cDA\x9c.\xe1\x1f\xd8\
+\x89\xa2O\xe5\x22.\x17Ey\x15\x85\xf1\x22\x0f\xf1\xc3\
+\xb2\x82\x0eJ\xb6\xb0\xa0\xae\xc0@\x00\xacWi\xb6.\
+\xaf\xc0\x04\x08\xf9\xdf\xd8f59\xea\xbf\x9c\xd2\xa2\xa5\
+\xbf\x00\x0c\xd70l_eD@\x12U\x0c\x83N\x16\
+e\x1c\xc1\xff\x93\x8f\xe5:\x88\x92\x12v\x99-\xfd\x85\
+\xf2\x01\x1f\x8a\xa0L\x82Oe\x92r\xf4%\x8c\x02\xb6\
+<>\x8a\xd4\x22lS\xa2\x16Y\x97yH&L\xc9\
+\xd9\x5c\xe6[4OnKRQeA\x1c*\x16e\
+\x81\x03(\x8b\x15\xfc\x1f\xe9\xa4\x95Q\x16\x99DVd\
+\xc1\xfcc\xb9\x8d\x1d\xb5\xb8\xc5\x0e\x88\xf2\x7f\x0az\x04\
+\x84\xbdO;KN\xaa\xb8\xdf?W\xb2\x8e#\xb5\xa5\
+\x12K@\x1a\xa2\x8a\x90\x08\x94z}\x8a\x82\xca\x1a\x0e\
+\x96\xc6\x0a\x06Mg\xd5\xaa\xcd\x08`\x86\xac\x8b\x1b\x07\
+l\xad\xa3K\xd8=\xae\x07\xa3>-M\xd69c\x9d\
+\x03TD\xb0(\x0fJ\xfa*\x95\x91\xc3\xbf\xa2\xe2?\
+p\xceN\xcf\xdf\x83N\x1a\x0f\xdb\xc4R\xe9i{|\
+\xaa\xb8aa\x09\x0ed\x95*\xae\xc8u=\xff^\xd1\
+oU\xa8\xb8\x11\xac\xc6 \xdc\x09\xd1zf\xf3 a\
+\xb3\x10L#\x10\xd5l\xbb)\xc0\xc4\x9e\xdd\xb2\xe2v\
+\x13\xe2\xb6O\x16\x15o\x97\xb7\xe9D\xb5\xb4\xec\x01\xeb\
+r\x9b\x14\xc5\x08E\x90\xcd\x1a\xab\x0baL\xff\x1d\x96\
+\x10\xd8odS\xdb\xd64\xc7\x90\xf0\xfa3\xb6\x0e\xb3\
+e\xe8\xde\xdd\x0b\xd4\x06\x8a\xbf\xfe\xeb\xcf\xed\xed\x97W\
+\xebzc\x81\xb5GV\xba\xb4\xba\xc9H~Oz\xee\
+3\xe9\xb7\x09\xf3\x07h\xed\xfd\xda\xc5-\x1f4\xbc\x14\
+w\x8f\xcc\x02\xffh\xe7>\xbe\xc3\x02\xef\x1a\x16\xf8\xb3\
+\x8e\x89e\xef^s\x1f(\x7f\xa2\xc4\xc1\xaaD\xb5\x8b\
+\xff\x08\xdbGc\xe2\xa3\x14\xdaW7\x01\x85\xcf5\xf5\
+\xb1\xe3\xd1\xd2\xb7[\xe2\x86\xd2\xde\xe6\x85l\xd3:\xbb\
+85]\xf6\x0e\x95O\xde>G\x05\xaf\xafO\x13\x10\
+\xce\xe7H\x1dH\x88\x8f\x93\x0b\xb0t\xd8t\xd0\xf1\xcb\
+A\x87\x9bV\x93\xfeh\x0a\x07\x19\xbf\x9c\xf4K6\x92\
+\xe7\x10<4\x0d`u\x9fspu6\xe9\xd0\xe1\xc2\
+\xb6\xde\x10\xb3_\xba\x03n\xab\xf9\xe5\x18\xb6y\xc2Z\
+\xc3\xc8va\xe43(\x86\xff6\x5c\x04\x09l]l\
+Y\x1f\xf4F\xd6\xed\x96N~\xee\xa1\xb9\xa7\x99q.\
+H^\xa4>\xee\xf0M\xb8\xf4\xe9\xa4$'\x0fmy\
+T\x05\xd2X\xee\x8e\xf91G\x82\x93\xd1,\x9a\xa0\xba\
+@\xa3\x19\xb4\x83e\x99\xc3\x174\xe4@o\xa2\xd6\xf4\
+Ac\xfa\x0e\x98h\x0e\xb6\xc3\xcf\x07C8\x83\xe4h\
+\xe6\x8c\xc1\xe4l\xc0\xcc\xb7\xf7\xc7j|\xd3h\x81\xae\
+\xd1fAA\xc6\x83\x1e\xd5\x12UA\x09\xbb\x22\x9c\xc7\
+S0\x82s`Q\x5c\xe6\xe5\x1c\xb6\xca\xf2\x9f\xe5\xe2\
+*)\x83\xd9\x0c\xb6\xf1\x006\xcd\x22\x82-\x19\xcf\xda\
+%\x9c\xc9\xcb<Xo\xca\x8f\xb3\x05\xec\x863\x03\x1b\
+|\xdd\x94Q9+a\xcb\x0d\xb2\x8fe\xb6\x9d\xdd\x96\
+YQf\x9br\xb6\x80\xf2EZ\xe6\x9b )\x01\xe9\
+5\xfc\x17%`.\x84\xb0\x8b\xaf\x97\x9e\x81\xc5\xf7g\
+\x1e\x1cU\xc0\xd0\xd9\x1f\xa1Y\xec_\xc3\xf0\xbf\x9fv\
+\xbe\x87\xd2\x99d\x81^\x1b\xe6Q\xa4\x03\xc7\x10h1\
+\xc5\xf3\x01\x9eC\xaaG\x10T\x14\x07\xee\x94+\x8b\xc9\
+\x817\xad\x9c=,Y\xe3\xab\xebux\x13\x0a1\x93\
+\xde\x0c^\xe6rs!\xf7H\xaa\x8aU\x94\x0f\x8a\xf4\
+c\x98\xe0\xb2\x9bLO\xec\xb2\x01Z$Xsw\xaf\
+jD{(\x94\x9f\xcaRxn\xd0\xae\x0b\xb6q\x91\
++\xe0l\xcb\x17\xb4)\xcf@*c\xd1\x15sMt\
+j\x19p\xba\x1a\x9bK\x10\xc4~\xcf\xc28\x0f\xebh\
+@SH\x0c\xb5:\xae^duc\x17\x1c\xe4\x84\x00\
+D\x17;\xa0\xa13\x01\x8a\x14\xed\xdd\xab9\xf8\xcb\xcd\
+\x06\x16\x92\x98\x8a_\xb0\x0d\x9f\x0a\x9a\x01\x1b\x89\x9e\xb8\
+_\xd1m1\xc7Yb?\x87\xc5*]\x98mb(\
+=c\xca1\x95g\xf3\x1e\xb3f\x12}N1\x82\x02\
+X\x12^W&\x1b\xc9\xcc\xc2b\x9b%\x1c\x08\xf1!\
+\x12\xa8\xb87\xd4\x14\xac\xbc,\x85\xed\x01O\xcef\xef\
+PZ\xa4h04\xd0\xc1\xbb\x87\x0fP\x0e\x7fW\x96\
+\xb0\x9f\xa1R\xcah\x19\xfbIU\x13\x0c\xfd\x82jH\
+\xa1\xd5\xea\xb6\x87\x87\xc1!\xafo\xa8<\xfe\xf6\xf8[\
+\x85\x96dJ\x0cP\xcb/gS\x91mC{\x9c0\
+\xa8\xd6\x01R\xc3\x1a\xab\x8btS\x19\xa7&\xe5\x82u\
+\xbf\x19.\xf1\x14\xe7\x10\x9fq&\x128O\xf7\x84\xe0\
+\xc4)\xc8\x82\xfc\x02\xc7\x08\xf9\x11\x0fa\xea\xb3\xfc@\
+\xe7A\xf1\x19\x94\xce\x5c5\x8c\xe4\x07P\x8a\x0a\xb3\xaa\
+\xcc\xd3\x0c\x0e\x18\xe1B\x17\x14A\xfeQ\x7f\x9b\xaf\xc2\
+9,Pb\xd3\xf5*\x82\xf3\xb9\x9e:\x86\x9a_\xb8\
+(\xd5\xc2\x01:a\x9cZ\xe6\x07\x02`\x00\xec\x9aS\
+[\xbd\x8e4O@\xaf\xa2\x974Yb\xfb\xc9\xe1\x14\
+\xc4%Y\x16+\xefD\x12\xc21\xeb\x1av\xce\x8e4\
+\x22[\xf7l\xb6\xf9\xca\xd5U\x8c,\xd6\x11s\x88-\
+\x8e*\xbfW\xd8\xef\xc5Z\x94cB\xbd\xdf> \xac\
+\xfd\xba\xd1p\x94\xa2\xce\x10\x87\xbbo\xefMyx`\
+\x5cbTH\x8e\xd3\xd3\xa5\xe4\x90\xd9oT\x91\x06K\
+\xc6\xd8\xbd\xb1*\x12\x10E\xea\xd8\x80\x19!\x8cd\x91\
+&\x1e\xce\xccQ\xb2\x0dO*L\xe3\xf6!sQ\x91\
+\xb63OX\x91_\xc5\xbe'\xf3$\x0e\xd0\x82Fd\
+\xc7\xd3*\xa7\xb0\xf4\xc5\x14\xb7\x22\xc7y\xf4X\x85U\
+\xde>L\x01\xf0{\x8fS\x1d\xf0T\xc5\x22\xdc\x14+\
+>\xaa#\x89\xb0i\xc8\xc7\xd3G\x0f\x96\xb66\x96\xa4\
+\xb0\x01Pol\x13\xe1\x01\xd0\x9agPs\xec\xf9\xf3\
+\xa6\xd5\xcf\xedn\x83\x11\x9a\x13\xc2\xa9U\x1b\x15\xb50\
+\xc6\xc4\x9d #PkqT\xbc\x0a\xe38w\xc5\xf8\
+\x8c\xb5CNV\xf8\xef\x1bR\xed\x8e\xe7\xe9\xf6A\x1c\
+-\x139l\xbb\x8d\xd9b@\xf8\xdd!\xc734\x10\
+\xcc\xb1O%*c\xf1\xc1\x5c=b\xf1\x08\x14\xb4\xb3\
+\xc0\xf2\x99(&\x9f\xec\x19\x8a\x0c\xc7=\xe0\x83\x92\xda\
+\xec\xec\xec\x8c\xd81 Z\xa5 \x18\xacy\x8c\xd4(\
+\xe0\xab4\x83^\x00\xfe\xf0\x84E\xec\xb4\x8e\x19\x8a\xbb\
+]\x13='\x0cY\xd2\xef\x8e\x90%\x83\x22\xcc\x0bW\
+7\x9cDS\xcfn\xc0\x98U\x8b\xde6\xbadsN\
+\x0c \xc3\xdaB\xe4\xa3\xaf\xc1\xce\x1dq\x0f\xa0\xffb\
+\xecqx\xd5H\xfa\xeef\x09l\xc5V#\xbd\xbb<\
+0\x1d$S;\xa6C\xc1\xf0\x8e\x0c\xd9\xb7\xaaz\xac\
+.M\xdeI\x13\x155m\x82\x0dM\xa9\xb1\xd7\x7f}\
+W\x5ce;\xf4]\xf6\xbb\xab\xba\xec\xf1\xeaY\xbb\x97\
+\xda)\xd60_J\xf9\xa3I\xd7]]\x82u\x95\x15\
+\xe6@\x1e\xb0\x08:\xe7l\xacM\x02\x01\x0c#|\x1b\
+\xe49{\x0fZ\xf7=X\x98\xecc\x18n\x80\x8e\x90\
+\xcd\xb7Y\x06\xabD\xc3\x1d\x00H\x8c\xf7\xcc\x07\x0c\xba\
+\x86\xb1\xb2w@.\xd8u,\xbc\x09\xe6E|\xabA\
+W\xe9\xb5\xba<\x1flbv\x9df\x1f\xf3Am\x90\
+\xc8\x06n\xd6~\x19\x07\xc2d\xd14\xfe\x96\x99D\xf7\
+Q\xfb\x1c\x92s\xe9\xab\xe4\x8e\xae[\xce\xc4\xd6\xa0\x8c\
+Mi\x14\xe3Q\x0b\x00\x0c\x93\xf3\x09cF\xe2\xc4|\
+\xeb\x9dD \x1e\xd5\x0do\xc6\x08\xd6\xa8\x81\x8d\xa6K\
+\xf4\x8dl\xd3DO\xd9_\xc3\x82\x85\xc1|\x85\xd3\xd1\
+\xa7i\xe6\xda\xa0I\xa8\xd6A1_\xb9\x06\xf3\xec\xe5\
+\x8f\xe7\x0e<\xbc\x04\xa0\xf3$\x1f\x04g\xa4\x92\x92\xdc\
+!E&\xdb\x91n\xe3j-\xae\xa91\xb1\xc1#\x05\
+\xd1\xd4\xd04@\xfa/\xe1:\xfd\x14\x92\xd0\xd2-\x14\
+\x82:9\xe3\xf7K&`\x9eB\x1d\x0al\x1e\xc2\xf1\
+*\xc8\xa9\x09QK\xdc\x1fh\xf6\xa1u\xcf\xc46j\
+\x93\xac(\xa1:sy\xb9\xe6E\x1d\xeb\x0e\xed\x85F\
+\x04\xbc\xd9\x16\x18\x19\x00\xa7\x1fX?\x9f\xe0\x98\x0c\x04\
+\x98\xf5\x8a|\x12\xe2 \x02\x81`\x7f\x0b\xe6\x1fo5\
+i(\xbc\x9f\xa9o\x8c2\xb8ys\x85\x16\x02\x1cM\
+m\x95\xcf\x07\xd0o\x19\x81\x1a\xc3\x83\xa6=\x1a\xf7\xd6\
+@\xf1T\xffK\xb8\xfc\xcb\xcd\xc6\xc5\xf0\x87\xa3\x1e\xde\
+\xa7\xf1\xde\xba\xcc\xb9w\xc45b\xd5\xfc\xc7\x03@\x95\
+a\xd0\xb8~F\xb1\xb6\x19\xe0\xc8\x8f!\xec\xd3k8\
+\xf3\x01\xcf\xc2b\xc5Y\xc6\xe7L3k\x16\xc6i\xb2\
+\xcc\xc1\xb8\xcb\xc2\x81\xd9\xfa\xcf\xc0;\x1cU\x8cl\x83\
+\xa9_\xa4p\xaaH\xd2B\xb4`\x11?\xa8\x13*\x9b\
+\xc5\x16cr\xd0e\xc5k\x80\xc9\xd10\x8d\xd8>X\
+X1\xeb\xdb\xa7FP\x00\xca'\xc3E\x8f\xab\x13\x92\
+X`\xce\xd1\xd4\x83\xb5cM\x02\xf4C\x8b\x12\xf1\xcd\
+\x10\xf5\xbe[\xd1\x11X83\x8f\xa9U\xdb\x83\xab'\
+\x5cYy\x1c\x01_\xa9'o\xf0!\x8d\x12a:v\
+\x11\xe6\xc4j\x84\xcb\x8e\xe8\x7f\xd0\xdch\x9c\x01\xe29\
+r\x0d}\x0a\xa0\x86\x90\xa3\x16\xdb\xff\x91\xa3\x0b\xdbE\
+\xc7\xb8G\x8142\xb6\x88_LS\x18\x8d\x09\x8f\x0b\
+\x7f\x11\xe5\xf3t\x9b\xe0\xd4\xac\x82OQ\x9ai\x8c\xbc\
+\x9f3>\xebp\xb8\x1aZ\x88\xb4\x85f\x08\x11\x99\xc6\
+m\xf3$\xf4\x13\xb7}VA\xf6\x830\xf0\x04\x9b\x09\
+\x1e\x8dh\xe4_u\xbe\xf6\x89\x18\xcf\xa2\xa9Mv_\
+\xa1\xbf\x83\x06\x87~\x10-\xaf\xb9&\x93<$t\x8f\
+\xefO&\xec\xe6\xdf\xa7\xfe\x94\xb5\x8cH\xbaO\x00z\
+\x0b+\xff\x0afdQ\x190a\xab\xd8~F3\xc4\
+\x08'\x1db\x8b\xc3\x9c\x06}PY\xa2\x9a&\xa5\xcd\
+\x1aF\xfa\x08w\x09q\xab\xa2V\x1c*\xbc\xc4.m\
+S\x86\xff\x91\xbb\x9eQ\xdf3\xf1\xc2HG\x15\x0f\x13\
+\xfe\x11\xa3\x1d\xe9\x81k\x92\xbd\xea\xb6\x01&Nn(\
+\x0c\xc30\xe1\x11\x11\xb4\x83\x99\xad\x1e\xe3\x19\xd2T\x1b\
+\xe6\x89\xed!z\xda\xbe\xff4+\x07\xafhv\xd8\xd6\
+P\xfb;[\xd7\xb6\xe6\x0c\x92\xa8\x88\xfe\xcb\x9c{\x98\
+y}5k\x94\xa3]\x0e\xd4\x19\xb3\xbc\xc9\xc2\xaa\xf7\
+I\xe2\xcb\x8c\x86\xc2W\x80\x92M\xab\x16\x9a9\xa8&\
+\xcc2\x1e~T/\xc6P$\xc7krj\x1c>\xde\
+\xa9\x01\x8bQq\xbc\xd5y\x81\xd1&M\x8e\x8b\xa7\xfb\
+-_L=\xe9>8\x93\xee\x03\xdd\xf6\xa8'\xcb\x0c\
+u\xa6&\x8f\x22Y\x84\xc3\xa3H_\xa7\xd7a\xf6*\
+\xc8C\xd73\x1c\x10yW\xba\xbb\xcd\x9e\xf7k72\
+\x13\xc06m\xf3\x9bj\x08\xcb+\x83a\xa4x\xdfT\
+\xf5\x9fAc\x8c\xfa\x90~\x11\xbdj\xec\x03\xe4C\x8e\
+\xa5G:\x92\xfe\x0f\xb8\x91\xe8f\x18\x1by\xe3\xff\xf7\
+(\xfd\xbfGI4j\xda\xbe\x7fc\x8fR\x9d \x09\
+g\x899\x8afey\xf4\xeaM\xff'\x5cQ\xf1\x83\
+\x0e\xf8\xf8\x7f\x83\x07\xfeXlYg\x0e\xac\xf6#X\
+\xbe\xc7M\xbb\xd6\xd1\x13\x5c\xf1\xea\x9c\xaf\xb6\xe3\x875\
+\xa7\x02\xfd\xca\xbd\xecaf\x18\xe1[\x8d\xe3\x94\x96\xbb\
+u;a\xdb\xee\x96\xd1!\xe0\xf8)\xe9\xb0\xc7\xfaG\
+\xb5\xeb\xa9'q\x0fHi\x97\x18\xacm\x92\x16h\xf8\
+N\xb1=_\xa5\xdbx\x01'\x08t\x04d\xe4{1\
+\x0f\xb0\xbf%3\x91\x9eF>>\xd6\xca\xc1Q\x1aw\
+\xb5\xd8g\x96^\xd3\x1d\xff_\xb2,\xcd\x5c\xe7\xa7\x04\
+N$\xb0\xf6\xd0\xd6\xdf\xb04a\xb3[\xcc\xcfp\xf8\
+\xf9\x93f\xebU\xba\x08a\xc6\x0e=\xcf\x0cX\xd8k\
+\xb83\xcf\xad\x9b\xf2\x9f\x12\xbc\xf4m\xcbq\x89\xa8V\
+l\xdaa\x0e\xa3\xe29.\xbe;\xd9?x\xf6\xcd\x1f\
+\x9e;\xae\xd7\xe9\xf6\xfc\xfe`8:9=;\x1f\x7f\
+\x8f\xc1\xe2\xbe\x7fq\xf9\xfe\xae\xbc\xff<\xe5qW\xc1\
+\xb6H\xd1f\xc1\xa6\x98\xab\xb1\x0a\xd7\xe1\x08\xe3_\xfc\
+\x9b\xc3\xc3\xbe\x7fstuz>\xed\x94\xe1:\x88b\
+\xef\x9c\x9al\xb3X\x87\xd9\x83\xa5\x83\x09!2\xa8\x88\
+\xc6\x87Q=\x17\xa7C\x11\x07J9\x04#\x99D@\
+\x91Ny\x18_\xf5\x1br\x04\xa0\x95\xd9\x88G\x8e\x9a\
+\xa9\x0e\x88b8>\x17Y'\x954\x86\x8bz\xe6\x07\
+\x01\xea\xa8\x0a\xe0\x19\x08\xd4\x96B\x0bz,\x1c,\x07\
+\xect\xbcYm\xd8\xf8\xdc\xc0\xb2/i\xe8b\x90\x95\
+\xce\x0fq\xb8\xcd;\x8fa\x85\x9a\x18\xf6\x7f|\xf3\xea\
+\xdd\x7f\xbc\xfd\x0b\x1dA,D\xbbRG0V\x16\x8e\
+\xcaX\xcdD\xb8\xf0\x1ef\xea\xf0\xa9\xd8\x1f\x1b\xc9\x11\
+\xbe\x8b\xc6#F\x1c\xe5]\x95\xfe\x80\xd9\x00|\x0a\xa1\
+\xae\xb9\xd9D'\x0d\x18Y\x03c\x916\x80\x19\x01\x18\
+\xf2\xc4s\x8dR\x0b\x85\xd5n\x22\xd2\x0c\xa0\xa0\xac\xa5\
+\x1et\x00\x03\x01\x01\xf4\x98P\xf1\xc80DuyI\
+\x91TS\x19\xb1I_<(\x1d\xef_z\xe5\x85\xdf\
+\xf1;M\x00T\x0e\x14t\x00F\xa2hje\x00R\
+\xc7\xe1\x9a:\xad\xa3\xbc\x84\xe6\xa25\xaf\xbd\xac\x92\xa4\
+p\xd7\x1bw\xb0\x1fI\x8e\x00\xe8\xd4(V\xf4\xba\x95\
+\x0eU\x0b\xcf\xa2Ue\xa0\xbd\x87)\xc8;\xae\xc6\xf7\
+~:\xc6\x12\xff\x08\xa0\xdfs\xe0\x99\xc8@;\xee\xdd\
+\x1b\xfe\x1f\x1e\xc3f.E\x99F\xa2R\xbb\xce@\xea\
+@\x0a'\xef;0s\xb3\xcbR\xa0\xe0Qk\xa0g\
+\xb8\x0a\x19\x5cr\xed\x81QQ\xc3'\xa8\x8f\xa5\x81\x81\
++\x0eD\xa0\x160\xff\xf7\xb0\xff]w\xd0\x9f\xde\x1d\
+\xf5^\x1c\xdd\x0fOt\x97\xa8P\x0cx\x80\x1b\xecS\
+\xb7\x9d\xee\xf0l,z\xe9O\xbb\xee\xf7\x9e\x06AQ\
+\xd3\xdf\x00\xeda\xef\xe5\xd1\xbdQ\xcfs\xe8\x06Oj\
+\xe1a\xd4\xe0\xa4\x0f\x93\xa6\xe9\x93jQF\xfcV\x8a\
+\xed\x88_>xX\xd067l \x1a\xb0\x01\xc35\
+\xea^5dWV+\xadG\x93\x927\x07\xd5\x83 \
+\x9c\xc1\x7f*<\x94\x7f\xc5\xb0z\x0c\xaa\x17_+a\
+\xf5\xba\x0f~(6\x87W\x8b\xec\x7f\x5cv\x80\x19\xff\
+_\xa3\xbf}\x88FnS\xb3\x92\x19\x97\xefq=t\
+\xde\x1b\x1a\xab36\x84\x08\xd5\x22\xe7O\xc7=\xe5*\
+\x0ev+Rp\xf9\xe99\x81\x9f\xf3t\x99\x89\xebA\
+\xb9\xefZ;\x9b\xeb\x01\x08h\xd1\xb2^\x0a\xfd\x18\xd2\
+\xa0\xb3\xaa\x9aR\xaa\xa8\xc8\xc1\x22\x87\x8a0\x95\x8a\xca\
+|\x0f\x0b9:\xdf38\xdf Yu\xa9\x92\x99U\
+\x16\xbb\xaa\xc9\x0d\x94\xe2c\xb2\xa39\xf7\xca\x1aG\xeb\
+\x8c\x88\x8d\xa4B\x99(},q;\xd2\x0b\xb8=c\
+[2\x02AC\x82\x01\xafi\x8a\xe3\xde\x81\xa71\x9e\
+\xdb\xea\x83\x07t[\x9b\xd4\xf8\xcc\xff\xd5S*\x18>\
+\xdb\x9bM\xad\xbae\xdf\xa9\xa3\xd1{@\x03\x0e\x03\x03\
+\xdf{\x89\xe9\xb5\xad\xdf\x1d`\xaa\x837\xac\x86q\xb7\
+\xce@-\xd0Y\xd9\x07\x8d\x1d\xe4*\xfe\x19\xb7\xf2/\
+\xec\xc6\x8a\x81\xc6t\x83\x1dST\xcd\x05i\x98\x1di\
+\xcd\x9ab\xc8\xcb\xb4\xbf\xce\x99zx\xe9\xf6\xb9\x84\x7f\
+\xbd\xca\x88\xc9B\x15\xa3\xc5\xa5xUlJJ@\x1f\
+{#\x7f\xe8\x0f\xcb\xeb\xebk\x7f\xe0Y[\x83\x0f{\
+\x8d?\x80\xcd\x80\x94\x07\x98\xbc\x17\xa4\xa1k\x0ci\xd5\
+\xe35\xbe_\xce\xe4-\xdc\x88\xe73^\x8c\xf7\x07\xbd\
+\xd1I\xe7\xf2\xb3\xeb=\x9fvI\x1dQ\xc2e\xf9\x1c\
+w \xbd'uO\xbe\x01\xa5\xa4\xa0=LD\xddW\
+\xd9\xdc\xb4\xe9\x0f/>\x7f\xaeK\xd5\xe7\xcfFB\xa9\
+\xa5\xd9\xa1\xa4:\x92iI\x0c\x9c\x96\xb5\x14\x01\xaa\x10\
+\x1c\x1b\x0d\x87%\xf0\x0f\xffA\xae\xf9\x83\xb2\xbac\xfb\
+z\xcb\xf6}\xbei\x7f_\xd6c\xeek2\xd2e\xaf\
+QF\xfe\x0cG\xc0\x8f\xf9.\x89\x99q\x88\x06\xa1Q\
+\xa9)h\x22\x99\xe3\x9de\x86\xa4\xa0\xd5\x83#\xea\xd4\
+\x04\xa5\xce(\xcc\xd2!f=\xd4\xdc\x1a\x8e \x9e\xc2\
+\x99\xd9s\xf6*]o\xa2\xb8\x96\x02\xc0\xa1xl8\
+\xf9\x89+Q\xe4O\x8f\xf0\x97\x19\x02\xf4\xaf*\x95!\
+\xee\xd6\xca\xd2\xb5a\x82\xa1\x11\x99<\xb9\xcb+\x06U\
+\x0e\xfd\xf1\xdbn\xfe\xdd\xf5jM\x0d\x22M\x14*\xb7\
+`_\x13\xa73\x0a*\xe7\xe6w<\xef!\xc8\xb2\xe0\
+\x16T\xd4?\xb7Q\x06D\x07\xec=5{\x8f\xa7\xb6\
+M\x98\x15\xb7\x03\xee\x8e\xbf\x7fz\xdeBeK ,\
+_\x90\xb8\xc0\xa5\xaf%q\xc1\x92Pq\xba\xdf\x91\xb9\
+\xa0\x85\xcc\xf4\x04\xd4R\x17\x848\x19\xb9\x0b\x86\xe8T\
+\x905\xa50\xc0Qw\xc8e\x10\x0f\xbdf>\x83\x89\
+'\xdd\x16\x9bmQ\x8b\xb6o\x92L\xcb\xdf\x80\x93\xb8\
+C\x94O\xb4cC\x0c\x97wT\xcfx\xa8RZ'\
+Qg\x064\x12\xab\x89K\xa9\xceQ\xbe\x1e\xa4I\xc5\
+\xec\x1b\xe9\x00h\x22\xa9r4\x86\x8c\xd4\x80\xf6\xf8|\
+\xbe\xf7\xb4\xbb\xbdx\xfd\xd7\xb9Iq\x04]yG\xf5\
+\x90\x17N\x9eC\xdaI\x92\x10\xbfM\xca\x80t\xc2~\
+\xefX\xf7^<\x9e\x80\x8f\x9e/\x9au\x90,\xe3P\
+8'=\xc3s-Lu\x07w\xcb\x22\x1d\xa1{\xac\
+0B\x08jn}\x1b\xb7\xc0WCg\xa1\xb0\x19i\
++,d\x05yQzt9\xd0\xa3\x96\x0f:;\xc1\
+\x8e\xa8\x5c\xadq\xcd\x16%\xaf\xd1Nn\xf4\x14C\x9b\
+F\x1f1g\xb0\x0d\xab-\x04\x1d2sh\x85\xcb\xfc\
+>S%\xfa\xf9-g\xc7B'i\x91\xd7\xcd`8\
+\x0c\x1c\xfb&E\xf6\x88F\x06\xd8\x16\xd5\x1e\x1b/z\
+\x1a&]O\xfb\xef0\xfd\xd2\xb9\xd8\xec\xea\x0e\x1a\xef\
+E\x9a\x84dxq\x1a\xb0a\xc4/\xc0\x04\xb3j\xf7\
+\xc7\x02\xfc\x8c2\xa6*\x8cW{\x92\x85\xd3\x1f\x06\xe7\
+\x8f\xc6j\x05%\xde?Y\xbaL\xae\xb6\xc68\x8c\x9b\
+\xeb\xcd\x98\x856\x109\x00\x03tT\x11\xaf=]a\
+y\xf0\xdb\xc3^w\xe9\xc7\xaf\xd7\x8d\xed\xb3&\xe4\xb4\
+\x12\x10\xfb\x90\xed\x82\x7f\xc4\xf1\x9b\xde\x9fq\x0e\xa6\x1d\
+\xe1^\xcc\xbb\xee\x04\xbez.&Z\x1f\x0f9\xddt\
+\xda7\xee\xfb\xb0\x03:\xa87\xad\x19\xac0\xf6\x15\xa2\
+_\xf84\xa8\xea\xc5t\xe7\xca\x93\xb0\x8e\xd3\xb0\xf0j\
+\xcaA\x00W\xef\xe8\xf9\x15\xd4\x11]AQ<nU\
+\x1c\x05\xad\xf8\xcf\x008\xbf6\xa33.N\xe59\xc7\
+;\xa7k\xfdo\x8e\x9cf\xe9$C\x01g\x85GY\
+k\xbax\x04\x86i^\x08\xbf'ge\xcf\x1e@3\
+\xa4r\xa0\x10\xdd-\xb2`\xad\xb56\xf1\x14\xa7\xf2\x9e\
+p\xbd+I\xad\x8b\xaa\x804\xa4UQ\x0a\xa6zC\
+\xbaPu\xe3\xff\x12\xe9\x16\x92(\xb7\x14\x15?\xb4;\
+`F\xb4\xd2\xe6\xff\x84H\xb1\x22n\xac\x15\xb1O-\
+\x00;}\x18\xd0D\x18Sf\x18E\x87\xea\xe6\xf3\xd0\
+\xd8iT\x18(\xd6\x1b\xc1@\xb5\xf0\xcf\xe6\xdb\xf0]\
+\xabx\x97P\xd1:\xfb\x8a\xc9\xe7\xee\xa7v\xed\xc4\xeb\
+\x7f\x13\x83\xd2\xde\x089b\xd7\x18\x14\xb5\xfeV\xcd\xf0\
+\x0b\xf5\xc9\x9a\xf5\x07\xf7\xcap\xbd\xc3<^\xff\x0e#\
+\x09\xd7\xb5Q\xbcT\x14\xffQ}\xfa\xfa\x91\xfd\xde\x89\
+\xac\x8d\xa3C\xb4\xf8\xec\x81k\xec\x81\xc7S\xa1\x15E\
+V\xf5\xc3)<;\x92\x8df_\x99l\xd4H\xf5L\
+8\x0bv\x11\xb5\x08\xab6uC\xc8\xe0W\xc6j6\
+\x12\x07Xk\x12\xf3\x98\xf9\xff\xb2\x88\x87\xaf$\x16\xd1\
+\xba\xe6\xc1\x8aB\xf1oA\x22\x8a\x5c\x19{\xff\x0bB\
+\x17\x80x~\xa4o\xd8,\xcd\xc3:\xd9\xdbD\x89\x8c\
+y\xc0\x13\xc4\x98\xfeQ;J\xcd\xc9\xa1n&\xc5~\
+\x0fV\x037\xfe\xb5\xc7D\xb8\xda\xd0\x95\xf8\xf1a\xff\
+\x81\xd4\xd1\x92,\xad\xcc\x95'\xc10\x98\x065o\x81\
+\xac\xe0_\xc6\xd2B\xd5eH\x22\x8f>\xd3C\xad\xee\
+^<\x0e]\xbc\x0e4n?\xa9p\xff\x04k\x92Y\
+j:\xaa4\x8d\xd6\xc12\xb4\xdb\xda\xc7g\xdb\xfb\xf2\
+\xab\x96(\xf6.\x0b\x92\x1c\xdfQ\xa3\xc0\x86\x06\x9f\x93\
+f\xa4!\x88\xcd\x13\xacO@V\x1a\x09o\xe2\x99\xf3\
+\x7fb\x8b\x83\xdeJ\xfa\x8b _\x85<]@\xdb\x1b\
+\xfd~\x9f?9\xb1\xc5\x97g\x85\x83\x19\xe1\x936x\
+\x0d\xfeB\x83c\xdc\x08\xba\xc50 $\xae5r/\
+\xcaI\x9f\xf70t\xfd\xc9\xdd\x01\x1a\xe0\x0e!\xfa\xe6\
+\x88\xca\xff\xa4Q\xc9\x10\x16\x81\x8a=g\xc1&\xc5-\
+vS\xa7\xc6\xd1\xc4|W'f\x91ng\x0f\x13\xc3\
+\xfbG\x8a\x0eL\x8a\xe6u\x8a\x9a\xf1\x1dh\x1a\x16\x06\
+\xff\xe28\xda\xe45`\x7fp\xf7\xe2^58~\xe9\
+\xd8\xe2\xf33yzh\xdd\xed\x94\x17\xee\x11z\xac\xa8\
+p\xe8\x9a\x944\xba\xf8\x84+\xa0\x92\xa0O\x11\x9d\xca\
+\xab\xb7\xa2\x85\xd8\x9a`7_I$\x86\xb2\x8b\x84\xae\
+C\xea~\x0e\x8a\xd5\x00\x16\xc7\x22\x85}\x97\x9d\xb3\xc3\
+\xc1\x1f\x0d\x97\x0e\xb6vnP_\xceW`\xe4\xfe*\
+\x8c\xcf\x97\x86\xb2T\xfa\xddy\xfe\x8c\x03bp\xd0\x89\
+\xa3|\xdaUE*\xd8+\xbd\xef\x95+\x04\xe5\x94\xff\
+\xd2\x8b\x03\xe8S\xe20&\x09\xcd\x0dK/\xc2\xf7\x1e\
+=\xf9 u\xc8B\xcf\x985a\xabh\xb9\x8a1\xc0\
+X\xb2EOU3\x9c\x81\xdb\xe03\xb6\xd8\xe7\x81\xbb\
+\xe8\xdd\xe0_\xcf\xc8\xf6\xd2\xfc\x16\x94T\xectA;\
+1\xd0\xda\xa2\xf8\xf9\x02\xfb\x11\x18\x04\xab\x9d\xd3M\x16\
+\x9e\x9fb\xbbs\xfd\x84\x94+\xb1\x8f9F\xed~ \
+z\xb9\xc5\xa5\xa0\x9d\xd3!\xb5?\x1d\x22\xae\xdal\x1a\
+]\xc0\x92\x0c\xf2\xfc\xec@\x86\xc6Y\x5cA\xea\xde\x82\
+\xc2\x8enD\xad\xdcP\x88\xf3\xd4\xa7\xa8p\x0e\xce%\
+\x86\xc7SZ\xa5\x93\xf2\xbaP\xc8\x1aD\xc0zfP\
+\x09\x02\x7f_\xd0\xdc\xb8\x9dS\x0d\x89\x08\xa1\x13\xde\x8a\
+:\xb3\xebZ;\x13\xcfS\xaan\xf0\xbb\xd5\x0b\x16\xb4\
+\xb7\x16ohTt\x0a\x08\x15FJ\xf6X\x16\x5c\xb7\
+I+\xc5U\xff\xb4\xc8k\x22\xb1\xd2\x92@X\xf4L\
+\xb3h!g\xaf6\x7f\x1c\x9f1\x83\x08\x01\xdd\xb7\xe5\
+\x98L.\xfc\xeb)?5\xf7\x1dC\x9a\x0e\x0cAT\
+[\xa1\x98\xbfv\xca\xceE\x9e\x1eJ<\xe8\xf1h\x99\
+\xa4Y\xc8~\xfa1\xdf\xb3\x06&\x1bR\x13\xe9h\x95\
+\xb8\xad\xca\x9dS\x96\x99\xfc\xb6m9\x93%74\xb7\
+c\xec9\x1b\x92\x80\x8c\xe8\xf3N\xe4\xe2\x11]\x85\x1e\
+_H\xed\xc9D\xef\x1e\xcf\xea\xd6&\x1a=\x9ey\xc6\
+t\x8a\xb7\x93\xc6\xd4\xcdVgQQ\x93\xa0@\xac\xae\
+\x04\x04\xc5B\xc5\xa4Z\x8e<h\xe8:\xbc\x04&\x18\
+\x8d^\xaa\xc4\xe9p\xb4\x83J1\x928\x87=w5\
+r\xc14|\xa9\x11(\xe6<5\xe0vs\x14\x07-\
+\xf2n\xda\xedd\xe74\x8e*\x93\x06\x05\xbb\xd0R\xfa\
+\xdf,\xb5^\x0a\x13)\x81\x15\xccQ\x82WjJ\xad\
+\xc8\x84I\xe0\xa7\xf8xvp\xc0\x88\xb1\x8e\xd2'\x8b\
+(\xc7\x94 \xaa\xc2\xee\xce\x0ed\x7fJ\xc3\xb9\xcd\xf2\
+\xc0\x86\x15T\xe7\x98\x8a\xd9\xbc\x1f\x99/n\xee\xe2\xcd\
+\xa6\xc2\x9a\xcdN\xce\xf0\x5c)S\xed\xd0\xf2\xed\xd1\xe4\
+i\x8d\xc1\xbf\xd1\x84\xc2\xb6}J\xcf\xf5\x9e\xdbs,\
+\xcaN,\x95O\xe8\xcfe\xfc=\xc2\xd1\xbb\xbeF\x09\
+\xefO\xab\xe6j=b5j%\xbe\xdd\x03\xc2C\x9d\
+\xb5u'\x05F\xe8\xd9\x8c*2!\xa7\xa2Z\xf4\xb0\
+{U\x12z\xccbi\xc0\xdfcWq\xb0\xcck\x8b\
+\x92J\x85^\xc4Y/V4\xeb\xc5\xc2\x91v\x1c\x0f\
+;\xe4p\x94\xb3#\xceA\xd6\x0asx\xa6\x18_\x97\
+\x06\xac\xa9,G\x95&\xe7\xe6z\xc5^*\xa3m^\
+\x98\xe8\x8d\x83\xa3\x89\xd0\x82\xf20\xd5\xc4\x0e\xee;{\
+@\x229PE,ea+\xa7\x1fT\x02\xe1\xba\x82\
+\x12\x0b\xdaU\x80\xf0\x1e=\x80\x94[@\x16Z^\xd4\
+n$<y\x13\x98\xc1&\xc0\xb7\x80Y\xb6\x03\xf1\x22\
+\x8c\x1f \x16 *\xb4R\xc9\x0e\xedj\x1f\xf5\xed3\
+\xb5u\x04i\xbc\x92R!%\xd9\xad2@Q|\xb1\
+\x07\xc0\xbb\x08\x91U\xff\xf8\xe5't@\xa4\x09\x08\x99\
+\xbbM\x84\x1dF^l\xed\xa4\xb7\xb7\xff\xd1T\xa4}\
+\xe9z\xcbX\x10F,\x9b\xe3[#`\xebi\xf3\xb7\
+r&\x92\xe7\x0b\x1c\x01\x12\xa5\xdf\xc5\xf8\x10|\x0ax\
+\xe2\xef\xc8\xe1YA\x87x\x16\xb0\x81>\xcd\x1e\x04\xc1\
+G\x5cU\xf5\x03t\xdc7\xf1\x12\x9f\x87\xffGF\x16\
+\xfd~\x9aE\xcb(\xf9\x09poB\xfa\x99\x10\xa8\xe0\
+w\x97\x9c]\x02\xbdp\xbfda\x9e\xc6\x9f\xb0q#\
+\xc6\x1e\x13\xb7_\xbcc=G\xa2y\x98\x88\xd9\xe1\xc8\
+\xf5\x0c\xfc\xe1\xf8\x8f\xc4\xfe?\x88\xa8\xa2\x1a\x9b+\x83\
+\xbb\xb7\x0f\x9f\xa7\x01\xf5\xc0\xd5\x929\xdb\xdcj8\x91\
+L\xe0\xae\xa0;\xeb\xfc\xc7e\x8f7\xe5\xfe#\xd5\x06\
+{\x91`\x15!\x0f,\xad\xa6N\x89\x0d\x02O\xee\x9f\
+/\x91\xf8\xff\xa9Y2\xf9\x18\xad\x97\xe8c\xe4\xdc \
+l\xc8\x0cP\xfa\xc2\x14\x93\x0c\xf8Mx\xda\xac\x9a\x84\
+^z4\x7fE\xcc\xc3n\x97\xa6u\x86\x7f\x07\x05\xc6\
+9^\xc0\xe5,M\xe2[z\xce\x05[l\x03JD\
+,Xz\xc5\xcb0.\xaer\xea7\x11\xa1\xd6\xbd\xa7\
+m+IY\x12\x82\xbd\x86\xde\x0d\xfe\x83G\xf6\x1e\x96\
+\xef\xed\x99\x0d\x1bv\xb2\xb6z\xdc\x8e\xda\xea\xf4\xde\xd2\
+\x06A\xba\xbc\xad\xb2\xc2E\xd6\xca\xc6V\xe2\xb9bo\
+\xab}\xec*\x90\xfb\x8a\x0e<i\xefq\xc7\xae\xe78\
+\xa63\xfam\x90\x91\xf7MF\x80\xaa\x9865\xdc\xb7\
+\xf4\x83ZOy\x06\x9a\xe9t\xe6\xa7\xc7\x87\xd6b;\
+\xbf<\xe6\xb3\xadi\x0d\xb058\xf4\xbe\x1a\xa9H\xcc\
+\xb0\xc2\x139{\x06\xf4\xb3c\xb5\xc0\xc4ZD\x22\xff\
+u2\x11\x91X\xe1\xac\xb1\xa87\x06\xd2\x86g\x97\xa9\
+\xaf\xd7i\xba\xb1I0\xcf\x225b\x8c\x89k\x0d\x8b\
+\xc4+\x14\x11\x1ai\xf2\x81(\xc3\xd82@\x1aX1\
+\xc1\xec:*V,\xb0V;\xbeL\x07_\xb3`^\
+\xb0\xcd6\x0b\xa5w\xc0\xe8\xfa\x1d_Q\xd5\xeeIO\
+j\x1a\xe8\xab\x8e\x9f6)\xea\xb1;9w#Bc\
+\xab\x9b{\xb4T\xbc\x93\x9a\xa0\xf2g\x98?\x85\x19\xb7\
+Zl\x05OJU\xc4RR3|/\xc8\xf5*\xfa\
+[\x22tu\x88o\x8b;\xf4\xef8\xc8wZ5\xd6\
+f)\xa9h\xe7\xbam*W\x93\x955\x9cn\xdc\xda\
++\xdc\x9f\x22\xe0\xc1\x83\x1dn\xc2\xf0\xe3#:\xcc'\
+\xd6\xeb *[\x9b\xae\xa0\x0f\x1b$\xf1\x9d\xea8\xdf\
+%\x90\xef\x1a\xc7K\xbf}\xc7\x0f\xae\xba\xdb\x01\xd7o\
+\x95\x09A\xfa]o\xc0\x8fmx!E\xb9\xd2r\x82\
+\xf8Q\x97\xa7\x93K\xa7\x17\x9f\xc2\x816\x8d*\xe3\xb5\
+\xa3}\xe9\x14\xdd0\xbeW\xfcy\xc5\x9d\xbc\x05\xb2\xeb\
+c\xcbay\xa0\xa9f\x0e\x0c\x80\x95+\x1fl\x0e\xf9\
+<\xf5\xa8j\xab\xcaX\xa3{\x03t\x95\xd5\xe1lE\
+\xb6R\xd7\xd9V;\xf1Z\xc1C\x8d9\x98~\x17\xa2\
+\x81G\x9592C\x90t\x0d\xbd\x85\xa0k\xd4)\xa3\
+\xa2\x02\xdapz\x0dC\xa0\xa7\x9d\x1f\xa0\x1fa\xaa\xc8\
+\x1a\xe9#_uS\x85\xbc8\xa8\xf7\xcf_\x95\x19Y\
+\xe7*\xe120ox\x94 V\x0b#\xf3K\x96^\
+[\x0fa\x85\xfaaw\xfc\xf3\xc1|\xec\xd1p\xc0p\
+H+\xa6\xad\xfa\x22\x881\x16\xebA\x8e\xda\xc3 \x84\
+\xa9~\x87/\xdd'\xe6\xdb \xbb\xa5\x80w\x83/\xa3\
+\x98C\xb8S\xcf\xee\xa0o\xbf'\x1f\xd11\xda\xa9\xb7\
+O\xf4K'\x95\x87\xd9\xe5\xd3=-d\x02\x13]$\
+U\x07\x14\xee`\xc6\xceGR\xb8;\xaa\x0am\xbf]\
+Y\xe3\xbc\xe8\xee\x03\xef\xee\x03t\x07hT\x0f\x1f\xaa\
+\xcf\xb0<\x81\xdf\x8d\x1c\x07\xe4\x93\x0f\xd3\xca\xc3+\x9a\
+\xcb\x14\xc2\xd5\xce\xe6\x0f&\x9b\x0dF[\xcf\xb3H\x05\
+\xba\x9b\xd7\xf6\x0c5\xaeCjb{*\xeb\x0b\xaa\xf6\
+:\xae^[j\x01)\xfe\xd7\xb7e\xbe\x0bPXB\
+\xe5\x95Y\x93\xef\xd6\x90\xd4\xaem\x8d\xbbq\x04\x1a\xa5\
+\xdbB\xbe\xf1\xcck#\xe1\xbc\x80\xcc\x0b\xf5\xa8\xac1\
+-\xb5W`\x85\xfb\xdf\x86\xa2\xa2\xc71A=?\xf7\
+[\x0c\x1f\x915_h\xb40\xc2x\xf9o\xd74\xaa\
+s\xbc\xd0\xcf\x95'\x10\x9b\x05P:\xeb\xcd\x96\xf2r\
+\xa06\x9c\x87y\xa4\x9e\xfb\xdb\xc5(\xb1Q\x1bV\x86\
+1Q\x22\xfeE\xd94\xae\x1d\x02\xfe%\xccF\xa2Z\
+%\xad\xfa\xf6\xe2\x17/\x94\xc7\x8f\xff\xb7\xa2\x9d^\x09\
+\xd4\xf4\xe2\x9b:o~|\xc3\x8f72;K:\xbc\
+A8\xe8\x97\x08\xf1\x0dS\xf5\x22\xf5\xd9\xd1N\x83\x05\
+\xd0\xd7\xac\x87:\x15\xfa}\xa2\x07\x0c\x08\x05\xe86h\
+\xe0\x9a\x95\xd2`$\xa0\xa4<\xad\x0fC\x8a\xacx5\
+\xc3\x08\xfd[\x18o\xd05b\x1f\xcb\xa5+\x8f~#\
+\x91;\x0fk\xd7\xd1\x84Oy\x12\xf79\x14\xc8\xef\x10\
+\x93w\x9f\x8d\xfd\xeb\xee\x897\x5c\x82\xcc\x0e\x9f\x93\x8b\
+\xf1y\xb0\xde\x9c\xd4~:\xe7\x94\xd7\xc5E\xbd\xea\x9c\
+W-\x1b\xaax\xe0\xcesT\xa2\xf5J\x1eY\xf4\xfc\
+\xd9\x8b\xefN(F\xc7\x18\x97vI\xab\x0bv\x0c\xf8\
+\xb9\xd9\xc4\xd1<*\xe2[F/Z\xa33;\xa2\xe4\
+\xebUx\x03\xfb^\xb2`\x09\x88\xce\x82\xfd\xed\xdd\xcf\
+\xaf\x81\x1d \x95Q\x98\xdb\xdc\xd0\xdd?w\x9f\xe1k\
+\x07\x8b\xae\x87O-<\xbb\x99\x1c\xf6\xbf\xfb\xa1\xff\xaf\
+A\xffj\xca\x8b\x8030\x1d\xe3a\x04d*\x9b\xfe\
+\xb2\xc7\x12\xb9h\xc8\xc7\xd1\xe4\x05G\x15\x97p\xbd1\
+O\xe3\x14\x9f\xef\x93\x06\xfd\xc81@\x8c\xd8:\x02~\
+f\xacG\xd1@\xc1\xc8w\xb2n\xb4\x16\x1a3\x1e\xb9\
+3\xb8\xca\xd2\xf5+\x11\x08\xe4\x920\xfd\x94\x14\x80^\
+\x87p\x1e{=v\xf4\xd23\x93Q\x9a\xdav\x13+\
+\x18\xdd\x92n\xebHr_\x990JE\xce0\xc3\x98\
+\xfc\x1dR\x08\x97\xf4\xc3O\xf4\xaf\xfc\xe9V8>\xd2\
+w\xc4\x02\x90\xdc\x1f\xc4\x7f\x82\xc5\xf0}H\xa76\xcd\
+\xd5H\xb3\x1f\xe7\xb7\x07;j\xec\x19F8\xdad\xf0\
+\xb7\xd1\xc3\xa7@\xbd\xa3\xa7\xab\xad\xf0\xb4\x0b\x7f2\xf5\
+\xfc\x0b\x11\x8e\xa63\x01l\x9a\xd5+\xda\xaa\xdb\x93\xfa\
+\xb2\x16L\xe2\xdb\xb8L\xb4\x1eU\x8f\x81\xe6\x9c\xea7\
+\xb9\x0d\x96\x19\x0b\xdf\xe6\xad\xe1\xadF\x07\xb5\xf0N\xeb\
+@4\xe1\xb5\xce'\x0e\x85\xc0\xe2W\xf5\xcc'\xac\x9a\
+\xeb\x90~\xcbSDY\xa0\xe3\xe3\x16\xa8\xe6\x8fi#\
+,\x0b\xae\x0a\xf1Lw\x1c\xe4\x05\xcb\xe1\xef\x15zu\
+\xa3\x22\x07e\x0c\xc7\xfe\xb9\xbc*\xeaI\x9c\xb3m\x81\
+x\xd7\x18\x18\xc5\x9d\xb9E\xca\x82\xc5\x82]\x16\xab\xa0\
+\xb8\x94`\x94\x89?\x1a\x0e\x8b4\x05\xc3;\x0a\x8b+\
+\xb0y\x96C\x5c\x87\xc3\xecj\xfe\xe2\xbb?\xbd|&\
+\xde\x90\xea\xbfP\xcb\x02\x7fPz4\xed\x8e\xfcag\
+r1\x9c\xaa'\x18\x91X#R\xb9i\xd80q4\
+\xa4.s\x86\xf2\xe8l\xa7\xf9\xeche\xdewQ\xb7\
+\xc6\x13\xca\xf2\xaa\x88\xb0\x9f5bQY\xe4\x94\x07\xa4\
+\xde\xad;\x16\xebv8T\x8b[\x88\x81\xdd\xe7H\xa4\
+\x09a\xaf#z\x06\x1c\xf1\xf0\xcb\x1e\x95LG\xa8+\
+J\xe3\x01\xbc\xae\xe2\xa3g\xf4@Q\xc9\xb5.jh\
+L\x10\x90Ir\xd3\x88\xa13\xfe\xfb~\xdc\xb8\xad_\
+\xbeP6\xd87\xe5\x05\xff5v\xf8K<\xa8\xd4\x19\
+A\xd9\xf8\xd9t\x18\x9d\x18\x22\x8eOA\xf1\x0b\x02\xfc\
+Dq\xe9\xa8[\xe1\xb3\x09\xc5\xdd\x80\xe9\xec\x83\x91\xdc\
+\x0d`G\xfaG\xce\xa0^\x1d\xf6?\x86\xb7\xd5 J\
+\xa8\xdf\xe23@\x8d\x87@\xde\x1a\xf0)(:\xfca\
+\x15\xa1\x00|\xf4\xfe<\x81\xd9\x89\x93of\x1f@\x8a\
+\xcd\xa0\xa3 \x7fs\x9d\xbc\x95O\x01\xcc\x038\xdc\x09\
+\xea\x90.+\xdf\x11\xc63\x812J\xb1%\x10\xfaf\
+\x9f\xb1j\xe1\xeb\xb3\x0f\xb6\x8e0\x1e\xf4\xa4\x83\xd7/\
+\xe9u\x8f\xd1\xfb\xec\x9aWt\xa0\xa5^8\x80!#\
+\xf8\xcb\x93\xa0\x0eK\xa1\x0eYi<e\xdb\xb5\x9f\xb2\
+\xd5?\x01Ay\x05\xc6\x91\x9a\x9d\x9b=\x8a'o\x09\
+\xcd\x1cc\xfc\xb0\xa6&k\xc2T\xb5\xd0\x9cJ4\xbc\
+\x94^Ht\x8c\xd7\x14\x8c\x09m=\xd1\x1bo\x9d\xd6\
+\x9f3\xf5}1\xd2Rb\xd51\xef\x08l\xba\xfc\x7f\
+\xa6\x1b\x8a\x8a\xd9\xc5\xaf-\x94w\x1f_p\x8ec\xcc\
+\x89V\xa6\x0a\xcfY\x081_\x01\x85\x86,CP\xa9\
+\x09N\x15\xed\xae\x8c\x82\x98\x04\x17Qf\xa0\x96r/\
+pI\xab\xf7\xe2\xe9\x01lY\x9c\xd0\x8f\xc6\x0ba\xad\
+\xe6D\x08\x92\xbc\x11GlX\xd1Q\xae\xdf\x9f\xa7\xc7\
+\xff\x01\x8d\x1ew\xa5\xfb}\xfe\xca6R\xe8|Y_\
+x\x1d\x88\x87\x0d\x1d\xfdW[\x1d2\xe2\x98\xaf\x0b\xba\
+\x96\x00\x85\xdd\x93\x9c\x013\x0f\xe0a\xf0\xf6\x03\x1a\x92\
+\xc7\xc8\x12A1\xd9\x0fH\xb1\x9c\x19E3m\x8c\xf6\
+\xac\x90XH\x1cdu\xc85\xc6\xcd\x10\xfd\xf8\xae8\
+\xee\xf0b}\xf7P\xb9\xac\xeaI\xc3\xe5N\xbd\xf2N\
+\xfe@\x190\xcc\xfb\xd0\x01\xc4\x86\xaf\x91\xbc\xe4\xc6\xbb\
+\xe9\xa05#\xd3\x19i\xfe\xcc\x8a\x19\xc7\xa1\xee0\xd4\
+\xcf{*\x19\xf4\xc4f\xd7\x1a~!\x87\xee\x86\x9e5\
+J\xd19\xea\x05\xd3\xd7o\x8ch\x91&\xd6=\x12H\
+\xb5\xad\xfe\xac\x02f\x8f\x1a\x1a\xaa\xcf\xda\xe1T\xa3\x09\
+0\xd4\x0e\x9b\xe2ZF\xff\xec\x8e\xc1\x09&.l\xcc\
+\x8b7W\xf0\xd5\xb0\xa6\x9a9\xc2pab\xb4E\xad\
+\xcb\x1d\xa4\xdb\xdc\x04\x04\x86\x19n\x8d\xc30\xb1U9\
+O\xde\x07\x92%\xefOt\xae\xd3\xbe\xee\x10\x84I}\
+\xd1\xda\xf0Em.qF\x5c{\x1a\x17a\x0c+\xd0\
+\x1e\x80\xd9\x89\x98f\xaf\x8aB\xefo\xc2]j\x09\x81\
+\xed$uu\x0c\x01B\x99\x0c\xe5\x8f\x10+\x97\xc9>\
+?\xfa,\xc2\xca\xeb\x09\xa2\xf3~_J\x1d\x8c\xd8\x1c\
+\x0c\x1fP\x05Z\x87\xe0\x1b\x1e}f8\xf1-\xd1\xec\
+U\x82\xef-!5\x07o\xca\x9c\x04\xe21\xf9\x22\x9e\
+\x1fs-\xf9w\xb16\x06\xfa\x1a\xfeiC2\x07\xc5\
+\x0c\x5c\x8cg\x0a\x9c\xd4*\x9b3\x06\xf0\xcfn\xd6i\
+\xb1\xf7\xc4j@\x9f\xbc%(\x9c^\xa9\xfe\xf5\x9a\xa2\
+l\x06<\xb9=F\xed\x09\x94b\xec\xd6\x22lPM\
+\xbaI}5\x86\x83u\x98\xe7\x18\xfb\xc0o\xed\xde\xc6\
+!\xee\x95\xb0W\xa7YA\xc7+<Z\xc8\x83\xc42\
+*V\xdb\xd9\x00\x0e$CN\xd6\x87\x5c|\x18\x18\xe7\
+jW(\xe6\x0a\xe5`\xd2\x80\xb1\x91\x14\xb5\xe5\x84\xf1\
+\xb8?$b\xb7N\xe7\xf4Cj\x8b\x11F\xe5R:\
+\x84>p\xab\xd8)\x83j\xbc\xe212\x1e8\x98c\
+\xe4W\xc8\xc9\x17&\x81\xb4\xa5\xa5\x81\xf1fc\xa4\xae\
+\x09\x8aU$\x82,\xc8\xc3\xe2\x8d\x8aNP\xd2\xae\x0e\
+\xda|\xb2Z'J\x0c\x93\xd7\xf3\xabM\x01\x0b\xd6\xe6\
+\x8f\x02\xdc\x0an\xb1\x9cH\x9c[\xc2\xee\xe7i\x82|\
+\xab\xe2\xafG\xc9{\x07~\xfc\xbdZ\x8b\xdb\x1e\xfa\xaa\
+\xf2\x16\xea\x85<\xf9`\xa4n\xc8\xd4*7{\xd0y\
+&\xf8\xe3*\xf0e\x0b<\xef\x8b\x16<\xe7\xca\xc4,\
+\x9f\xa6\xb0H\xb2c\x04t|\x00\xaf\x95a\x93V\x13\
+\xf5\xbc\x87I\x0b\x17\x1e\x1bN\xfd\xceT\xbd\x98\xe7\x0d\
+Z\xe5\xfcw\xc2M\x82)\xa8K\xc0\xec\xc9\x83\x7fe\
+\x1eq1\xd6f\xcb|\xa5\x92?\xbee\x09\xd0[\x19\
+a\xc2?\x9c\xc8\xf2\x8d]\xce\xbfkqP\xd1\x1bg\
+\x8aO\xaa\xa9\x15\xddqf\xc5Zh\x04\xaf\xc5o\x89\
+\xd3\xbf\xaail\x96\xe27\xdd\xc0\x0c#93\xe3@\
+T\xe3\xa8\x0dB\xb8d5.\x19\xf0\x22\xe5|\xcf\xb0\
+m\xd7\xe9b\x1b\x8b}\xc9\xb0\xae\x9f?\x97\xa6$\x18\
+\x9d\xa0prnN\xa6d\xb1\x8a\xbd\x8b7\x1d(\x00\
+\xbd\x8e\x8cGn8\x12\x8e\xb7b\x92b'\xbcb\x10\
+\xacE*\x03\xff\xee\x9a.\xa2\xca*\xe5\x1e6}T\
+\xca\xd2\xb4\x18\xf0:\x93\x84=T\xf4\xa8$\xf1E\x0d\
+A\xc5u\x94,@\xd3T\xc7:\x96\x15#\xb6\x8c\xd3\
+Y\x10\xa3{\xef\xbf\x01\x9e\xed\xc5)\
+"
+
+qt_resource_name = b"\
+\x00\x0a\
+\x08\xce\x22\xb4\
+\x00d\
+\x00e\x00f\x00a\x00u\x00l\x00t\x00.\x00m\x00d\
+\x00\x08\
+\x08\xb6\x8e\xf9\
+\x003\
+\x00r\x00d\x00p\x00a\x00r\x00t\x00y\
+\x00\x0a\
+\x0c\xba\xf2|\
+\x00i\
+\x00n\x00d\x00e\x00x\x00.\x00h\x00t\x00m\x00l\
+\x00\x0c\
+\x08\xd0i\xc3\
+\x00m\
+\x00a\x00r\x00k\x00d\x00o\x00w\x00n\x00.\x00c\x00s\x00s\
+\x00\x09\
+\x09\x1b\x92\x13\
+\x00m\
+\x00a\x00r\x00k\x00e\x00d\x00.\x00j\x00s\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x1a\x00\x02\x00\x00\x00\x02\x00\x00\x00\x04\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01z.[\x95V\
+\x00\x00\x000\x00\x00\x00\x00\x00\x01\x00\x00\x01\xe1\
+\x00\x00\x01z.[\x95V\
+\x00\x00\x00J\x00\x01\x00\x00\x00\x01\x00\x00\x04\x97\
+\x00\x00\x01z.[\x95V\
+\x00\x00\x00h\x00\x01\x00\x00\x00\x01\x00\x00\x0a\xf1\
+\x00\x00\x01z.[\x95V\
+"
+
+def qInitResources():
+ QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/examples/webenginewidgets/markdowneditor/resources/3rdparty/MARKDOWN-LICENSE.txt b/examples/webenginewidgets/markdowneditor/resources/3rdparty/MARKDOWN-LICENSE.txt
new file mode 100644
index 000000000..23c52cc43
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/resources/3rdparty/MARKDOWN-LICENSE.txt
@@ -0,0 +1,16 @@
+Copyright 2011 Kevin Burke unless otherwise noted.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Some content is copyrighted by Twitter, Inc., and also released under an
+Apache License; these sections are noted in the source.
diff --git a/examples/webenginewidgets/markdowneditor/resources/3rdparty/MARKED-LICENSE.txt b/examples/webenginewidgets/markdowneditor/resources/3rdparty/MARKED-LICENSE.txt
new file mode 100644
index 000000000..8e3ba0e0a
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/resources/3rdparty/MARKED-LICENSE.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/examples/webenginewidgets/markdowneditor/resources/3rdparty/markdown.css b/examples/webenginewidgets/markdowneditor/resources/3rdparty/markdown.css
new file mode 100644
index 000000000..24fc2ffe2
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/resources/3rdparty/markdown.css
@@ -0,0 +1,260 @@
+body{
+ margin: 0 auto;
+ font-family: Georgia, Palatino, serif;
+ color: #444444;
+ line-height: 1;
+ max-width: 960px;
+ padding: 30px;
+}
+h1, h2, h3, h4 {
+ color: #111111;
+ font-weight: 400;
+}
+h1, h2, h3, h4, h5, p {
+ margin-bottom: 24px;
+ padding: 0;
+}
+h1 {
+ font-size: 48px;
+}
+h2 {
+ font-size: 36px;
+ /* The bottom margin is small. It's designed to be used with gray meta text
+ * below a post title. */
+ margin: 24px 0 6px;
+}
+h3 {
+ font-size: 24px;
+}
+h4 {
+ font-size: 21px;
+}
+h5 {
+ font-size: 18px;
+}
+a {
+ color: #0099ff;
+ margin: 0;
+ padding: 0;
+ vertical-align: baseline;
+}
+a:hover {
+ text-decoration: none;
+ color: #ff6600;
+}
+a:visited {
+ color: purple;
+}
+ul, ol {
+ padding: 0;
+ margin: 0;
+}
+li {
+ line-height: 24px;
+}
+li ul, li ul {
+ margin-left: 24px;
+}
+p, ul, ol {
+ font-size: 16px;
+ line-height: 24px;
+ max-width: 540px;
+}
+pre {
+ padding: 0px 24px;
+ max-width: 800px;
+ white-space: pre-wrap;
+}
+code {
+ font-family: Consolas, Monaco, Andale Mono, monospace;
+ line-height: 1.5;
+ font-size: 13px;
+}
+aside {
+ display: block;
+ float: right;
+ width: 390px;
+}
+blockquote {
+ border-left:.5em solid #eee;
+ padding: 0 2em;
+ margin-left:0;
+ max-width: 476px;
+}
+blockquote cite {
+ font-size:14px;
+ line-height:20px;
+ color:#bfbfbf;
+}
+blockquote cite:before {
+ content: '\2014 \00A0';
+}
+
+blockquote p {
+ color: #666;
+ max-width: 460px;
+}
+hr {
+ width: 540px;
+ text-align: left;
+ margin: 0 auto 0 0;
+ color: #999;
+}
+
+/* Code below this line is copyright Twitter Inc. */
+
+button,
+input,
+select,
+textarea {
+ font-size: 100%;
+ margin: 0;
+ vertical-align: baseline;
+ *vertical-align: middle;
+}
+button, input {
+ line-height: normal;
+ *overflow: visible;
+}
+button::-moz-focus-inner, input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ cursor: pointer;
+ -webkit-appearance: button;
+}
+input[type=checkbox], input[type=radio] {
+ cursor: pointer;
+}
+/* override default chrome & firefox settings */
+input:not([type="image"]), textarea {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+input[type="search"] {
+ -webkit-appearance: textfield;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+label,
+input,
+select,
+textarea {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ font-weight: normal;
+ line-height: normal;
+ margin-bottom: 18px;
+}
+input[type=checkbox], input[type=radio] {
+ cursor: pointer;
+ margin-bottom: 0;
+}
+input[type=text],
+input[type=password],
+textarea,
+select {
+ display: inline-block;
+ width: 210px;
+ padding: 4px;
+ font-size: 13px;
+ font-weight: normal;
+ line-height: 18px;
+ height: 18px;
+ color: #808080;
+ border: 1px solid #ccc;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+select, input[type=file] {
+ height: 27px;
+ line-height: 27px;
+}
+textarea {
+ height: auto;
+}
+
+/* grey out placeholders */
+:-moz-placeholder {
+ color: #bfbfbf;
+}
+::-webkit-input-placeholder {
+ color: #bfbfbf;
+}
+
+input[type=text],
+input[type=password],
+select,
+textarea {
+ -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+ -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+ transition: border linear 0.2s, box-shadow linear 0.2s;
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+input[type=text]:focus, input[type=password]:focus, textarea:focus {
+ outline: none;
+ border-color: rgba(82, 168, 236, 0.8);
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
+ -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+/* buttons */
+button {
+ display: inline-block;
+ padding: 4px 14px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ line-height: 18px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ background-color: #0064cd;
+ background-repeat: repeat-x;
+ background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));
+ background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
+ background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
+ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));
+ background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
+ background-image: -o-linear-gradient(top, #049cdb, #0064cd);
+ background-image: linear-gradient(top, #049cdb, #0064cd);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ border: 1px solid #004b9a;
+ border-bottom-color: #003f81;
+ -webkit-transition: 0.1s linear all;
+ -moz-transition: 0.1s linear all;
+ transition: 0.1s linear all;
+ border-color: #0064cd #0064cd #003f81;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
+button:hover {
+ color: #fff;
+ background-position: 0 -15px;
+ text-decoration: none;
+}
+button:active {
+ -webkit-box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+button::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
diff --git a/examples/webenginewidgets/markdowneditor/resources/3rdparty/marked.js b/examples/webenginewidgets/markdowneditor/resources/3rdparty/marked.js
new file mode 100644
index 000000000..33c02d9cf
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/resources/3rdparty/marked.js
@@ -0,0 +1,1514 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+
+;(function(root) {
+'use strict';
+
+/**
+ * Block-Level Grammar
+ */
+
+var block = {
+ newline: /^\n+/,
+ code: /^( {4}[^\n]+\n*)+/,
+ fences: noop,
+ hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+ heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
+ nptable: noop,
+ blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+ list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+ html: '^ {0,3}(?:' // optional indentation
+ + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
+ + '|comment[^\\n]*(\\n+|$)' // (2)
+ + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
+ + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
+ + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
+ + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
+ + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
+ + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
+ + ')',
+ def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+ table: noop,
+ lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+ paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
+ text: /^[^\n]+/
+};
+
+block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
+block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+block.def = edit(block.def)
+ .replace('label', block._label)
+ .replace('title', block._title)
+ .getRegex();
+
+block.bullet = /(?:[*+-]|\d+\.)/;
+block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+block.item = edit(block.item, 'gm')
+ .replace(/bull/g, block.bullet)
+ .getRegex();
+
+block.list = edit(block.list)
+ .replace(/bull/g, block.bullet)
+ .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
+ .replace('def', '\\n+(?=' + block.def.source + ')')
+ .getRegex();
+
+block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
+ + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
+ + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
+ + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
+ + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
+ + '|track|ul';
+block._comment = /<!--(?!-?>)[\s\S]*?-->/;
+block.html = edit(block.html, 'i')
+ .replace('comment', block._comment)
+ .replace('tag', block._tag)
+ .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
+ .getRegex();
+
+block.paragraph = edit(block.paragraph)
+ .replace('hr', block.hr)
+ .replace('heading', block.heading)
+ .replace('lheading', block.lheading)
+ .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
+ .getRegex();
+
+block.blockquote = edit(block.blockquote)
+ .replace('paragraph', block.paragraph)
+ .getRegex();
+
+/**
+ * Normal Block Grammar
+ */
+
+block.normal = merge({}, block);
+
+/**
+ * GFM Block Grammar
+ */
+
+block.gfm = merge({}, block.normal, {
+ fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
+ paragraph: /^/,
+ heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
+});
+
+block.gfm.paragraph = edit(block.paragraph)
+ .replace('(?!', '(?!'
+ + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+ + block.list.source.replace('\\1', '\\3') + '|')
+ .getRegex();
+
+/**
+ * GFM + Tables Block Grammar
+ */
+
+block.tables = merge({}, block.gfm, {
+ nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
+ table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
+});
+
+/**
+ * Pedantic grammar
+ */
+
+block.pedantic = merge({}, block.normal, {
+ html: edit(
+ '^ *(?:comment *(?:\\n|\\s*$)'
+ + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+ + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
+ .replace('comment', block._comment)
+ .replace(/tag/g, '(?!(?:'
+ + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
+ + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
+ + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
+ .getRegex(),
+ def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
+});
+
+/**
+ * Block Lexer
+ */
+
+function Lexer(options) {
+ this.tokens = [];
+ this.tokens.links = {};
+ this.options = options || marked.defaults;
+ this.rules = block.normal;
+
+ if (this.options.pedantic) {
+ this.rules = block.pedantic;
+ } else if (this.options.gfm) {
+ if (this.options.tables) {
+ this.rules = block.tables;
+ } else {
+ this.rules = block.gfm;
+ }
+ }
+}
+
+/**
+ * Expose Block Rules
+ */
+
+Lexer.rules = block;
+
+/**
+ * Static Lex Method
+ */
+
+Lexer.lex = function(src, options) {
+ var lexer = new Lexer(options);
+ return lexer.lex(src);
+};
+
+/**
+ * Preprocessing
+ */
+
+Lexer.prototype.lex = function(src) {
+ src = src
+ .replace(/\r\n|\r/g, '\n')
+ .replace(/\t/g, ' ')
+ .replace(/\u00a0/g, ' ')
+ .replace(/\u2424/g, '\n');
+
+ return this.token(src, true);
+};
+
+/**
+ * Lexing
+ */
+
+Lexer.prototype.token = function(src, top) {
+ src = src.replace(/^ +$/gm, '');
+ var next,
+ loose,
+ cap,
+ bull,
+ b,
+ item,
+ space,
+ i,
+ tag,
+ l,
+ isordered,
+ istask,
+ ischecked;
+
+ while (src) {
+ // newline
+ if (cap = this.rules.newline.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[0].length > 1) {
+ this.tokens.push({
+ type: 'space'
+ });
+ }
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ cap = cap[0].replace(/^ {4}/gm, '');
+ this.tokens.push({
+ type: 'code',
+ text: !this.options.pedantic
+ ? cap.replace(/\n+$/, '')
+ : cap
+ });
+ continue;
+ }
+
+ // fences (gfm)
+ if (cap = this.rules.fences.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'code',
+ lang: cap[2],
+ text: cap[3] || ''
+ });
+ continue;
+ }
+
+ // heading
+ if (cap = this.rules.heading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[1].length,
+ text: cap[2]
+ });
+ continue;
+ }
+
+ // table no leading pipe (gfm)
+ if (top && (cap = this.rules.nptable.exec(src))) {
+ item = {
+ type: 'table',
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+ };
+
+ if (item.header.length === item.align.length) {
+ src = src.substring(cap[0].length);
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = splitCells(item.cells[i], item.header.length);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+ }
+
+ // hr
+ if (cap = this.rules.hr.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'hr'
+ });
+ continue;
+ }
+
+ // blockquote
+ if (cap = this.rules.blockquote.exec(src)) {
+ src = src.substring(cap[0].length);
+
+ this.tokens.push({
+ type: 'blockquote_start'
+ });
+
+ cap = cap[0].replace(/^ *> ?/gm, '');
+
+ // Pass `top` to keep the current
+ // "toplevel" state. This is exactly
+ // how markdown.pl works.
+ this.token(cap, top);
+
+ this.tokens.push({
+ type: 'blockquote_end'
+ });
+
+ continue;
+ }
+
+ // list
+ if (cap = this.rules.list.exec(src)) {
+ src = src.substring(cap[0].length);
+ bull = cap[2];
+ isordered = bull.length > 1;
+
+ this.tokens.push({
+ type: 'list_start',
+ ordered: isordered,
+ start: isordered ? +bull : ''
+ });
+
+ // Get each top-level item.
+ cap = cap[0].match(this.rules.item);
+
+ next = false;
+ l = cap.length;
+ i = 0;
+
+ for (; i < l; i++) {
+ item = cap[i];
+
+ // Remove the list item's bullet
+ // so it is seen as the next token.
+ space = item.length;
+ item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+ // Outdent whatever the
+ // list item contains. Hacky.
+ if (~item.indexOf('\n ')) {
+ space -= item.length;
+ item = !this.options.pedantic
+ ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+ : item.replace(/^ {1,4}/gm, '');
+ }
+
+ // Determine whether the next list item belongs here.
+ // Backpedal if it does not belong in this list.
+ if (this.options.smartLists && i !== l - 1) {
+ b = block.bullet.exec(cap[i + 1])[0];
+ if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+ src = cap.slice(i + 1).join('\n') + src;
+ i = l - 1;
+ }
+ }
+
+ // Determine whether item is loose or not.
+ // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+ // for discount behavior.
+ loose = next || /\n\n(?!\s*$)/.test(item);
+ if (i !== l - 1) {
+ next = item.charAt(item.length - 1) === '\n';
+ if (!loose) loose = next;
+ }
+
+ // Check for task list items
+ istask = /^\[[ xX]\] /.test(item);
+ ischecked = undefined;
+ if (istask) {
+ ischecked = item[1] !== ' ';
+ item = item.replace(/^\[[ xX]\] +/, '');
+ }
+
+ this.tokens.push({
+ type: loose
+ ? 'loose_item_start'
+ : 'list_item_start',
+ task: istask,
+ checked: ischecked
+ });
+
+ // Recurse.
+ this.token(item, false);
+
+ this.tokens.push({
+ type: 'list_item_end'
+ });
+ }
+
+ this.tokens.push({
+ type: 'list_end'
+ });
+
+ continue;
+ }
+
+ // html
+ if (cap = this.rules.html.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: this.options.sanitize
+ ? 'paragraph'
+ : 'html',
+ pre: !this.options.sanitizer
+ && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+ text: cap[0]
+ });
+ continue;
+ }
+
+ // def
+ if (top && (cap = this.rules.def.exec(src))) {
+ src = src.substring(cap[0].length);
+ if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
+ tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+ if (!this.tokens.links[tag]) {
+ this.tokens.links[tag] = {
+ href: cap[2],
+ title: cap[3]
+ };
+ }
+ continue;
+ }
+
+ // table (gfm)
+ if (top && (cap = this.rules.table.exec(src))) {
+ item = {
+ type: 'table',
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
+ };
+
+ if (item.header.length === item.align.length) {
+ src = src.substring(cap[0].length);
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = splitCells(
+ item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
+ item.header.length);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+ }
+
+ // lheading
+ if (cap = this.rules.lheading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[2] === '=' ? 1 : 2,
+ text: cap[1]
+ });
+ continue;
+ }
+
+ // top-level paragraph
+ if (top && (cap = this.rules.paragraph.exec(src))) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'paragraph',
+ text: cap[1].charAt(cap[1].length - 1) === '\n'
+ ? cap[1].slice(0, -1)
+ : cap[1]
+ });
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ // Top-level should never reach here.
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'text',
+ text: cap[0]
+ });
+ continue;
+ }
+
+ if (src) {
+ throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return this.tokens;
+};
+
+/**
+ * Inline-Level Grammar
+ */
+
+var inline = {
+ escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+ autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+ url: noop,
+ tag: '^comment'
+ + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+ + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+ + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
+ + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
+ + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
+ link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
+ reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+ nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+ strong: /^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/,
+ em: /^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/,
+ code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
+ br: /^ {2,}\n(?!\s*$)/,
+ del: noop,
+ text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
+};
+
+inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
+
+inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
+inline.autolink = edit(inline.autolink)
+ .replace('scheme', inline._scheme)
+ .replace('email', inline._email)
+ .getRegex();
+
+inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+
+inline.tag = edit(inline.tag)
+ .replace('comment', block._comment)
+ .replace('attribute', inline._attribute)
+ .getRegex();
+
+inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
+inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/;
+inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+
+inline.link = edit(inline.link)
+ .replace('label', inline._label)
+ .replace('href', inline._href)
+ .replace('title', inline._title)
+ .getRegex();
+
+inline.reflink = edit(inline.reflink)
+ .replace('label', inline._label)
+ .getRegex();
+
+/**
+ * Normal Inline Grammar
+ */
+
+inline.normal = merge({}, inline);
+
+/**
+ * Pedantic Inline Grammar
+ */
+
+inline.pedantic = merge({}, inline.normal, {
+ strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+ em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
+ link: edit(/^!?\[(label)\]\((.*?)\)/)
+ .replace('label', inline._label)
+ .getRegex(),
+ reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
+ .replace('label', inline._label)
+ .getRegex()
+});
+
+/**
+ * GFM Inline Grammar
+ */
+
+inline.gfm = merge({}, inline.normal, {
+ escape: edit(inline.escape).replace('])', '~|])').getRegex(),
+ url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
+ .replace('email', inline._email)
+ .getRegex(),
+ _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+ del: /^~~(?=\S)([\s\S]*?\S)~~/,
+ text: edit(inline.text)
+ .replace(']|', '~]|')
+ .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
+ .getRegex()
+});
+
+/**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+inline.breaks = merge({}, inline.gfm, {
+ br: edit(inline.br).replace('{2,}', '*').getRegex(),
+ text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
+});
+
+/**
+ * Inline Lexer & Compiler
+ */
+
+function InlineLexer(links, options) {
+ this.options = options || marked.defaults;
+ this.links = links;
+ this.rules = inline.normal;
+ this.renderer = this.options.renderer || new Renderer();
+ this.renderer.options = this.options;
+
+ if (!this.links) {
+ throw new Error('Tokens array requires a `links` property.');
+ }
+
+ if (this.options.pedantic) {
+ this.rules = inline.pedantic;
+ } else if (this.options.gfm) {
+ if (this.options.breaks) {
+ this.rules = inline.breaks;
+ } else {
+ this.rules = inline.gfm;
+ }
+ }
+}
+
+/**
+ * Expose Inline Rules
+ */
+
+InlineLexer.rules = inline;
+
+/**
+ * Static Lexing/Compiling Method
+ */
+
+InlineLexer.output = function(src, links, options) {
+ var inline = new InlineLexer(links, options);
+ return inline.output(src);
+};
+
+/**
+ * Lexing/Compiling
+ */
+
+InlineLexer.prototype.output = function(src) {
+ var out = '',
+ link,
+ text,
+ href,
+ title,
+ cap;
+
+ while (src) {
+ // escape
+ if (cap = this.rules.escape.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += cap[1];
+ continue;
+ }
+
+ // autolink
+ if (cap = this.rules.autolink.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[2] === '@') {
+ text = escape(this.mangle(cap[1]));
+ href = 'mailto:' + text;
+ } else {
+ text = escape(cap[1]);
+ href = text;
+ }
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // url (gfm)
+ if (!this.inLink && (cap = this.rules.url.exec(src))) {
+ cap[0] = this.rules._backpedal.exec(cap[0])[0];
+ src = src.substring(cap[0].length);
+ if (cap[2] === '@') {
+ text = escape(cap[0]);
+ href = 'mailto:' + text;
+ } else {
+ text = escape(cap[0]);
+ if (cap[1] === 'www.') {
+ href = 'http://' + text;
+ } else {
+ href = text;
+ }
+ }
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // tag
+ if (cap = this.rules.tag.exec(src)) {
+ if (!this.inLink && /^<a /i.test(cap[0])) {
+ this.inLink = true;
+ } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
+ this.inLink = false;
+ }
+ src = src.substring(cap[0].length);
+ out += this.options.sanitize
+ ? this.options.sanitizer
+ ? this.options.sanitizer(cap[0])
+ : escape(cap[0])
+ : cap[0]
+ continue;
+ }
+
+ // link
+ if (cap = this.rules.link.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.inLink = true;
+ href = cap[2];
+ if (this.options.pedantic) {
+ link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+
+ if (link) {
+ href = link[1];
+ title = link[3];
+ } else {
+ title = '';
+ }
+ } else {
+ title = cap[3] ? cap[3].slice(1, -1) : '';
+ }
+ href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
+ out += this.outputLink(cap, {
+ href: InlineLexer.escapes(href),
+ title: InlineLexer.escapes(title)
+ });
+ this.inLink = false;
+ continue;
+ }
+
+ // reflink, nolink
+ if ((cap = this.rules.reflink.exec(src))
+ || (cap = this.rules.nolink.exec(src))) {
+ src = src.substring(cap[0].length);
+ link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+ link = this.links[link.toLowerCase()];
+ if (!link || !link.href) {
+ out += cap[0].charAt(0);
+ src = cap[0].substring(1) + src;
+ continue;
+ }
+ this.inLink = true;
+ out += this.outputLink(cap, link);
+ this.inLink = false;
+ continue;
+ }
+
+ // strong
+ if (cap = this.rules.strong.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
+ continue;
+ }
+
+ // em
+ if (cap = this.rules.em.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
+ continue;
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.codespan(escape(cap[2].trim(), true));
+ continue;
+ }
+
+ // br
+ if (cap = this.rules.br.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.br();
+ continue;
+ }
+
+ // del (gfm)
+ if (cap = this.rules.del.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.del(this.output(cap[1]));
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.text(escape(this.smartypants(cap[0])));
+ continue;
+ }
+
+ if (src) {
+ throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return out;
+};
+
+InlineLexer.escapes = function(text) {
+ return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
+}
+
+/**
+ * Compile Link
+ */
+
+InlineLexer.prototype.outputLink = function(cap, link) {
+ var href = link.href,
+ title = link.title ? escape(link.title) : null;
+
+ return cap[0].charAt(0) !== '!'
+ ? this.renderer.link(href, title, this.output(cap[1]))
+ : this.renderer.image(href, title, escape(cap[1]));
+};
+
+/**
+ * Smartypants Transformations
+ */
+
+InlineLexer.prototype.smartypants = function(text) {
+ if (!this.options.smartypants) return text;
+ return text
+ // em-dashes
+ .replace(/---/g, '\u2014')
+ // en-dashes
+ .replace(/--/g, '\u2013')
+ // opening singles
+ .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+ // closing singles & apostrophes
+ .replace(/'/g, '\u2019')
+ // opening doubles
+ .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+ // closing doubles
+ .replace(/"/g, '\u201d')
+ // ellipses
+ .replace(/\.{3}/g, '\u2026');
+};
+
+/**
+ * Mangle Links
+ */
+
+InlineLexer.prototype.mangle = function(text) {
+ if (!this.options.mangle) return text;
+ var out = '',
+ l = text.length,
+ i = 0,
+ ch;
+
+ for (; i < l; i++) {
+ ch = text.charCodeAt(i);
+ if (Math.random() > 0.5) {
+ ch = 'x' + ch.toString(16);
+ }
+ out += '&#' + ch + ';';
+ }
+
+ return out;
+};
+
+/**
+ * Renderer
+ */
+
+function Renderer(options) {
+ this.options = options || marked.defaults;
+}
+
+Renderer.prototype.code = function(code, lang, escaped) {
+ if (this.options.highlight) {
+ var out = this.options.highlight(code, lang);
+ if (out != null && out !== code) {
+ escaped = true;
+ code = out;
+ }
+ }
+
+ if (!lang) {
+ return '<pre><code>'
+ + (escaped ? code : escape(code, true))
+ + '</code></pre>';
+ }
+
+ return '<pre><code class="'
+ + this.options.langPrefix
+ + escape(lang, true)
+ + '">'
+ + (escaped ? code : escape(code, true))
+ + '</code></pre>\n';
+};
+
+Renderer.prototype.blockquote = function(quote) {
+ return '<blockquote>\n' + quote + '</blockquote>\n';
+};
+
+Renderer.prototype.html = function(html) {
+ return html;
+};
+
+Renderer.prototype.heading = function(text, level, raw) {
+ if (this.options.headerIds) {
+ return '<h'
+ + level
+ + ' id="'
+ + this.options.headerPrefix
+ + raw.toLowerCase().replace(/[^\w]+/g, '-')
+ + '">'
+ + text
+ + '</h'
+ + level
+ + '>\n';
+ }
+ // ignore IDs
+ return '<h' + level + '>' + text + '</h' + level + '>\n';
+};
+
+Renderer.prototype.hr = function() {
+ return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+};
+
+Renderer.prototype.list = function(body, ordered, start) {
+ var type = ordered ? 'ol' : 'ul',
+ startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
+ return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
+};
+
+Renderer.prototype.listitem = function(text) {
+ return '<li>' + text + '</li>\n';
+};
+
+Renderer.prototype.checkbox = function(checked) {
+ return '<input '
+ + (checked ? 'checked="" ' : '')
+ + 'disabled="" type="checkbox"'
+ + (this.options.xhtml ? ' /' : '')
+ + '> ';
+}
+
+Renderer.prototype.paragraph = function(text) {
+ return '<p>' + text + '</p>\n';
+};
+
+Renderer.prototype.table = function(header, body) {
+ if (body) body = '<tbody>' + body + '</tbody>';
+
+ return '<table>\n'
+ + '<thead>\n'
+ + header
+ + '</thead>\n'
+ + body
+ + '</table>\n';
+};
+
+Renderer.prototype.tablerow = function(content) {
+ return '<tr>\n' + content + '</tr>\n';
+};
+
+Renderer.prototype.tablecell = function(content, flags) {
+ var type = flags.header ? 'th' : 'td';
+ var tag = flags.align
+ ? '<' + type + ' align="' + flags.align + '">'
+ : '<' + type + '>';
+ return tag + content + '</' + type + '>\n';
+};
+
+// span level renderer
+Renderer.prototype.strong = function(text) {
+ return '<strong>' + text + '</strong>';
+};
+
+Renderer.prototype.em = function(text) {
+ return '<em>' + text + '</em>';
+};
+
+Renderer.prototype.codespan = function(text) {
+ return '<code>' + text + '</code>';
+};
+
+Renderer.prototype.br = function() {
+ return this.options.xhtml ? '<br/>' : '<br>';
+};
+
+Renderer.prototype.del = function(text) {
+ return '<del>' + text + '</del>';
+};
+
+Renderer.prototype.link = function(href, title, text) {
+ if (this.options.sanitize) {
+ try {
+ var prot = decodeURIComponent(unescape(href))
+ .replace(/[^\w:]/g, '')
+ .toLowerCase();
+ } catch (e) {
+ return text;
+ }
+ if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+ return text;
+ }
+ }
+ if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+ href = resolveUrl(this.options.baseUrl, href);
+ }
+ try {
+ href = encodeURI(href).replace(/%25/g, '%');
+ } catch (e) {
+ return text;
+ }
+ var out = '<a href="' + escape(href) + '"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += '>' + text + '</a>';
+ return out;
+};
+
+Renderer.prototype.image = function(href, title, text) {
+ if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+ href = resolveUrl(this.options.baseUrl, href);
+ }
+ var out = '<img src="' + href + '" alt="' + text + '"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += this.options.xhtml ? '/>' : '>';
+ return out;
+};
+
+Renderer.prototype.text = function(text) {
+ return text;
+};
+
+/**
+ * TextRenderer
+ * returns only the textual part of the token
+ */
+
+function TextRenderer() {}
+
+// no need for block level renderers
+
+TextRenderer.prototype.strong =
+TextRenderer.prototype.em =
+TextRenderer.prototype.codespan =
+TextRenderer.prototype.del =
+TextRenderer.prototype.text = function (text) {
+ return text;
+}
+
+TextRenderer.prototype.link =
+TextRenderer.prototype.image = function(href, title, text) {
+ return '' + text;
+}
+
+TextRenderer.prototype.br = function() {
+ return '';
+}
+
+/**
+ * Parsing & Compiling
+ */
+
+function Parser(options) {
+ this.tokens = [];
+ this.token = null;
+ this.options = options || marked.defaults;
+ this.options.renderer = this.options.renderer || new Renderer();
+ this.renderer = this.options.renderer;
+ this.renderer.options = this.options;
+}
+
+/**
+ * Static Parse Method
+ */
+
+Parser.parse = function(src, options) {
+ var parser = new Parser(options);
+ return parser.parse(src);
+};
+
+/**
+ * Parse Loop
+ */
+
+Parser.prototype.parse = function(src) {
+ this.inline = new InlineLexer(src.links, this.options);
+ // use an InlineLexer with a TextRenderer to extract pure text
+ this.inlineText = new InlineLexer(
+ src.links,
+ merge({}, this.options, {renderer: new TextRenderer()})
+ );
+ this.tokens = src.reverse();
+
+ var out = '';
+ while (this.next()) {
+ out += this.tok();
+ }
+
+ return out;
+};
+
+/**
+ * Next Token
+ */
+
+Parser.prototype.next = function() {
+ return this.token = this.tokens.pop();
+};
+
+/**
+ * Preview Next Token
+ */
+
+Parser.prototype.peek = function() {
+ return this.tokens[this.tokens.length - 1] || 0;
+};
+
+/**
+ * Parse Text Tokens
+ */
+
+Parser.prototype.parseText = function() {
+ var body = this.token.text;
+
+ while (this.peek().type === 'text') {
+ body += '\n' + this.next().text;
+ }
+
+ return this.inline.output(body);
+};
+
+/**
+ * Parse Current Token
+ */
+
+Parser.prototype.tok = function() {
+ switch (this.token.type) {
+ case 'space': {
+ return '';
+ }
+ case 'hr': {
+ return this.renderer.hr();
+ }
+ case 'heading': {
+ return this.renderer.heading(
+ this.inline.output(this.token.text),
+ this.token.depth,
+ unescape(this.inlineText.output(this.token.text)));
+ }
+ case 'code': {
+ return this.renderer.code(this.token.text,
+ this.token.lang,
+ this.token.escaped);
+ }
+ case 'table': {
+ var header = '',
+ body = '',
+ i,
+ row,
+ cell,
+ j;
+
+ // header
+ cell = '';
+ for (i = 0; i < this.token.header.length; i++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(this.token.header[i]),
+ { header: true, align: this.token.align[i] }
+ );
+ }
+ header += this.renderer.tablerow(cell);
+
+ for (i = 0; i < this.token.cells.length; i++) {
+ row = this.token.cells[i];
+
+ cell = '';
+ for (j = 0; j < row.length; j++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(row[j]),
+ { header: false, align: this.token.align[j] }
+ );
+ }
+
+ body += this.renderer.tablerow(cell);
+ }
+ return this.renderer.table(header, body);
+ }
+ case 'blockquote_start': {
+ body = '';
+
+ while (this.next().type !== 'blockquote_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.blockquote(body);
+ }
+ case 'list_start': {
+ body = '';
+ var ordered = this.token.ordered,
+ start = this.token.start;
+
+ while (this.next().type !== 'list_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.list(body, ordered, start);
+ }
+ case 'list_item_start': {
+ body = '';
+
+ if (this.token.task) {
+ body += this.renderer.checkbox(this.token.checked);
+ }
+
+ while (this.next().type !== 'list_item_end') {
+ body += this.token.type === 'text'
+ ? this.parseText()
+ : this.tok();
+ }
+
+ return this.renderer.listitem(body);
+ }
+ case 'loose_item_start': {
+ body = '';
+
+ while (this.next().type !== 'list_item_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.listitem(body);
+ }
+ case 'html': {
+ // TODO parse inline content if parameter markdown=1
+ return this.renderer.html(this.token.text);
+ }
+ case 'paragraph': {
+ return this.renderer.paragraph(this.inline.output(this.token.text));
+ }
+ case 'text': {
+ return this.renderer.paragraph(this.parseText());
+ }
+ }
+};
+
+/**
+ * Helpers
+ */
+
+function escape(html, encode) {
+ return html
+ .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/"/g, '&quot;')
+ .replace(/'/g, '&#39;');
+}
+
+function unescape(html) {
+ // explicitly match decimal, hex, and named HTML entities
+ return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
+ n = n.toLowerCase();
+ if (n === 'colon') return ':';
+ if (n.charAt(0) === '#') {
+ return n.charAt(1) === 'x'
+ ? String.fromCharCode(parseInt(n.substring(2), 16))
+ : String.fromCharCode(+n.substring(1));
+ }
+ return '';
+ });
+}
+
+function edit(regex, opt) {
+ regex = regex.source || regex;
+ opt = opt || '';
+ return {
+ replace: function(name, val) {
+ val = val.source || val;
+ val = val.replace(/(^|[^\[])\^/g, '$1');
+ regex = regex.replace(name, val);
+ return this;
+ },
+ getRegex: function() {
+ return new RegExp(regex, opt);
+ }
+ };
+}
+
+function resolveUrl(base, href) {
+ if (!baseUrls[' ' + base]) {
+ // we can ignore everything in base after the last slash of its path component,
+ // but we might need to add _that_
+ // https://tools.ietf.org/html/rfc3986#section-3
+ if (/^[^:]+:\/*[^/]*$/.test(base)) {
+ baseUrls[' ' + base] = base + '/';
+ } else {
+ baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
+ }
+ }
+ base = baseUrls[' ' + base];
+
+ if (href.slice(0, 2) === '//') {
+ return base.replace(/:[\s\S]*/, ':') + href;
+ } else if (href.charAt(0) === '/') {
+ return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
+ } else {
+ return base + href;
+ }
+}
+var baseUrls = {};
+var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+function noop() {}
+noop.exec = noop;
+
+function merge(obj) {
+ var i = 1,
+ target,
+ key;
+
+ for (; i < arguments.length; i++) {
+ target = arguments[i];
+ for (key in target) {
+ if (Object.prototype.hasOwnProperty.call(target, key)) {
+ obj[key] = target[key];
+ }
+ }
+ }
+
+ return obj;
+}
+
+function splitCells(tableRow, count) {
+ var cells = tableRow.replace(/([^\\])\|/g, '$1 |').split(/ +\| */),
+ i = 0;
+
+ if (cells.length > count) {
+ cells.splice(count);
+ } else {
+ while (cells.length < count) cells.push('');
+ }
+
+ for (; i < cells.length; i++) {
+ cells[i] = cells[i].replace(/\\\|/g, '|');
+ }
+ return cells;
+}
+
+/**
+ * Marked
+ */
+
+function marked(src, opt, callback) {
+ // throw error in case of non string input
+ if (typeof src === 'undefined' || src === null) {
+ throw new Error('marked(): input parameter is undefined or null');
+ }
+ if (typeof src !== 'string') {
+ throw new Error('marked(): input parameter is of type '
+ + Object.prototype.toString.call(src) + ', string expected');
+ }
+
+ if (callback || typeof opt === 'function') {
+ if (!callback) {
+ callback = opt;
+ opt = null;
+ }
+
+ opt = merge({}, marked.defaults, opt || {});
+
+ var highlight = opt.highlight,
+ tokens,
+ pending,
+ i = 0;
+
+ try {
+ tokens = Lexer.lex(src, opt)
+ } catch (e) {
+ return callback(e);
+ }
+
+ pending = tokens.length;
+
+ var done = function(err) {
+ if (err) {
+ opt.highlight = highlight;
+ return callback(err);
+ }
+
+ var out;
+
+ try {
+ out = Parser.parse(tokens, opt);
+ } catch (e) {
+ err = e;
+ }
+
+ opt.highlight = highlight;
+
+ return err
+ ? callback(err)
+ : callback(null, out);
+ };
+
+ if (!highlight || highlight.length < 3) {
+ return done();
+ }
+
+ delete opt.highlight;
+
+ if (!pending) return done();
+
+ for (; i < tokens.length; i++) {
+ (function(token) {
+ if (token.type !== 'code') {
+ return --pending || done();
+ }
+ return highlight(token.text, token.lang, function(err, code) {
+ if (err) return done(err);
+ if (code == null || code === token.text) {
+ return --pending || done();
+ }
+ token.text = code;
+ token.escaped = true;
+ --pending || done();
+ });
+ })(tokens[i]);
+ }
+
+ return;
+ }
+ try {
+ if (opt) opt = merge({}, marked.defaults, opt);
+ return Parser.parse(Lexer.lex(src, opt), opt);
+ } catch (e) {
+ e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+ if ((opt || marked.defaults).silent) {
+ return '<p>An error occurred:</p><pre>'
+ + escape(e.message + '', true)
+ + '</pre>';
+ }
+ throw e;
+ }
+}
+
+/**
+ * Options
+ */
+
+marked.options =
+marked.setOptions = function(opt) {
+ merge(marked.defaults, opt);
+ return marked;
+};
+
+marked.getDefaults = function () {
+ return {
+ baseUrl: null,
+ breaks: false,
+ gfm: true,
+ headerIds: true,
+ headerPrefix: '',
+ highlight: null,
+ langPrefix: 'language-',
+ mangle: true,
+ pedantic: false,
+ renderer: new Renderer(),
+ sanitize: false,
+ sanitizer: null,
+ silent: false,
+ smartLists: false,
+ smartypants: false,
+ tables: true,
+ xhtml: false
+ };
+}
+
+marked.defaults = marked.getDefaults();
+
+/**
+ * Expose
+ */
+
+marked.Parser = Parser;
+marked.parser = Parser.parse;
+
+marked.Renderer = Renderer;
+marked.TextRenderer = TextRenderer;
+
+marked.Lexer = Lexer;
+marked.lexer = Lexer.lex;
+
+marked.InlineLexer = InlineLexer;
+marked.inlineLexer = InlineLexer.output;
+
+marked.parse = marked;
+
+if (typeof module !== 'undefined' && typeof exports === 'object') {
+ module.exports = marked;
+} else if (typeof define === 'function' && define.amd) {
+ define(function() { return marked; });
+} else {
+ root.marked = marked;
+}
+})(this || (typeof window !== 'undefined' ? window : global));
diff --git a/examples/webenginewidgets/markdowneditor/resources/3rdparty/qt_attribution.json b/examples/webenginewidgets/markdowneditor/resources/3rdparty/qt_attribution.json
new file mode 100644
index 000000000..de5458eff
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/resources/3rdparty/qt_attribution.json
@@ -0,0 +1,35 @@
+[
+ {
+ "Id": "markdowneditor-marked",
+ "Name": "Marked (WebEngine Markdown Editor example)",
+ "QDocModule": "qtwebengine",
+ "QtUsage": "Marked is used in the WebEngine MarkDown Editor example",
+ "QtParts": [ "examples" ],
+ "Files": "marked.js",
+ "Description": "A full-featured markdown parser and compiler, written in JavaScript. Built for speed.",
+ "Homepage": "https://github.com/chjj/marked",
+ "Version": "0.4.0",
+ "DownloadLocation": "https://github.com/markedjs/marked/blob/0.4.0/lib/marked.js",
+ "Copyright": "Copyright (c) 2011-2018, Christopher Jeffrey",
+ "License": "MIT License",
+ "LicenseId": "MIT",
+ "LicenseFile": "MARKED-LICENSE.txt"
+ },
+ {
+ "Id": "markdowneditor-markdowncss",
+ "Name": "Markdown.css (WebEngine Markdown Editor example)",
+ "QDocModule": "qtwebengine",
+ "QtUsage": "markdown.css is used in the WebEngine MarkDown Editor example",
+ "QtParts": [ "examples" ],
+ "Files": "markdown.css",
+ "Description": "Markdown.css is better default styling for your Markdown files.",
+ "Homepage": "https://kevinburke.bitbucket.io/markdowncss/",
+ "Version": "188530e4b5d020d7e237fc6b26be13ebf4a8def3",
+ "DownloadLocation": "https://bitbucket.org/kevinburke/markdowncss/src/188530e4b5d020d7e237fc6b26be13ebf4a8def3/markdown.css",
+ "Copyright": "Copyright 2011 Kevin Burke
+ Copyright Twitter Inc.",
+ "License": "Apache License 2.0",
+ "LicenseId": "Apache-2.0",
+ "LicenseFile": "MARKDOWN-LICENSE.txt"
+ }
+]
diff --git a/examples/webenginewidgets/markdowneditor/resources/default.md b/examples/webenginewidgets/markdowneditor/resources/default.md
new file mode 100644
index 000000000..af835fa4d
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/resources/default.md
@@ -0,0 +1,12 @@
+## WebEngine Markdown Editor Example
+
+This example uses [QWebEngineView](http://doc.qt.io/qt-5/qwebengineview.html)
+to preview text written using the [Markdown](https://en.wikipedia.org/wiki/Markdown)
+syntax.
+
+### Acknowledgments
+
+The conversion from Markdown to HTML is done with the help of the
+[marked JavaScript library](https://github.com/chjj/marked) by _Christopher Jeffrey_.
+The [style sheet](https://kevinburke.bitbucket.io/markdowncss/)
+was created by _Kevin Burke_.
diff --git a/examples/webenginewidgets/markdowneditor/resources/index.html b/examples/webenginewidgets/markdowneditor/resources/index.html
new file mode 100644
index 000000000..289a2110b
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/resources/index.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<html lang="en">
+<meta charset="utf-8">
+<head>
+ <link rel="stylesheet" type="text/css" href="3rdparty/markdown.css">
+ <script src="3rdparty/marked.js"></script>
+ <script src="qrc:/qtwebchannel/qwebchannel.js"></script>
+</head>
+<body>
+ <div id="placeholder"></div>
+ <script>
+ 'use strict';
+
+ var placeholder = document.getElementById('placeholder');
+
+ var updateText = function(text) {
+ placeholder.innerHTML = marked(text);
+ }
+
+ new QWebChannel(qt.webChannelTransport,
+ function(channel) {
+ var content = channel.objects.content;
+ updateText(content.text);
+ content.textChanged.connect(updateText);
+ }
+ );
+ </script>
+</body>
+</html>
+
+
+
diff --git a/examples/webenginewidgets/markdowneditor/resources/markdowneditor.qrc b/examples/webenginewidgets/markdowneditor/resources/markdowneditor.qrc
new file mode 100644
index 000000000..bc738f1cf
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/resources/markdowneditor.qrc
@@ -0,0 +1,8 @@
+<RCC>
+ <qresource prefix="/">
+ <file>default.md</file>
+ <file>index.html</file>
+ <file>3rdparty/markdown.css</file>
+ <file>3rdparty/marked.js</file>
+ </qresource>
+</RCC>
diff --git a/examples/webenginewidgets/markdowneditor/ui_mainwindow.py b/examples/webenginewidgets/markdowneditor/ui_mainwindow.py
new file mode 100644
index 000000000..305108324
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/ui_mainwindow.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'mainwindow.ui'
+##
+## Created by: Qt User Interface Compiler version 6.2.0
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
+ QCursor, QFont, QFontDatabase, QGradient,
+ QIcon, QImage, QKeySequence, QLinearGradient,
+ QPainter, QPalette, QPixmap, QRadialGradient,
+ QTransform)
+from PySide6.QtWebEngineWidgets import QWebEngineView
+from PySide6.QtWidgets import (QApplication, QHBoxLayout, QMainWindow, QMenu,
+ QMenuBar, QPlainTextEdit, QSizePolicy, QSplitter,
+ QStatusBar, QWidget)
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ if not MainWindow.objectName():
+ MainWindow.setObjectName(u"MainWindow")
+ MainWindow.resize(800, 600)
+ self.actionOpen = QAction(MainWindow)
+ self.actionOpen.setObjectName(u"actionOpen")
+ self.actionSave = QAction(MainWindow)
+ self.actionSave.setObjectName(u"actionSave")
+ self.actionExit = QAction(MainWindow)
+ self.actionExit.setObjectName(u"actionExit")
+ self.actionSaveAs = QAction(MainWindow)
+ self.actionSaveAs.setObjectName(u"actionSaveAs")
+ self.actionNew = QAction(MainWindow)
+ self.actionNew.setObjectName(u"actionNew")
+ self.centralwidget = QWidget(MainWindow)
+ self.centralwidget.setObjectName(u"centralwidget")
+ self.horizontalLayout = QHBoxLayout(self.centralwidget)
+ self.horizontalLayout.setObjectName(u"horizontalLayout")
+ self.splitter = QSplitter(self.centralwidget)
+ self.splitter.setObjectName(u"splitter")
+ self.splitter.setOrientation(Qt.Horizontal)
+ self.editor = QPlainTextEdit(self.splitter)
+ self.editor.setObjectName(u"editor")
+ self.splitter.addWidget(self.editor)
+ self.preview = QWebEngineView(self.splitter)
+ self.preview.setObjectName(u"preview")
+ self.splitter.addWidget(self.preview)
+
+ self.horizontalLayout.addWidget(self.splitter)
+
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QMenuBar(MainWindow)
+ self.menubar.setObjectName(u"menubar")
+ self.menubar.setGeometry(QRect(0, 0, 800, 26))
+ self.menu_File = QMenu(self.menubar)
+ self.menu_File.setObjectName(u"menu_File")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QStatusBar(MainWindow)
+ self.statusbar.setObjectName(u"statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.menubar.addAction(self.menu_File.menuAction())
+ self.menu_File.addAction(self.actionNew)
+ self.menu_File.addAction(self.actionOpen)
+ self.menu_File.addAction(self.actionSave)
+ self.menu_File.addAction(self.actionSaveAs)
+ self.menu_File.addSeparator()
+ self.menu_File.addAction(self.actionExit)
+
+ self.retranslateUi(MainWindow)
+
+ QMetaObject.connectSlotsByName(MainWindow)
+ # setupUi
+
+ def retranslateUi(self, MainWindow):
+ MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MarkDown Editor", None))
+ self.actionOpen.setText(QCoreApplication.translate("MainWindow", u"&Open...", None))
+#if QT_CONFIG(tooltip)
+ self.actionOpen.setToolTip(QCoreApplication.translate("MainWindow", u"Open document", None))
+#endif // QT_CONFIG(tooltip)
+#if QT_CONFIG(shortcut)
+ self.actionOpen.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+O", None))
+#endif // QT_CONFIG(shortcut)
+ self.actionSave.setText(QCoreApplication.translate("MainWindow", u"&Save", None))
+#if QT_CONFIG(tooltip)
+ self.actionSave.setToolTip(QCoreApplication.translate("MainWindow", u"Save current document", None))
+#endif // QT_CONFIG(tooltip)
+#if QT_CONFIG(shortcut)
+ self.actionSave.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+S", None))
+#endif // QT_CONFIG(shortcut)
+ self.actionExit.setText(QCoreApplication.translate("MainWindow", u"E&xit", None))
+#if QT_CONFIG(tooltip)
+ self.actionExit.setToolTip(QCoreApplication.translate("MainWindow", u"Exit editor", None))
+#endif // QT_CONFIG(tooltip)
+#if QT_CONFIG(shortcut)
+ self.actionExit.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+Q", None))
+#endif // QT_CONFIG(shortcut)
+ self.actionSaveAs.setText(QCoreApplication.translate("MainWindow", u"Save &As...", None))
+#if QT_CONFIG(tooltip)
+ self.actionSaveAs.setToolTip(QCoreApplication.translate("MainWindow", u"Save document under different name", None))
+#endif // QT_CONFIG(tooltip)
+ self.actionNew.setText(QCoreApplication.translate("MainWindow", u"&New", None))
+#if QT_CONFIG(tooltip)
+ self.actionNew.setToolTip(QCoreApplication.translate("MainWindow", u"Create new document", None))
+#endif // QT_CONFIG(tooltip)
+#if QT_CONFIG(shortcut)
+ self.actionNew.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+N", None))
+#endif // QT_CONFIG(shortcut)
+ self.menu_File.setTitle(QCoreApplication.translate("MainWindow", u"&File", None))
+ # retranslateUi
+
diff --git a/examples/webenginewidgets/simplebrowser/simplebrowser.py b/examples/webenginewidgets/simplebrowser/simplebrowser.py
index 021d5311e..e3f45356b 100644
--- a/examples/webenginewidgets/simplebrowser/simplebrowser.py
+++ b/examples/webenginewidgets/simplebrowser/simplebrowser.py
@@ -98,7 +98,7 @@ class MainWindow(QMainWindow):
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWin = MainWindow()
- availableGeometry = app.desktop().availableGeometry(mainWin)
+ availableGeometry = mainWin.screen().availableGeometry()
mainWin.resize(availableGeometry.width() * 2 / 3, availableGeometry.height() * 2 / 3)
mainWin.show()
sys.exit(app.exec())
diff --git a/examples/widgets/dialogs/tabdialog/doc/tabdialog.png b/examples/widgets/dialogs/tabdialog/doc/tabdialog.png
new file mode 100644
index 000000000..a92af5f9c
--- /dev/null
+++ b/examples/widgets/dialogs/tabdialog/doc/tabdialog.png
Binary files differ
diff --git a/examples/widgets/dialogs/tabdialog/doc/tabdialog.rst b/examples/widgets/dialogs/tabdialog/doc/tabdialog.rst
new file mode 100644
index 000000000..162316f54
--- /dev/null
+++ b/examples/widgets/dialogs/tabdialog/doc/tabdialog.rst
@@ -0,0 +1,13 @@
+Tab Dialog Example
+===================
+
+Shows how to construct a tab dialog using the QTabWidget class.
+
+The Tab Dialog example consists of a single TabDialog class
+that provides three tabs, each containing information about
+a particular file, and two standard push buttons that are
+used to accept or reject the contents of the dialog.
+
+.. image:: tabdialog.png
+ :width: 753
+ :alt: tabdialog screenshot
diff --git a/examples/widgets/dialogs/tabdialog/tabdialog.py b/examples/widgets/dialogs/tabdialog/tabdialog.py
new file mode 100644
index 000000000..986c5af21
--- /dev/null
+++ b/examples/widgets/dialogs/tabdialog/tabdialog.py
@@ -0,0 +1,215 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide6 port of the widgets/dialogs/tabdialog example from Qt v6.x"""
+
+import sys
+
+from PySide6.QtCore import QFileInfo
+from PySide6.QtWidgets import (
+ QWidget,
+ QVBoxLayout,
+ QLabel,
+ QCheckBox,
+ QApplication,
+ QDialog,
+ QTabWidget,
+ QLineEdit,
+ QDialogButtonBox,
+ QFrame,
+ QListWidget,
+ QGroupBox,
+)
+
+
+class TabDialog(QDialog):
+ def __init__(self, file_name: str, parent: QWidget = None):
+ super().__init__(parent)
+
+ file_info = QFileInfo(file_name)
+
+ tab_widget = QTabWidget()
+ tab_widget.addTab(GeneralTab(file_info, self), "General")
+ tab_widget.addTab(PermissionsTab(file_info, self), "Permissions")
+ tab_widget.addTab(ApplicationsTab(file_info, self), "Applications")
+
+ button_box = QDialogButtonBox(
+ QDialogButtonBox.Ok | QDialogButtonBox.Cancel
+ )
+
+ button_box.accepted.connect(self.accept)
+ button_box.rejected.connect(self.reject)
+
+ main_layout = QVBoxLayout()
+ main_layout.addWidget(tab_widget)
+ main_layout.addWidget(button_box)
+ self.setLayout(main_layout)
+ self.setWindowTitle("Tab Dialog")
+
+
+class GeneralTab(QWidget):
+ def __init__(self, file_info: QFileInfo, parent: QWidget):
+ super().__init__(parent)
+
+ file_name_label = QLabel("File Name:")
+ file_name_edit = QLineEdit(file_info.fileName())
+
+ path_label = QLabel("Path:")
+ path_value_label = QLabel(file_info.absoluteFilePath())
+ path_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ size_label = QLabel("Size:")
+ size = file_info.size() / 1024
+ size_value_label = QLabel(f"{size} K")
+ size_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ last_read_label = QLabel("Last Read:")
+ last_read_value_label = QLabel(file_info.lastRead().toString())
+ last_read_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ last_mod_label = QLabel("Last Modified:")
+ last_mod_value_label = QLabel(file_info.lastModified().toString())
+ last_mod_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ main_layout = QVBoxLayout()
+ main_layout.addWidget(file_name_label)
+ main_layout.addWidget(file_name_edit)
+ main_layout.addWidget(path_label)
+ main_layout.addWidget(path_value_label)
+ main_layout.addWidget(size_label)
+ main_layout.addWidget(size_value_label)
+ main_layout.addWidget(last_read_label)
+ main_layout.addWidget(last_read_value_label)
+ main_layout.addWidget(last_mod_label)
+ main_layout.addWidget(last_mod_value_label)
+ main_layout.addStretch(1)
+ self.setLayout(main_layout)
+
+
+class PermissionsTab(QWidget):
+ def __init__(self, file_info: QFileInfo, parent: QWidget):
+ super().__init__(parent)
+
+ permissions_group = QGroupBox("Permissions")
+
+ readable = QCheckBox("Readable")
+ if file_info.isReadable():
+ readable.setChecked(True)
+
+ writable = QCheckBox("Writable")
+ if file_info.isWritable():
+ writable.setChecked(True)
+
+ executable = QCheckBox("Executable")
+ if file_info.isExecutable():
+ executable.setChecked(True)
+
+ owner_group = QGroupBox("Ownership")
+
+ owner_label = QLabel("Owner")
+ owner_value_label = QLabel(file_info.owner())
+ owner_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ group_label = QLabel("Group")
+ group_value_label = QLabel(file_info.group())
+ group_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ permissions_layout = QVBoxLayout()
+ permissions_layout.addWidget(readable)
+ permissions_layout.addWidget(writable)
+ permissions_layout.addWidget(executable)
+ permissions_group.setLayout(permissions_layout)
+
+ owner_layout = QVBoxLayout()
+ owner_layout.addWidget(owner_label)
+ owner_layout.addWidget(owner_value_label)
+ owner_layout.addWidget(group_label)
+ owner_layout.addWidget(group_value_label)
+ owner_group.setLayout(owner_layout)
+
+ main_layout = QVBoxLayout()
+ main_layout.addWidget(permissions_group)
+ main_layout.addWidget(owner_group)
+ main_layout.addStretch(1)
+ self.setLayout(main_layout)
+
+
+class ApplicationsTab(QWidget):
+ def __init__(self, file_info: QFileInfo, parent: QWidget):
+ super().__init__(parent)
+
+ top_label = QLabel("Open with:")
+
+ applications_list_box = QListWidget()
+ applications = []
+
+ for i in range(1, 31):
+ applications.append(f"Application {i}")
+ applications_list_box.insertItems(0, applications)
+
+ if not file_info.suffix():
+ always_check_box = QCheckBox(
+ "Always use this application to open this type of file"
+ )
+ else:
+ always_check_box = QCheckBox(
+ f"Always use this application to open files "
+ f"with the extension {file_info.suffix()}"
+ )
+
+ layout = QVBoxLayout()
+ layout.addWidget(top_label)
+ layout.addWidget(applications_list_box)
+ layout.addWidget(always_check_box)
+ self.setLayout(layout)
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ if len(sys.argv) >= 2:
+ file_name = sys.argv[1]
+ else:
+ file_name = "."
+
+ tab_dialog = TabDialog(file_name)
+ tab_dialog.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/dialogs/tabdialog/tabdialog.pyproject b/examples/widgets/dialogs/tabdialog/tabdialog.pyproject
new file mode 100644
index 000000000..f121cd804
--- /dev/null
+++ b/examples/widgets/dialogs/tabdialog/tabdialog.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["tabdialog.py"]
+}
diff --git a/examples/widgets/layouts/borderlayout/borderlayout.py b/examples/widgets/layouts/borderlayout/borderlayout.py
new file mode 100644
index 000000000..74d5524e4
--- /dev/null
+++ b/examples/widgets/layouts/borderlayout/borderlayout.py
@@ -0,0 +1,285 @@
+############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide6 port of the widgets/layouts/borderlayout example from Qt v5.x"""
+
+from dataclasses import dataclass
+from enum import IntEnum, auto
+
+from PySide6.QtCore import QRect, QSize, Qt
+from PySide6.QtWidgets import (
+ QApplication,
+ QFrame,
+ QLabel,
+ QLayout,
+ QLayoutItem,
+ QTextBrowser,
+ QWidget,
+ QWidgetItem,
+)
+import sys
+
+
+class Position(IntEnum):
+ West = auto()
+ North = auto()
+ South = auto()
+ East = auto()
+ Center = auto()
+
+
+class SizeType(IntEnum):
+ MinimumSize = auto()
+ SizeHint = auto()
+
+
+@dataclass
+class ItemWrapper:
+ item: QLayoutItem
+ position: Position
+
+
+class BorderLayout(QLayout):
+ def __init__(self, parent=None, spacing: int = -1):
+ super().__init__(parent)
+
+ self._list: list[ItemWrapper] = []
+
+ self.setSpacing(spacing)
+
+ if parent is not None:
+ self.setParent(parent)
+
+ def __del__(self):
+ item = self.takeAt(0)
+ while item:
+ item = self.takeAt(0)
+
+ def addItem(self, item: QLayoutItem):
+ self.add(item, Position.West)
+
+ def addWidget(self, widget: QWidget, position: Position):
+ self.add(QWidgetItem(widget), position)
+
+ def expandingDirections(self) -> Qt.Orientations:
+ return Qt.Horizontal | Qt.Vertical
+
+ def hasHeightForWidth(self) -> bool:
+ return False
+
+ def count(self) -> int:
+ return len(self._list)
+
+ def itemAt(self, index: int) -> QLayoutItem:
+ if index < len(self._list):
+ wrapper: ItemWrapper = self._list[index]
+ return wrapper.item
+ return None
+
+ def minimumSize(self) -> QSize:
+ return self.calculate_size(SizeType.MinimumSize)
+
+ def setGeometry(self, rect: QRect):
+ center: ItemWrapper = None
+ east_width = 0
+ west_width = 0
+ north_height = 0
+ south_height = 0
+
+ super().setGeometry(rect)
+
+ for wrapper in self._list:
+ item: QLayoutItem = wrapper.item
+ position: Position = wrapper.position
+
+ if position == Position.North:
+ item.setGeometry(
+ QRect(
+ rect.x(), north_height, rect.width(), item.sizeHint().height()
+ )
+ )
+
+ north_height += item.geometry().height() + self.spacing()
+
+ elif position == Position.South:
+ item.setGeometry(
+ QRect(
+ item.geometry().x(),
+ item.geometry().y(),
+ rect.width(),
+ item.sizeHint().height(),
+ )
+ )
+
+ south_height += item.geometry().height() + self.spacing()
+
+ item.setGeometry(
+ QRect(
+ rect.x(),
+ rect.y() + rect.height() - south_height + self.spacing(),
+ item.geometry().width(),
+ item.geometry().height(),
+ )
+ )
+ elif position == Position.Center:
+ center = wrapper
+
+ center_height = rect.height() - north_height - south_height
+
+ for wrapper in self._list:
+ item: QLayoutItem = wrapper.item
+ position: Position = wrapper.position
+
+ if position == Position.West:
+ item.setGeometry(
+ QRect(
+ rect.x() + west_width,
+ north_height,
+ item.sizeHint().width(),
+ center_height,
+ )
+ )
+
+ west_width += item.geometry().width() + self.spacing()
+
+ elif position == Position.East:
+ item.setGeometry(
+ QRect(
+ item.geometry().x(),
+ item.geometry().y(),
+ item.sizeHint().width(),
+ center_height,
+ )
+ )
+
+ east_width += item.geometry().width() + self.spacing()
+
+ item.setGeometry(
+ QRect(
+ rect.x() + rect.width() - east_width + self.spacing(),
+ north_height,
+ item.geometry().width(),
+ item.geometry().height(),
+ )
+ )
+
+ if center:
+ center.item.setGeometry(
+ QRect(
+ west_width,
+ north_height,
+ rect.width() - east_width - west_width,
+ center_height,
+ )
+ )
+
+ def sizeHint(self) -> QSize:
+ return self.calculate_size(SizeType.SizeHint)
+
+ def takeAt(self, index: int):
+ if 0 <= index < len(self._list):
+ layout_struct: ItemWrapper = self._list.pop(index)
+ return layout_struct.item
+ return None
+
+ def add(self, item: QLayoutItem, position: Position):
+ self._list.append(ItemWrapper(item, position))
+
+ def calculate_size(self, size_type: SizeType):
+ total_size = QSize()
+
+ for wrapper in self._list:
+ position = wrapper.position
+
+ item_size: QSize
+ if size_type == SizeType.MinimumSize:
+ item_size = wrapper.item.minimumSize()
+ else:
+ item_size = wrapper.item.sizeHint()
+
+ if position in (Position.North, Position.South, Position.Center):
+ total_size.setHeight(total_size.height() + item_size.height())
+
+ if position in (Position.West, Position.East, Position.Center):
+ total_size.setWidth(total_size.width() + item_size.width())
+
+ return total_size
+
+
+class Window(QWidget):
+ def __init__(self):
+ super().__init__()
+ self.central_widget = QTextBrowser()
+ self.central_widget.setPlainText("Central widget")
+
+ border_layout = BorderLayout()
+ border_layout.addWidget(self.central_widget, Position.Center)
+
+ label_north = self.create_label("North")
+ border_layout.addWidget(label_north, Position.North)
+
+ label_west = self.create_label("West")
+ border_layout.addWidget(label_west, Position.West)
+
+ label_east1 = self.create_label("East 1")
+ border_layout.addWidget(label_east1, Position.East)
+
+ label_east2 = self.create_label("East 2")
+ border_layout.addWidget(label_east2, Position.East)
+
+ label_south = self.create_label("South")
+ border_layout.addWidget(label_south, Position.South)
+
+ self.setLayout(border_layout)
+
+ self.setWindowTitle("Border Layout")
+
+ @staticmethod
+ def create_label(text: str):
+ label = QLabel(text)
+ label.setFrameStyle(QFrame.Box | QFrame.Raised)
+ return label
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/layouts/borderlayout/borderlayout.pyproject b/examples/widgets/layouts/borderlayout/borderlayout.pyproject
new file mode 100644
index 000000000..fc0280348
--- /dev/null
+++ b/examples/widgets/layouts/borderlayout/borderlayout.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["borderlayout.py"]
+}
diff --git a/examples/widgets/layouts/borderlayout/doc/borderlayout.png b/examples/widgets/layouts/borderlayout/doc/borderlayout.png
new file mode 100644
index 000000000..8599b9d1c
--- /dev/null
+++ b/examples/widgets/layouts/borderlayout/doc/borderlayout.png
Binary files differ
diff --git a/examples/widgets/layouts/borderlayout/doc/borderlayout.rst b/examples/widgets/layouts/borderlayout/doc/borderlayout.rst
new file mode 100644
index 000000000..652f84daa
--- /dev/null
+++ b/examples/widgets/layouts/borderlayout/doc/borderlayout.rst
@@ -0,0 +1,10 @@
+Border Layout Example
+=======================
+
+Shows how to arrange child widgets along a border.
+
+Border Layout implements a layout that arranges child widgets to surround the main area.
+
+.. image:: borderlayout.png
+ :width: 473
+ :alt: border layout Screenshot
diff --git a/examples/widgets/layouts/flowlayout/flowlayout.py b/examples/widgets/layouts/flowlayout/flowlayout.py
index 431515687..f58dd7e96 100644
--- a/examples/widgets/layouts/flowlayout/flowlayout.py
+++ b/examples/widgets/layouts/flowlayout/flowlayout.py
@@ -1,4 +1,3 @@
-
############################################################################
##
## Copyright (C) 2013 Riverbank Computing Limited.
@@ -40,12 +39,11 @@
##
#############################################################################
-"""PySide6 port of the widgets/layouts/flowlayout example from Qt v5.x"""
+"""PySide6 port of the widgets/layouts/flowlayout example from Qt v6.x"""
import sys
from PySide6.QtCore import Qt, QMargins, QPoint, QRect, QSize
-from PySide6.QtWidgets import (QApplication, QLayout, QPushButton,
- QSizePolicy, QWidget)
+from PySide6.QtWidgets import QApplication, QLayout, QPushButton, QSizePolicy, QWidget
class Window(QWidget):
@@ -72,9 +70,9 @@ class FlowLayout(QLayout):
self._item_list = []
def __del__(self):
- item = self.take_at(0)
+ item = self.takeAt(0)
while item:
- item = self.take_at(0)
+ item = self.takeAt(0)
def addItem(self, item):
self._item_list.append(item)
@@ -83,19 +81,19 @@ class FlowLayout(QLayout):
return len(self._item_list)
def itemAt(self, index):
- if index >= 0 and index < len(self._item_list):
+ if 0 <= index < len(self._item_list):
return self._item_list[index]
return None
def takeAt(self, index):
- if index >= 0 and index < len(self._item_list):
+ if 0 <= index < len(self._item_list):
return self._item_list.pop(index)
return None
def expandingDirections(self):
- return Qt.Orientations(Qt.Orientation(0))
+ return Qt.Orientation(0)
def hasHeightForWidth(self):
return True
@@ -117,8 +115,7 @@ class FlowLayout(QLayout):
for item in self._item_list:
size = size.expandedTo(item.minimumSize())
- size += QSize(2 * self.contentsMargins().top(),
- 2 * self.contentsMargins().top())
+ size += QSize(2 * self.contentsMargins().top(), 2 * self.contentsMargins().top())
return size
def _do_layout(self, rect, test_only):
@@ -129,12 +126,12 @@ class FlowLayout(QLayout):
for item in self._item_list:
style = item.widget().style()
- layout_spacing_x = style.layoutSpacing(QSizePolicy.PushButton,
- QSizePolicy.PushButton,
- Qt.Horizontal)
- layout_spacing_y = style.layoutSpacing(QSizePolicy.PushButton,
- QSizePolicy.PushButton,
- Qt.Vertical)
+ layout_spacing_x = style.layoutSpacing(
+ QSizePolicy.PushButton, QSizePolicy.PushButton, Qt.Horizontal
+ )
+ layout_spacing_y = style.layoutSpacing(
+ QSizePolicy.PushButton, QSizePolicy.PushButton, Qt.Vertical
+ )
space_x = spacing + layout_spacing_x
space_y = spacing + layout_spacing_y
next_x = x + item.sizeHint().width() + space_x
@@ -153,7 +150,7 @@ class FlowLayout(QLayout):
return y + line_height - rect.y()
-if __name__ == '__main__':
+if __name__ == "__main__":
app = QApplication(sys.argv)
main_win = Window()
main_win.show()
diff --git a/examples/widgets/painting/plot/plot.py b/examples/widgets/painting/plot/plot.py
new file mode 100644
index 000000000..156a6408d
--- /dev/null
+++ b/examples/widgets/painting/plot/plot.py
@@ -0,0 +1,105 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import math
+import sys
+
+from PySide6.QtWidgets import QWidget, QApplication
+from PySide6.QtCore import QPoint, QRect, QTimer, Qt, Slot
+from PySide6.QtGui import (QColor, QPainter, QPaintEvent, QPen, QPointList,
+ QTransform)
+
+
+WIDTH = 680
+HEIGHT = 480
+
+
+class PlotWidget(QWidget):
+ """Illustrates the use of opaque containers. QPointList
+ wraps a C++ QList<QPoint> directly, removing the need to convert
+ a Python list in each call to QPainter.drawPolyline()."""
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._timer = QTimer(self)
+ self._timer.setInterval(20)
+ self._timer.timeout.connect(self.shift)
+
+ self._points = QPointList()
+ self._x = 0
+ self._delta_x = 0.05
+ self._half_height = HEIGHT / 2
+ self._factor = 0.8 * self._half_height
+
+ for i in range(WIDTH):
+ self._points.append(QPoint(i, self.next_point()))
+
+ self.setFixedSize(WIDTH, HEIGHT)
+
+ self._timer.start()
+
+ def next_point(self):
+ result = self._half_height - self._factor * math.sin(self._x)
+ self._x += self._delta_x
+ return result
+
+ def shift(self):
+ last_x = self._points[WIDTH - 1].x()
+ self._points.pop_front()
+ self._points.append(QPoint(last_x + 1, self.next_point()))
+ self.update()
+
+ def paintEvent(self, event):
+ painter = QPainter()
+ painter.begin(self)
+ rect = QRect(QPoint(0, 0), self.size())
+ painter.fillRect(rect, Qt.white)
+ painter.translate(-self._points[0].x(), 0)
+ painter.drawPolyline(self._points)
+ painter.end()
+
+
+if __name__ == "__main__":
+
+ app = QApplication(sys.argv)
+
+ w = PlotWidget()
+ w.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/painting/plot/plot.pyproject b/examples/widgets/painting/plot/plot.pyproject
new file mode 100644
index 000000000..0ac776c83
--- /dev/null
+++ b/examples/widgets/painting/plot/plot.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["plot.py"]
+}
diff --git a/examples/widgets/state-machine/pingpong/pingpong.py b/examples/widgets/state-machine/ping_pong/ping_pong.py
index cd047a29d..cd047a29d 100644
--- a/examples/widgets/state-machine/pingpong/pingpong.py
+++ b/examples/widgets/state-machine/ping_pong/ping_pong.py
diff --git a/examples/widgets/state-machine/ping_pong/ping_pong.pyproject b/examples/widgets/state-machine/ping_pong/ping_pong.pyproject
new file mode 100644
index 000000000..7fb430352
--- /dev/null
+++ b/examples/widgets/state-machine/ping_pong/ping_pong.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["ping_pong.py"]
+}
diff --git a/examples/widgets/state-machine/pingpong/pingpong.pyproject b/examples/widgets/state-machine/pingpong/pingpong.pyproject
deleted file mode 100644
index 67b48e5ab..000000000
--- a/examples/widgets/state-machine/pingpong/pingpong.pyproject
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "files": ["pingpong.py"]
-}
diff --git a/examples/widgets/threads/thread_signals.py b/examples/widgets/thread_signals/thread_signals.py
index 43c79f4b7..43c79f4b7 100644
--- a/examples/widgets/threads/thread_signals.py
+++ b/examples/widgets/thread_signals/thread_signals.py
diff --git a/examples/widgets/threads/thread_signals.pyproject b/examples/widgets/thread_signals/thread_signals.pyproject
index e36f7633c..e36f7633c 100644
--- a/examples/widgets/threads/thread_signals.pyproject
+++ b/examples/widgets/thread_signals/thread_signals.pyproject
diff --git a/sources/pyside6/PySide6/Qt3DCore/typesystem_3dcore.xml b/sources/pyside6/PySide6/Qt3DCore/typesystem_3dcore.xml
index 6db64f877..ffe3fd958 100644
--- a/sources/pyside6/PySide6/Qt3DCore/typesystem_3dcore.xml
+++ b/sources/pyside6/PySide6/Qt3DCore/typesystem_3dcore.xml
@@ -43,7 +43,6 @@
<typesystem package="PySide6.Qt3DCore">
<load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
<namespace-type name="Qt3DCore" generate-using="no">
- <enum-type name="ChangeFlag" flags="ChangeFlags"/>
<object-type name="QAbstractAspect"/>
<object-type name="QAbstractFunctor" since="6.0"/>
<object-type name="QAbstractSkeleton" since="5.10"/>
diff --git a/sources/pyside6/PySide6/QtCore/CMakeLists.txt b/sources/pyside6/PySide6/QtCore/CMakeLists.txt
index eaacd8a5a..00ed9a62c 100644
--- a/sources/pyside6/PySide6/QtCore/CMakeLists.txt
+++ b/sources/pyside6/PySide6/QtCore/CMakeLists.txt
@@ -28,6 +28,7 @@ ${QtCore_GEN_DIR}/qbytearray_frombase64result_wrapper.cpp
${QtCore_GEN_DIR}/qbytearray_wrapper.cpp
${QtCore_GEN_DIR}/qbytearraymatcher_wrapper.cpp
${QtCore_GEN_DIR}/qcalendar_wrapper.cpp
+${QtCore_GEN_DIR}/qcalendar_systemid_wrapper.cpp
${QtCore_GEN_DIR}/qcalendar_yearmonthday_wrapper.cpp
${QtCore_GEN_DIR}/qcborarray_wrapper.cpp
${QtCore_GEN_DIR}/qcborerror_wrapper.cpp
diff --git a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
index 889756db5..2c0a81b4d 100644
--- a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
+++ b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
@@ -42,21 +42,16 @@
<typesystem package="PySide6.QtCore">
<load-typesystem name="templates/core_common.xml" generate="no"/>
- <custom-type name="str"/>
- <custom-type name="PyBytes"/>
- <custom-type name="PyByteArray"/>
- <custom-type name="PyCallable"/>
- <custom-type name="PyObject"/>
- <custom-type name="PyPathLike"/>
- <custom-type name="PySequence"/>
- <custom-type name="PyTypeObject"/>
- <custom-type name="PyUnicode"/>
<custom-type name="list of QAbstractAnimation"/>
<custom-type name="PySideSignalInstance"
check-function="PySide::Signal::checkInstanceType"/>
<!--
<function signature="qChecksum(QByteArrayView data, Qt::ChecksumType)"/>
-->
+ <extra-includes>
+ <include file-name="signalmanager.h" location="global"/>
+ </extra-includes>
+
<function signature="qFastCos(qreal)" since="4.6"/>
<function signature="qFastSin(qreal)" since="4.6"/>
<function signature="qFuzzyCompare(double,double)"/>
@@ -95,26 +90,19 @@
<rejection class="QMetaObject" function-name="activate"/>
<rejection class="QMetaObject" function-name="metacall"/>
<rejection class="QMetaObject" function-name="static_metacall"/>
- <!-- TODO: Support to addGuard(QObject**) -->
- <rejection class="QMetaObject" function-name="addGuard"/>
- <rejection class="QMetaObject" function-name="changeGuard"/>
- <rejection class="QMetaObject" function-name="removeGuard"/>
<rejection class="QAlgorithmsPrivate"/>
<rejection class="QJsonPrivate"/>
- <rejection class="QTextStreamFunctions"/>
<rejection class="QtGlobalStatic"/>
<rejection class="QtMetaTypePrivate"/>
<rejection class="QtPrivate"/>
<rejection class="QtSharedPointer"/>
<rejection class="QtStringBuilder"/>
- <rejection class="QByteArray" field-name="MaxSize"/>
<rejection class="QChildEvent" field-name="c"/>
<rejection class="QTimerEvent" field-name="id"/>
<rejection class="QEvent" field-name="t"/>
<rejection class="*" function-name="tr"/>
- <rejection class="*" function-name="trUtf8"/>
<rejection class="*" function-name="qt_metacast"/>
<!-- From Qt4.6 -->
<rejection class="*" field-name="d_ptr"/>
@@ -132,20 +120,10 @@
<rejection class="*" function-name="qFreeAligned"/>
<rejection class="QMetaMethod" enum-name="Attributes"/>
- <rejection class="*" argument-type="QByteArrayDataPtr"/>
<rejection class="*" argument-type="^qfloat16&amp;?$"/>
- <rejection class="*" argument-type="QHashData"/>
- <rejection class="*" argument-type="QHashData::Node*"/>
<rejection class="*" argument-type="QLatin1String"/>
- <rejection class="*" argument-type="QLinkedListData*"/>
- <rejection class="*" argument-type="QListData::ArrayCompatibleLayout"/>
- <rejection class="*" argument-type="QListData::Data*"/>
- <rejection class="*" argument-type="QListData::NotArrayCompatibleLayout"/>
- <rejection class="*" argument-type="QList::Node*"/>
<rejection class="*" argument-type="QTSMFI"/>
<rejection class="*" argument-type="QTSMFC"/>
- <rejection class="*" argument-type="QMutexData*"/>
- <rejection class="*" argument-type="QObjectUserData*"/>
<rejection class="*" argument-type="QtPrivate::QSlotObjectBase*"/>
<rejection class="*" argument-type="^Q\w+Private( const)?\&amp;$"/>
<!-- Note: "QHelpModel(QHelpEnginePrivate*)" is needed -->
@@ -167,6 +145,7 @@
<enum-type name="QtMsgType"/>
<enum-type name="QCborSimpleType" since="5.12"/>
<enum-type name="QCborKnownTags" since="5.12"/>
+ <enum-type name="QCborTag"/>
<primitive-type name="qint8"/>
<primitive-type name="qint16"/>
@@ -175,39 +154,26 @@
<primitive-type name="quint16"/>
<primitive-type name="quint32"/>
<primitive-type name="quint64"/>
- <primitive-type name="double"/>
<primitive-type name="qreal"/>
- <primitive-type name="float"/>
<primitive-type name="qint64"/>
- <primitive-type name="unsigned long long"/>
- <primitive-type name="long long"/>
<primitive-type name="qlonglong" target-lang-api-name="PyLong"/>
<primitive-type name="qulonglong" target-lang-api-name="PyLong"/>
<primitive-type name="qsizetype" target-lang-api-name="PyLong"/>
<primitive-type name="size_t" target-lang-api-name="PyLong"/>
- <primitive-type name="short"/>
- <primitive-type name="signed short"/>
- <primitive-type name="signed short int"/>
- <primitive-type name="ushort" target-lang-api-name="PyInt"/>
- <primitive-type name="unsigned short int"/>
- <primitive-type name="unsigned short"/>
- <primitive-type name="char"/>
- <primitive-type name="signed char"/>
+ <primitive-type name="ushort" target-lang-api-name="PyLong"/>
<primitive-type name="uchar"/>
- <primitive-type name="unsigned char"/>
- <primitive-type name="int"/>
- <primitive-type name="signed int"/>
<primitive-type name="uint"/>
<primitive-type name="ulong"/>
- <primitive-type name="unsigned int"/>
- <primitive-type name="signed long"/>
- <primitive-type name="signed long int"/>
- <primitive-type name="long"/>
- <primitive-type name="unsigned long int"/>
- <primitive-type name="unsigned long">
- <!-- FIXME APIExtractor or shiboken do not support multiple includes by primitive type -->
- <include file-name="signalmanager.h" location="global"/>
- </primitive-type>
+ <primitive-type name="int8_t"/>
+ <primitive-type name="uint8_t"/>
+ <primitive-type name="int16_t"/>
+ <primitive-type name="uint16_t"/>
+ <primitive-type name="int32_t"/>
+ <primitive-type name="uint32_t"/>
+ <primitive-type name="int64_t"/>
+ <primitive-type name="uint64_t"/>
+ <primitive-type name="intptr_t"/>
+ <primitive-type name="uintptr_t"/>
<?if windows darwin?>
<primitive-type name="Qt::HANDLE" target-lang-api-name="PyObject"/>
@@ -216,15 +182,6 @@
<primitive-type name="Qt::HANDLE" target-lang-api-name="PyLong"/>
<?endif?>
- <primitive-type name="bool" target-lang-api-name="PyBool">
- <conversion-rule>
- <native-to-target file="../glue/qtcore.cpp" snippet="return-pybool"/>
- <target-to-native>
- <add-conversion type="PyBool" file="../glue/qtcore.cpp" snippet="conversion-pybool"/>
- </target-to-native>
- </conversion-rule>
- </primitive-type>
-
<!-- Qt5: add the new pointer-ish types -->
<primitive-type name="qintptr" target-lang-api-name="PyLong">
<conversion-rule>
@@ -269,12 +226,19 @@
</conversion-rule>
</primitive-type>
+ <primitive-type name="QAnyStringView" target-lang-api-name="PyUnicode" view-on="QString">
+ <include file-name="QAnyStringView" location="global"/>
+ <conversion-rule>
+ <native-to-target file="../glue/qtcore.cpp" snippet="return-pyunicode-from-qanystringview"/>
+ </conversion-rule>
+ </primitive-type>
+
<primitive-type name="QChar">
<conversion-rule>
<native-to-target file="../glue/qtcore.cpp" snippet="return-pyunicode-qchar"/>
<target-to-native>
<add-conversion type="PyString" check="Shiboken::String::checkChar(%in)" file="../glue/qtcore.cpp" snippet="conversion-pystring-char"/>
- <add-conversion type="PyInt" file="../glue/qtcore.cpp" snippet="conversion-pyint"/>
+ <add-conversion type="PyLong" file="../glue/qtcore.cpp" snippet="conversion-pyint"/>
<add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-pynone"/>
</target-to-native>
</conversion-rule>
@@ -289,8 +253,6 @@
<add-conversion type="QString" check="Shiboken::String::check(%in)" file="../glue/qtcore.cpp" snippet="conversion-qstring"/>
<add-conversion type="QByteArray" file="../glue/qtcore.cpp" snippet="conversion-qbytearray"/>
<add-conversion type="PyFloat" check="PyFloat_CheckExact(%in)" file="../glue/qtcore.cpp" snippet="conversion-pyfloat"/>
- <!-- Using PyLong instead of PyInt to support Python2 and 3-->
- <add-conversion type="PyInt" check="PyInt_CheckExact(%in)" file="../glue/qtcore.cpp" snippet="conversion-qlonglong"/>
<add-conversion type="PyLong" check="PyLong_CheckExact(%in)" file="../glue/qtcore.cpp" snippet="conversion-qlonglong"/>
<add-conversion type="SbkEnumType" file="../glue/qtcore.cpp" snippet="conversion-pyint"/>
<add-conversion type="SbkObject" file="../glue/qtcore.cpp" snippet="conversion-sbkobject"/>
@@ -407,7 +369,8 @@
</container-type>
<!-- FIXME: Which one is it going to be? -->
- <container-type name="QList" type="list">
+ <container-type name="QList" type="list"
+ opaque-containers="int:QIntList;QPoint:QPointList;QPointF:QPointFList">
<include file-name="QList" location="global"/>
<declare-function signature="append(T)" return-type="void"/>
<declare-function signature="insert(qsizetype,T)" return-type="void"/>
@@ -818,10 +781,7 @@
<object-type name="QBasicTimer"/>
<value-type name="QByteArrayMatcher"/>
<value-type name="QCalendar" since="5.14">
- <!-- Avoid clashes between size_t/enum System -->
- <modify-function signature="QCalendar(QCalendar::System)" overload-number="0"/>
- <modify-function signature="QCalendar(QStringView)" overload-number="1"/>
- <modify-function signature="QCalendar(size_t)" overload-number="2"/>
+ <object-type name="SystemId"/> <!-- not default-constructible -->
<value-type name="YearMonthDay"/>
<enum-type name="System"/>
</value-type>
@@ -1595,8 +1555,7 @@
tag in Qt6? -->
<declare-function signature="QItemSelection()" return-type="QItemSelection" />
<!-- The __add__ function creates a result list, instead of using the inherited type.
- Solved for now by removing and re-adding with the correct type. -->
- <modify-function signature="operator+(QList&lt;QItemSelectionRange&gt;)const" remove="all" />
+ Fixed by adding with the correct type. -->
<add-function signature="operator+(QItemSelection)" return-type="QItemSelection">
<inject-code class="target" position="beginning" file="../glue/qtcore.cpp" snippet="qitemselection-add"/>
</add-function>
@@ -2852,11 +2811,27 @@
<parent index="this" action="add"/>
</modify-argument>
</modify-function>
+ <add-function signature="start(PyCallable,int @priority@=0)">
+ <inject-code class="target" position="beginning"
+ file="../glue/qtcore.cpp"
+ snippet="std-function-void-lambda"/>
+ <inject-code class="target" position="beginning"
+ file="../glue/qtcore.cpp"
+ snippet="qthreadpool-start"/>
+ </add-function>
<modify-function signature="tryStart(QRunnable*)" allow-thread="yes">
<modify-argument index="1">
<parent index="this" action="add"/>
</modify-argument>
</modify-function>
+ <add-function signature="tryStart(PyCallable)" return-type="bool">
+ <inject-code class="target" position="beginning"
+ file="../glue/qtcore.cpp"
+ snippet="std-function-void-lambda"/>
+ <inject-code class="target" position="beginning"
+ file="../glue/qtcore.cpp"
+ snippet="qthreadpool-trystart"/>
+ </add-function>
<modify-function signature="tryTake(QRunnable*)" allow-thread="yes"/>
<modify-function signature="globalInstance()" >
@@ -3171,82 +3146,22 @@
<enum-type name="Sizes"/>
</object-type>
- <suppress-warning text="Unable to decide type of property: 'QLibrary::LoadHints' in class 'QPluginLoader'"/>
- <suppress-warning text="enum '_ISalnum' does not have a type entry or is not an enum"/>
- <suppress-warning text="enum 'Qt::Initialization' does not have a type entry or is not an enum"/>
+ <suppress-warning text="^.*enum 'Qt::Initialization' does not have a type entry.*$"/>
+ <suppress-warning text="^Anonymous enum.*does not have a type entry.*$"/>
<suppress-warning text="Visibility of function '*' modified in class '*'"/>
<suppress-warning text="hiding of function '*' in class '*'"/>
- <suppress-warning text="namespace '*' does not have a type entry"/>
- <suppress-warning text="Shadowing: QObject::parent()const and QAbstractItemModel::parent() const"/>
- <suppress-warning text="namespace '*' for enum 'QtMsgType' is not declared"/>
- <suppress-warning text="horribly broken type 'imaxdiv_t'"/>
- <suppress-warning text="horribly broken type '__off64_t'"/>
- <suppress-warning text="horribly broken type 'div_t'"/>
- <suppress-warning text="horribly broken type 'fd_set*'"/>
- <suppress-warning text="horribly broken type 'ldiv_t'"/>
- <suppress-warning text="horribly broken type 'lldiv_t'"/>
- <suppress-warning text="signal '*' in class '*' is overloaded."/>
- <suppress-warning text="enum 'enum_3' does not have a type entry or is not an enum"/>
- <suppress-warning text="Shadowing: QFile::fileName() const and QTemporaryFile::fileName() const"/>
- <suppress-warning text="unhandled enum value: ~0u in Qt::GestureType"/>
- <suppress-warning text="unhandled enum value: (sizeof(void*)&lt;&lt;3) in QSysInfo::Sizes"/>
- <suppress-warning text="unmatched enum ~0u"/>
- <suppress-warning text="unmatched enum (sizeof(void*)&lt;&lt;3)"/>
- <suppress-warning text="^signature 'setCustomType(float)' for function modification in 'QEasingCurve' not found.*$"/>
- <suppress-warning text="enum 'enum_4' does not have a type entry or is not an enum"/>
- <suppress-warning text="enum 'enum_5' does not have a type entry or is not an enum"/>
- <suppress-warning text="enum 'FP_NORMAL' does not have a type entry or is not an enum"/>
<suppress-warning text="Shadowing: *"/>
+ <suppress-warning text="namespace '*' does not have a type entry"/>
<!-- QCborStreamReader: Suppress warnings about 32/64bit signatures not found depending on qsizetype -->
<suppress-warning text="^signature 'readStringChunk\(char.*in 'QCborStreamReader' not found.*$"/>
- <!-- this enum is defined on Qt global header but only used in QtGui module -->
- <suppress-warning text="enum 'PM_MessageBoxHeight' does not have a type entry or is not an enum"/>
-
- <!-- this function only exists on Windows -->
- <suppress-warning text="^signature 'winEventFilter(MSG*,long*)' for function modification in 'QCoreApplication' not found.*"/>
-
- <!-- this is necessary to avoid warning on other modules -->
- <suppress-warning text="^signature 'operator*(QByteArray,const char*)' for function modification in 'QByteArray' not found.*"/>
- <suppress-warning text="^signature 'operator+(QByteArray,QString)' for function modification in 'QByteArray' not found.*"/>
-
- <!-- This enum is intenaly used -->
- <suppress-warning text="enum 'PM_CbaIconHeight' does not have a type entry or is not an enum"/>
-
<!-- TODO: this need be removed -->
<suppress-warning text="^skipping function '.*', unmatched return type '.*$"/>
<suppress-warning text="^skipping function '.*', unmatched type '.*$"/>
-
- <suppress-warning text="enum 'q_static_assert_result39' does not have a type entry or is not an enum"/>
- <suppress-warning text="horribly broken type ''"/>
- <suppress-warning text="Pure virtual method 'QTextCodec::convertFromUnicode(const QChar*,int,QTextCodec::ConverterState*)const' must be implement but was completely removed on type system."/>
-
- <!-- Qt5.5: No idea how to get rid of the following five enums, which are moved elsewhere since 5.5: -->
- <suppress-warning text="enum 'QLocale::MeasurementSystem' is specified in typesystem, but not declared"/>
- <suppress-warning text="enum 'QState::RestorePolicy' is specified in typesystem, but not declared"/>
- <!-- <suppress-warning text="enum 'QLocale::FormatType' is specified in typesystem, but not declared"/> -->
- <suppress-warning text="enum 'QAbstractAnimation::DeletionPolicy' is specified in typesystem, but not declared"/>
- <!-- <suppress-warning text="enum 'QAbstractAnimation::State' is specified in typesystem, but not declared"/> -->
- <!-- Qt5.5: we also suppress these warnings, instead of adding wrong enums -->
- <suppress-warning text="enum 'InterfaceType' does not have a type entry or is not an enum"/>
- <suppress-warning text="enum 'TextBoundaryType' does not have a type entry or is not an enum"/>
- <suppress-warning text="enum 'RelationFlag' does not have a type entry or is not an enum"/>
- <suppress-warning text="enum 'Role' does not have a type entry or is not an enum"/>
-
- <!-- Anonymous enum in qtbase/src/corelib/global/qtypeinfo.h -->
- <suppress-warning text="Anonymous enum (Q_COMPLEX_TYPE, ... , Q_RELOCATABLE_TYPE) does not have a type entry"/>
-
- <!-- Another anonymous enum / value pair in in qtbase/src/corelib/kernel/qcoreapplication.h -->
- <suppress-warning text="no matching enum 'QT_VERSION'"/>
- <suppress-warning text="unhandled enum value: QT_VERSION in QCoreApplication::ApplicationFlags from header 'qcoreapplication.h'"/>
- <suppress-warning text="unmatched enum QT_VERSION from header 'qcoreapplication.h'"/>
-
- <suppress-warning text="skipping field 'QSysInfo::WindowsVersion' with unmatched type 'const QSysInfo::WinVersion'"/>
+ <suppress-warning text="skipping field 'QStringConverter::iface' with unmatched type 'QStringConverter::Interface'"/>
+ <suppress-warning text="skipping field 'Qt::Uninitialized' with unmatched type 'Qt::Initialization'"/>
+ <suppress-warning text="skipping field 'State::clearFn' with unmatched type 'void'"/>
<suppress-warning text="template baseclass 'QListSpecialMethods&lt;T&gt;' of 'QList' is not known"/>
+ <suppress-warning text="^.*inherits from a non polymorphic type.*QIODeviceBase.*type discovery based on RTTI is impossible.*$"/>
- <suppress-warning text="skipping field 'QSysInfo::MacintoshVersion' with unmatched type 'QSysInfo::MacVersion'"/>
- <suppress-warning text="skipping field 'QSysInfo::WindowsVersion' with unmatched type 'QSysInfo::MacVersion'"/>
- <suppress-warning text="enum 'QSysInfo::MacVersion' does not have a type entry or is not an enum"/>
- <suppress-warning text="enum 'QSysInfo::WinVersion' does not have a type entry or is not an enum"/>
- <suppress-warning text="enum 'QSysInfo::Endian' is specified in typesystem, but not declared"/>
</typesystem>
diff --git a/sources/pyside6/PySide6/QtDBus/typesystem_dbus.xml b/sources/pyside6/PySide6/QtDBus/typesystem_dbus.xml
index f6b45496d..fc0126acb 100644
--- a/sources/pyside6/PySide6/QtDBus/typesystem_dbus.xml
+++ b/sources/pyside6/PySide6/QtDBus/typesystem_dbus.xml
@@ -131,4 +131,5 @@
<object-type name="QDBusVariant"/>
<object-type name="QDBusVirtualObject"/>
<suppress-warning text='^.*Unable to translate type "QDBusReply&lt;.*$'/>
+ <suppress-warning text='^.*QDBusPendingCallWatcher inherits from a non polymorphic type.*$'/>
</typesystem>
diff --git a/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml b/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml
index 66f0784e8..11f89cf8a 100644
--- a/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml
+++ b/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml
@@ -287,11 +287,14 @@
snippet="dataproxy-setrow"/>
</add-function>
- <modify-function signature="resetArray(QSurfaceDataArray*)">
+ <modify-function signature="resetArray(QSurfaceDataArray*)" remove="all"/>
+ <add-function signature="resetArray(const QSurfaceDataArray&amp;)">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-resetarray"/>
<modify-argument index="1">
<parent index="this" action="add"/>
</modify-argument>
- </modify-function>
+ </add-function>
</object-type>
<object-type name="Q3DBars">
<modify-function signature="addAxis(QAbstract3DAxis*)">
diff --git a/sources/pyside6/PySide6/QtDesigner/typesystem_designer.xml b/sources/pyside6/PySide6/QtDesigner/typesystem_designer.xml
index 4235dfc0a..9bdc63d18 100644
--- a/sources/pyside6/PySide6/QtDesigner/typesystem_designer.xml
+++ b/sources/pyside6/PySide6/QtDesigner/typesystem_designer.xml
@@ -134,4 +134,5 @@
<!-- Suppress all QString */int * out parameters -->
<suppress-warning text="^There's no user provided way.*handle the primitive type.*$"/>
<suppress-warning text="^.*skipping abstract function.*QtResourceSet.*$"/>
+ <suppress-warning text="^.*skipping abstract function.*DomUI.*$"/>
</typesystem>
diff --git a/sources/pyside6/PySide6/QtGui/CMakeLists.txt b/sources/pyside6/PySide6/QtGui/CMakeLists.txt
index 13b80ef28..5bdb38253 100644
--- a/sources/pyside6/PySide6/QtGui/CMakeLists.txt
+++ b/sources/pyside6/PySide6/QtGui/CMakeLists.txt
@@ -10,6 +10,7 @@ ${QtGui_GEN_DIR}/qabstracttextdocumentlayout_paintcontext_wrapper.cpp
${QtGui_GEN_DIR}/qabstracttextdocumentlayout_selection_wrapper.cpp
${QtGui_GEN_DIR}/qabstracttextdocumentlayout_wrapper.cpp
${QtGui_GEN_DIR}/qaccessible_wrapper.cpp
+${QtGui_GEN_DIR}/qaccessibleactioninterface_wrapper.cpp
${QtGui_GEN_DIR}/qaccessibleeditabletextinterface_wrapper.cpp
${QtGui_GEN_DIR}/qaccessibleevent_wrapper.cpp
${QtGui_GEN_DIR}/qaccessibleobject_wrapper.cpp
diff --git a/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml b/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml
index 6e9332068..a22e9c85c 100644
--- a/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml
+++ b/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml
@@ -45,7 +45,25 @@
<load-typesystem name="templates/gui_common.xml" generate="no"/>
<load-typesystem name="templates/opengl_common.xml" generate="no"/>
- <custom-type name="PyArrayObject"/>
+ <?if !darwin?>
+ <?entity GLint int?>
+ <?entity GLuint unsigned int?>
+ <?entity GLbyte unsigned char?>
+ <?entity GLboolean unsigned char?>
+ <?entity GLsizei int?>
+ <?entity GLsizeiptr long?>
+ <?entity GLintptr long?>
+ <?endif?>
+
+ <?if darwin?>
+ <?entity GLint int32_t?>
+ <?entity GLuint uint32_t?>
+ <?entity GLbyte uint8_t?>
+ <?entity GLboolean uint8_t?>
+ <?entity GLsizei int32_t?>
+ <?entity GLsizeiptr intptr_t?>
+ <?entity GLintptr intptr_t?>
+ <?endif?>
<rejection class="^Q.*$" argument-type="^QPlatform.*$"/>
<function signature="qAlpha(uint)"/>
@@ -104,6 +122,8 @@
<rejection class="^QOpenGL.*$" argument-type="^(const )?char ?\*\*$"/>
<rejection class="^QOpenGL.*$" argument-type="GLintptr"/>
<rejection class="^QOpenGL.*$" argument-type="GLsizeiptr"/>
+ <rejection class="^QOpenGL.*$" argument-type="^GLu?int64 ?\*$"/>
+ <rejection class="^QOpenGL.*$" argument-type="^GLenum ?\*$"/> <!-- glGetProgramBinary -->
<rejection class="^QOpenGL.*$" argument-type="GLsync"/>
<rejection class="^QOpenGL.*$" argument-type="^GLubyte( const)?\*$"/>
<rejection class="^QOpenGL.*$" argument-type="^(const )?QMatrix.x. ?\*$"/>
@@ -157,6 +177,12 @@
</object-type>
<value-type name="QAccessible">
+ <extra-includes>
+ <include file-name="QtGui/QAccessibleInterface" location="global"/>
+ </extra-includes>
+ <inject-code class="native" position="beginning"
+ file="../glue/qtgui.cpp"
+ snippet="qaccessible-pysidefactory"/>
<value-type name="State"/>
<enum-type name="Event"/>
<enum-type name="Role"/>
@@ -164,8 +190,14 @@
<enum-type name="RelationFlag" flags="Relation"/>
<enum-type name="InterfaceType"/>
<enum-type name="TextBoundaryType"/>
+ <add-function signature="installFactory(PyCallable)" static="yes">
+ <inject-code class="target" position="beginning"
+ file="../glue/qtgui.cpp"
+ snippet="qaccessible-installfactory"/>
+ </add-function>
</value-type>
+ <object-type name="QAccessibleActionInterface"/>
<object-type name="QAccessibleEditableTextInterface"/>
<object-type name="QAccessibleInterface"/>
<object-type name="QAccessibleObject"/>
@@ -658,6 +690,9 @@
<extra-includes>
<include file-name="QStringList" location="global"/>
</extra-includes>
+ <!-- PYSIDE-1685: QFont(QString) should be checked first, else it will be interpreted as sequence -->
+ <modify-function signature="QFont(const QString&amp;,int,int, bool)" overload-number="0"/>
+ <modify-function signature="QFont(const QStringList &amp;,int,int, bool)" overload-number="1"/>
<modify-function signature="setStyleHint(QFont::StyleHint,QFont::StyleStrategy)">
<modify-argument index="2">
<rename to="strategy"/>
@@ -2550,166 +2585,184 @@
<modify-function signature="^glClearBuffer.*\(.*\*.*$">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glDebugMessageControl(unsigned int,unsigned int,unsigned int,int,const unsigned int*,unsigned char)">
+ <modify-function signature="glDebugMessageControl(&GLuint;,&GLuint;,&GLuint;,&GLint;,const &GLuint;*,&GLbyte;)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glDeleteProgramPipelines(int,const unsigned int*)">
+ <modify-function signature="glDeleteProgramPipelines(&GLint;,const &GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glDeleteQueries(int,const unsigned int*)">
+ <modify-function signature="glDeleteQueries(&GLint;,const &GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glDeleteSamplers(int,const unsigned int*)">
+ <modify-function signature="glDeleteSamplers(&GLint;,const &GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glDeleteTransformFeedbacks(int,const unsigned int*)">
+ <modify-function signature="glDeleteTransformFeedbacks(&GLint;,const &GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glDeleteVertexArrays(int,const unsigned int*)">
+ <modify-function signature="glDeleteVertexArrays(&GLint;,const &GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glDrawBuffers(int,const unsigned int*)">
+ <modify-function signature="glDrawBuffers(&GLint;,const &GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGenProgramPipelines(int,unsigned int*)">
+ <modify-function signature="glGenProgramPipelines(&GLint;,&GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGenQueries(int,unsigned int*)">
+ <modify-function signature="glGenQueries(&GLint;,&GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGenSamplers(int,unsigned int*)">
+ <modify-function signature="glGenSamplers(&GLint;,&GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGenTransformFeedbacks(int,unsigned int*)">
+ <modify-function signature="glGenTransformFeedbacks(&GLint;,&GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGenVertexArrays(int,unsigned int*)">
+ <modify-function signature="glGenVertexArrays(&GLint;,&GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetActiveUniformBlockiv(unsigned int,unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetActiveUniformBlockiv(&GLuint;,&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetActiveUniformsiv(unsigned int,int,const unsigned int*,unsigned int,int*)">
+ <modify-function signature="glGetActiveUniformsiv(&GLuint;,&GLint;,const &GLuint;*,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetFramebufferParameteriv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetFramebufferParameteriv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetIntegeri_v(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetIntegeri_v(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetInternalformativ(unsigned int,unsigned int,unsigned int,int,int*)">
+ <modify-function signature="glGetInternalformativ(&GLuint;,&GLuint;,&GLuint;,&GLint;,&GLint;*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetMultisamplefv(unsigned int,unsigned int,float*)">
+ <modify-function signature="glGetMultisamplefv(&GLuint;,&GLuint;,float*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetProgramInterfaceiv(unsigned int,unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetProgramInterfaceiv(&GLuint;,&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetProgramPipelineiv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetProgramPipelineiv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetProgramResourceiv(unsigned int,unsigned int,unsigned int,int,const unsigned int*,int,int*,int*)">
+ <modify-function signature="glGetProgramResourceiv(&GLuint;,&GLuint;,&GLuint;,&GLint;,const &GLuint;*,&GLint;,&GLint;*,&GLint;*)">
<modify-argument index="5"><array/></modify-argument>
<modify-argument index="7"><array/></modify-argument>
<modify-argument index="8"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetQueryObjectuiv(unsigned int,unsigned int,unsigned int*)">
+ <modify-function signature="glGetQueryObjectuiv(&GLuint;,&GLuint;,&GLuint;*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetQueryiv(&GLuint;,&GLuint;,&GLint;*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetSamplerParameterfv(&GLuint;,&GLuint;,float*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetSamplerParameteriv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetQueryiv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetSamplerParameterIiv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetSamplerParameterfv(unsigned int,unsigned int,float*)">
+ <modify-function signature="glGetSamplerParameterIuiv(&GLuint;,&GLuint;,&GLuint;*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetTexLevelParameteriv(&GLuint;,&GLint;,&GLuint;,&GLint;*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetTexLevelParameterfv(&GLuint;,&GLint;,&GLuint;,float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetTexParameterIiv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetSamplerParameteriv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetTexParameterIuiv(&GLuint;,&GLuint;,&GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetTexLevelParameteriv(unsigned int,int,unsigned int,int*)">
+ <modify-function signature="glGetnUniformiv(&GLuint;,&GLint;,&GLint;,&GLint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetTexLevelParameterfv(unsigned int,int,unsigned int,float*)">
+ <modify-function signature="glGetnUniformuiv(&GLuint;,&GLint;,&GLint;,&GLuint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetUniformuiv(unsigned int,int,unsigned int*)">
+ <modify-function signature="glGetUniformuiv(&GLuint;,&GLint;,&GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetVertexAttribIiv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetVertexAttribIiv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetVertexAttribIuiv(unsigned int,unsigned int,unsigned int*)">
+ <modify-function signature="glGetVertexAttribIuiv(&GLuint;,&GLuint;,&GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glInvalidateFramebuffer(unsigned int,int,const unsigned int*)">
+ <modify-function signature="glInvalidateFramebuffer(&GLuint;,&GLint;,const &GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glInvalidateSubFramebuffer(unsigned int,int,const unsigned int*,int,int,int,int)">
+ <modify-function signature="glInvalidateSubFramebuffer(&GLuint;,&GLint;,const &GLuint;*,&GLint;,&GLint;,&GLint;,&GLint;)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform1fv(unsigned int,int,int,const float*)">
+ <modify-function signature="glProgramUniform1fv(&GLuint;,&GLint;,&GLint;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform1iv(unsigned int,int,int,const int*)">
+ <modify-function signature="glProgramUniform1iv(&GLuint;,&GLint;,&GLint;,const &GLint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform1uiv(unsigned int,int,int,const unsigned int*)">
+ <modify-function signature="glProgramUniform1uiv(&GLuint;,&GLint;,&GLint;,const &GLuint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform2fv(unsigned int,int,int,const float*)">
+ <modify-function signature="glProgramUniform2fv(&GLuint;,&GLint;,&GLint;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform2iv(unsigned int,int,int,const int*)">
+ <modify-function signature="glProgramUniform2iv(&GLuint;,&GLint;,&GLint;,const &GLint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform2uiv(unsigned int,int,int,const unsigned int*)">
+ <modify-function signature="glProgramUniform2uiv(&GLuint;,&GLint;,&GLint;,const &GLuint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform3fv(unsigned int,int,int,const float*)">
+ <modify-function signature="glProgramUniform3fv(&GLuint;,&GLint;,&GLint;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform3iv(unsigned int,int,int,const int*)">
+ <modify-function signature="glProgramUniform3iv(&GLuint;,&GLint;,&GLint;,const &GLint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform3uiv(unsigned int,int,int,const unsigned int*)">
+ <modify-function signature="glProgramUniform3uiv(&GLuint;,&GLint;,&GLint;,const &GLuint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform4fv(unsigned int,int,int,const float*)">
+ <modify-function signature="glProgramUniform4fv(&GLuint;,&GLint;,&GLint;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform4iv(unsigned int,int,int,const int*)">
+ <modify-function signature="glProgramUniform4iv(&GLuint;,&GLint;,&GLint;,const &GLint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniform4uiv(unsigned int,int,int,const unsigned int*)">
+ <modify-function signature="glProgramUniform4uiv(&GLuint;,&GLint;,&GLint;,const &GLuint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix2fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix2fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix2x3fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix2x3fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix2x4fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix2x4fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix3fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix3fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix3x2fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix3x2fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix3x4fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix3x4fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix4fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix4fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix4x2fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix4x2fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
- <modify-function signature="glProgramUniformMatrix4x3fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-function signature="glProgramUniformMatrix4x3fv(&GLuint;,&GLint;,&GLint;,&GLbyte;,const float*)">
<modify-argument index="5"><array/></modify-argument>
</modify-function>
<modify-function signature="^glSamplerParameterI?u?[fi]v\(.*$">
@@ -2718,43 +2771,43 @@
<modify-function signature="^glTexParameterI?u?[fi]v\(.*$">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniform1uiv(int,int,const unsigned int*)">
+ <modify-function signature="glUniform1uiv(&GLint;,&GLint;,const &GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniform2uiv(int,int,const unsigned int*)">
+ <modify-function signature="glUniform2uiv(&GLint;,&GLint;,const &GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniform3uiv(int,int,const unsigned int*)">
+ <modify-function signature="glUniform3uiv(&GLint;,&GLint;,const &GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniform4uiv(int,int,const unsigned int*)">
+ <modify-function signature="glUniform4uiv(&GLint;,&GLint;,const &GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniformMatrix2x3fv(int,int,unsigned char,const float*)">
+ <modify-function signature="glUniformMatrix2x3fv(&GLint;,&GLsizei;,&GLboolean;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniformMatrix2x4fv(int,int,unsigned char,const float*)">
+ <modify-function signature="glUniformMatrix2x4fv(&GLint;,&GLsizei;,&GLboolean;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniformMatrix3x2fv(int,int,unsigned char,const float*)">
+ <modify-function signature="glUniformMatrix3x2fv(&GLint;,&GLsizei;,&GLboolean;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniformMatrix3x4fv(int,int,unsigned char,const float*)">
+ <modify-function signature="glUniformMatrix3x4fv(&GLint;,&GLsizei;,&GLboolean;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniformMatrix4x2fv(int,int,unsigned char,const float*)">
+ <modify-function signature="glUniformMatrix4x2fv(&GLint;,&GLsizei;,&GLboolean;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glUniformMatrix4x3fv(int,int,unsigned char,const float*)">
+ <modify-function signature="glUniformMatrix4x3fv(&GLint;,&GLsizei;,&GLboolean;,const float*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glVertexAttribI4iv(unsigned int,const int*)">
+ <modify-function signature="glVertexAttribI4iv(&GLuint;,const &GLint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glVertexAttribI4uiv(unsigned int,const unsigned int*)">
+ <modify-function signature="glVertexAttribI4uiv(&GLuint;,const &GLuint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetStringi(unsigned int,unsigned int)">
+ <modify-function signature="glGetStringi(&GLuint;,&GLuint;)">
<modify-argument index="return">
<replace-type modified-type="QString"/>
</modify-argument>
@@ -2764,40 +2817,40 @@
</object-type>
<object-type name="QOpenGLFunctions" since="5.0">
<enum-type name="OpenGLFeature" flags="OpenGLFeatures"/>
- <add-function signature="glGetShaderSource(unsigned int @shader@)" return-type="const char *">
+ <add-function signature="glGetShaderSource(&GLuint; @shader@)" return-type="const char *">
<inject-code class="target" position="beginning" file="../glue/qtgui.cpp"
snippet="glgetshadersource"/>
</add-function>
- <add-function signature="glShaderSource(unsigned int @shader@,const QString &amp; @source@)">
+ <add-function signature="glShaderSource(&GLuint; @shader@,const QString &amp; @source@)">
<inject-code class="target" position="beginning" file="../glue/qtgui.cpp"
snippet="glshadersource"/>
</add-function>
- <modify-function signature="glGetAttachedShaders(unsigned int,int,int*,unsigned int*)">
+ <modify-function signature="glGetAttachedShaders(&GLuint;,&GLint;,&GLint;*,&GLuint;*)">
<modify-argument index="3"><array/></modify-argument>
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetBufferParameteriv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetBufferParameteriv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetFloatv(unsigned int,float*)">
+ <modify-function signature="glGetFloatv(&GLuint;,float*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetFramebufferAttachmentParameteriv(unsigned int,unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetFramebufferAttachmentParameteriv(&GLuint;,&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetIntegerv(unsigned int,int*)">
+ <modify-function signature="glGetIntegerv(&GLuint;,&GLint;*)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetProgramiv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetProgramiv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetRenderbufferParameteriv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetRenderbufferParameteriv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetShaderiv(unsigned int,unsigned int,int*)">
+ <modify-function signature="glGetShaderiv(&GLuint;,&GLuint;,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetShaderPrecisionFormat(unsigned int,unsigned int,int*,int*)">
+ <modify-function signature="glGetShaderPrecisionFormat(&GLuint;,&GLuint;,&GLint;*,&GLint;*)">
<modify-argument index="3"><array/></modify-argument>
<modify-argument index="4"><array/></modify-argument>
</modify-function>
@@ -2822,7 +2875,7 @@
<modify-function signature="^glGetVertexAttrib[fi]v\(.*$">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
- <modify-function signature="glGetString(unsigned int)">
+ <modify-function signature="glGetString(&GLuint;)">
<modify-argument index="return">
<replace-type modified-type="QString"/>
</modify-argument>
@@ -2830,7 +2883,7 @@
<insert-template name="glGetString_return_QString"/>
</inject-code>
</modify-function>
- <modify-function signature="glShaderBinary(int,const unsigned int*,unsigned int,const void *,int)">
+ <modify-function signature="glShaderBinary(&GLint;,const &GLuint;*,&GLuint;,const void *,&GLint;)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
</object-type>
diff --git a/sources/pyside6/PySide6/QtMultimedia/typesystem_multimedia.xml b/sources/pyside6/PySide6/QtMultimedia/typesystem_multimedia.xml
index 2e269bbd8..27ec02d02 100644
--- a/sources/pyside6/PySide6/QtMultimedia/typesystem_multimedia.xml
+++ b/sources/pyside6/PySide6/QtMultimedia/typesystem_multimedia.xml
@@ -139,7 +139,6 @@
<enum-type name="EncodingMode" since="6.1"/>
<enum-type name="RecorderState" since="6.1"/>
<enum-type name="Quality" since="6.1"/>
- <enum-type name="Status" since="6.1"/>
</object-type>
<value-type name="QMediaTimeRange">
<value-type name="Interval"/>
@@ -153,10 +152,9 @@
<value-type name="QVideoFrame">
<enum-type name="HandleType"/>
<enum-type name="MapMode" since="6.1"/>
- <modify-function signature="bits()">
+ <modify-function signature="bits(int)">
<inject-code file="../glue/qtmultimedia.cpp" snippet="qvideoframe-bits"/>
</modify-function>
- <modify-function signature="bits(int)" remove="all"/>
<modify-function signature="bits(int)const" remove="all"/>
</value-type>
<value-type name="QVideoFrameFormat" since="6.1">
diff --git a/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml b/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml
index 0d0c480d6..0a9e69521 100644
--- a/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml
+++ b/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml
@@ -86,6 +86,8 @@
<modify-function signature="disconnectFromHost()" allow-thread="yes"/>
<modify-function signature="waitForConnected(int)" allow-thread="yes"/>
<modify-function signature="waitForDisconnected(int)" allow-thread="yes"/>
+ <modify-function signature="waitForBytesWritten(int)" allow-thread="yes"/>
+ <modify-function signature="waitForReadyRead(int)" allow-thread="yes"/>
</object-type>
<value-type name="QDnsDomainNameRecord"/>
@@ -178,6 +180,7 @@
</object-type>
<object-type name="QLocalSocket">
<enum-type name="LocalSocketError"/>
+ <enum-type name="SocketOption" flags="SocketOptions"/>
<enum-type name="LocalSocketState"/>
</object-type>
<object-type name="QNetworkAccessManager">
@@ -203,7 +206,6 @@
<object-type name="QNetworkInformation">
<enum-type name="Reachability"/>
<enum-type name="Feature" flags="Features"/>
- <enum-type name="TriState" since="6.2"/>
</object-type>
<object-type name="QNetworkCookieJar"/>
<value-type name="QNetworkDatagram" since="5.8"/>
diff --git a/sources/pyside6/PySide6/QtNetworkAuth/typesystem_networkauth.xml b/sources/pyside6/PySide6/QtNetworkAuth/typesystem_networkauth.xml
index e92d8643a..37d0a6573 100644
--- a/sources/pyside6/PySide6/QtNetworkAuth/typesystem_networkauth.xml
+++ b/sources/pyside6/PySide6/QtNetworkAuth/typesystem_networkauth.xml
@@ -135,4 +135,6 @@
<object-type name="QOAuth2AuthorizationCodeFlow"/>
<object-type name="QOAuthHttpServerReplyHandler"/>
<object-type name="QOAuthOobReplyHandler"/>
+
+ <suppress-warning text="^.*Typedef used on signal QAbstractOAuth.*$"/>
</typesystem>
diff --git a/sources/pyside6/PySide6/QtOpenGL/CMakeLists.txt b/sources/pyside6/PySide6/QtOpenGL/CMakeLists.txt
index 6e80a4e16..03c3fbdb0 100644
--- a/sources/pyside6/PySide6/QtOpenGL/CMakeLists.txt
+++ b/sources/pyside6/PySide6/QtOpenGL/CMakeLists.txt
@@ -27,7 +27,8 @@ get_property(QtGui_enabled_features TARGET Qt${QT_MAJOR_VERSION}::Gui
PROPERTY QT_ENABLED_PUBLIC_FEATURES)
if("opengles2" IN_LIST QtGui_enabled_features)
- list(APPEND QtOpenGL_DROPPED_ENTRIES QOpenGLTimeMonitor QOpenGLTimerQuery)
+ list(APPEND QtOpenGL_DROPPED_ENTRIES QOpenGLTimeMonitor QOpenGLTimerQuery
+ QOpenGLVersionFunctionsFactory)
list(APPEND QtOpenGL_SRC ${QtOpenGL_GEN_DIR}/qopenglfunctions_es2_wrapper.cpp)
message(STATUS "Qt${QT_MAJOR_VERSION}Gui: Dropping Desktop OpenGL classes (GLES2)")
else()
diff --git a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl.xml b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl.xml
index 2d4fc1dd6..7b59a8c07 100644
--- a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl.xml
+++ b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl.xml
@@ -44,6 +44,26 @@
<load-typesystem name="QtGui/typesystem_gui.xml" generate="no" />
<load-typesystem name="templates/opengl_common.xml" generate="no" />
+ <?if !darwin?>
+ <?entity GLint int?>
+ <?entity GLuint unsigned int?>
+ <?entity GLbyte unsigned char?>
+ <?entity GLboolean unsigned char?>
+ <?entity GLsizei int?>
+ <?entity GLsizeiptr long?>
+ <?entity GLintptr long?>
+ <?endif?>
+
+ <?if darwin?>
+ <?entity GLint int32_t?>
+ <?entity GLuint uint32_t?>
+ <?entity GLbyte uint8_t?>
+ <?entity GLboolean uint8_t?>
+ <?entity GLsizei int32_t?>
+ <?entity GLsizeiptr intptr_t?>
+ <?entity GLintptr intptr_t?>
+ <?endif?>
+
<rejection class="^QOpenGL.*$" argument-type="^(const )?GLboolean ?\*$"/>
<rejection class="^QOpenGL.*$" argument-type="^GLchar\*$"/>
<rejection class="^QOpenGL.*$" argument-type="^(const )?GLchar ?\*(const)?\*$"/>
@@ -441,9 +461,6 @@
<modify-function signature="setAttributeArray(const char*,const float*,int,int)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="setAttributeArray(int,const float*,int,int)">
- <modify-argument index="2"><array/></modify-argument>
- </modify-function>
<modify-function signature="setAttributeValue(int,const float*,int,int)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
@@ -453,19 +470,19 @@
<modify-function signature="setUniformValueArray(int,const float*,int,int)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="setUniformValueArray(int,const int*,int)">
+ <modify-function signature="setUniformValueArray(int,const &GLint;*,int)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="setUniformValueArray(int,const unsigned int*,int)">
+ <modify-function signature="setUniformValueArray(int,const &GLuint;*,int)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
<modify-function signature="setUniformValueArray(const char*,const float*,int,int)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="setUniformValueArray(const char*,const int*,int)">
+ <modify-function signature="setUniformValueArray(const char*,const &GLint;*,int)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
- <modify-function signature="setUniformValueArray(const char*,const unsigned int*,int)">
+ <modify-function signature="setUniformValueArray(const char*,const &GLuint;*,int)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
<!-- Add explicit signatures for the setUniformValue functions -->
@@ -474,13 +491,13 @@
<add-function signature="setUniformValue1f(const char*, float)" return-type="void">
<inject-code file="../glue/qtopengl.cpp" snippet="qopenglshaderprogram_setuniformvalue_float"/>
</add-function>
- <add-function signature="setUniformValue1i(const char*, int)" return-type="void">
+ <add-function signature="setUniformValue1i(const char*, &GLint;)" return-type="void">
<inject-code file="../glue/qtopengl.cpp" snippet="qopenglshaderprogram_setuniformvalue_int"/>
</add-function>
- <add-function signature="setUniformValue1f(int, float)" return-type="void">
+ <add-function signature="setUniformValue1f(&GLint;, float)" return-type="void">
<inject-code file="../glue/qtopengl.cpp" snippet="qopenglshaderprogram_setuniformvalue_float"/>
</add-function>
- <add-function signature="setUniformValue1i(int, int)" return-type="void">
+ <add-function signature="setUniformValue1i(&GLint;, &GLint;)" return-type="void">
<inject-code file="../glue/qtopengl.cpp" snippet="qopenglshaderprogram_setuniformvalue_int"/>
</add-function>
</object-type>
diff --git a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_0_compat.xml b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_0_compat.xml
index 5793048cd..e5a81eff4 100644
--- a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_0_compat.xml
+++ b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_0_compat.xml
@@ -42,7 +42,7 @@
<modify-function signature="^glColor[34][a-z]{1,2}v\(.*$">
<modify-argument index="1"><array/></modify-argument>
</modify-function>
-<modify-function signature="glClipPlane(unsigned int,const double *)">
+<modify-function signature="glClipPlane(&GLuint;,const double *)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
<modify-function signature="^glEvalCoord\d[a-z]{1,2}v\(.*$">
diff --git a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_1_compat.xml b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_1_compat.xml
index 3f8075b30..c58cda87a 100644
--- a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_1_compat.xml
+++ b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications1_1_compat.xml
@@ -42,3 +42,6 @@
<modify-argument index="2"><array/></modify-argument>
<modify-argument index="3"><array/></modify-argument>
</modify-function>
+<modify-function signature="^glIndexubv\(.*$">
+ <modify-argument index="1"><array/></modify-argument>
+</modify-function>
diff --git a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_1.xml b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_1.xml
index bc92ce80d..ec78f58e5 100644
--- a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_1.xml
+++ b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_1.xml
@@ -53,6 +53,6 @@
<modify-function signature="^gl(Scissor|Viewport)Indexedf?v\(.*$">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
-<modify-function signature="glShaderBinary(int,const unsigned int*,unsigned int,const void *,int)">
+<modify-function signature="glShaderBinary(&GLint;,const &GLuint;*,&GLuint;,const void *,&GLint;)">
<modify-argument index="2"><array/></modify-argument>
</modify-function>
diff --git a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_4.xml b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_4.xml
index 6b59f174a..d4a2762d9 100644
--- a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_4.xml
+++ b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_4.xml
@@ -41,12 +41,12 @@
<modify-function signature="^glBindBuffersBase\(.*$">
<modify-argument index="4"><array/></modify-argument>
</modify-function>
-<modify-function signature="glBindBuffersRange(unsigned int, unsigned int,int,const unsigned int *,const long *,const long*)">
+<modify-function signature="glBindBuffersRange(&GLuint;, &GLuint;,&GLint;,const &GLuint; *,const &GLintptr;*,const &GLsizeiptr;*)">
<modify-argument index="4"><array/></modify-argument>
<modify-argument index="5"><array/></modify-argument>
<modify-argument index="6"><array/></modify-argument>
</modify-function>
-<modify-function signature="glBindVertexBuffers(unsigned int,int,const unsigned int *,const long *,const int *)">
+<modify-function signature="glBindVertexBuffers(&GLuint;,&GLint;,const &GLuint; *,const &GLintptr;*,const &GLsizei;*)">
<modify-argument index="3"><array/></modify-argument>
<modify-argument index="4"><array/></modify-argument>
<modify-argument index="5"><array/></modify-argument>
diff --git a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_5.xml b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_5.xml
index 2ea0a458d..dbea4092f 100644
--- a/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_5.xml
+++ b/sources/pyside6/PySide6/QtOpenGL/typesystem_opengl_modifications4_5.xml
@@ -50,7 +50,7 @@
<modify-function signature="^glTextureParameterI?u?[fi]v\(.*$">
<modify-argument index="3"><array/></modify-argument>
</modify-function>
-<modify-function signature="glVertexArrayVertexBuffers(unsigned int, unsigned int,int,const unsigned int *,const long *,const int *)">
+<modify-function signature="glVertexArrayVertexBuffers(&GLuint;, &GLuint;,&GLsizei;,const &GLuint; *,const &GLintptr;*,const &GLsizei;*)">
<modify-argument index="4"><array/></modify-argument>
<modify-argument index="5"><array/></modify-argument>
<modify-argument index="6"><array/></modify-argument>
diff --git a/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp b/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp
index ab098c119..aa89579be 100644
--- a/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp
+++ b/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp
@@ -128,7 +128,7 @@ int PySide::qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor,
QQmlPrivate::StaticCastSelector<QObject, QQmlPropertyValueInterceptor>::cast();
int objectSize = static_cast<int>(PySide::getSizeOfQObject(
- reinterpret_cast<SbkObjectType *>(pyObj)));
+ reinterpret_cast<PyTypeObject *>(pyObj)));
type.objectSize = objectSize;
type.create = creatable ? createInto : nullptr;
type.noCreationReason = noCreationReason;
@@ -166,7 +166,7 @@ int PySide::qmlRegisterSingletonType(PyObject *pyObj, const char *uri, int versi
AutoDecRef funcCode(PyObject_GetAttrString(callback, "__code__"));
AutoDecRef argCount(PyObject_GetAttrString(funcCode, "co_argcount"));
- int count = PyInt_AsLong(argCount);
+ int count = PyLong_AsLong(argCount);
if (count != 1) {
PyErr_Format(PyExc_TypeError, "Callback has a bad parameter count.");
@@ -180,15 +180,10 @@ int PySide::qmlRegisterSingletonType(PyObject *pyObj, const char *uri, int versi
const QMetaObject *metaObject = nullptr;
if (isQObject) {
- static PyTypeObject *qobjectType = Conversions::getPythonTypeObject("QObject*");
- assert(qobjectType);
-
PyTypeObject *pyObjType = reinterpret_cast<PyTypeObject *>(pyObj);
- if (!PySequence_Contains(pyObjType->tp_mro, reinterpret_cast<PyObject *>(qobjectType))) {
- PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.",
- qobjectType->tp_name, pyObjType->tp_name);
+
+ if (!isQObjectDerived(pyObjType, true))
return -1;
- }
// If we don't have a callback we'll need the pyObj to stay allocated indefinitely
if (!hasCallback)
@@ -212,17 +207,18 @@ int PySide::qmlRegisterSingletonType(PyObject *pyObj, const char *uri, int versi
type.qObjectApi =
[callback, pyObj, hasCallback](QQmlEngine *engine, QJSEngine *) -> QObject * {
+ Shiboken::GilState gil;
AutoDecRef args(PyTuple_New(hasCallback ? 1 : 0));
if (hasCallback) {
PyTuple_SET_ITEM(args, 0, Conversions::pointerToPython(
- (SbkObjectType *)SbkPySide6_QtQmlTypes[SBK_QQMLENGINE_IDX],
- engine));
+ SbkPySide6_QtQmlTypes[SBK_QQMLENGINE_IDX],
+ engine));
}
AutoDecRef retVal(PyObject_CallObject(hasCallback ? callback : pyObj, args));
- SbkObjectType *qobjectType = (SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
+ PyTypeObject *qobjectType = SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
// Make sure the callback returns something we can convert, else the entire application will crash.
if (retVal.isNull() ||
@@ -242,15 +238,16 @@ int PySide::qmlRegisterSingletonType(PyObject *pyObj, const char *uri, int versi
} else {
type.scriptApi =
[callback](QQmlEngine *engine, QJSEngine *) -> QJSValue {
+ Shiboken::GilState gil;
AutoDecRef args(PyTuple_New(1));
PyTuple_SET_ITEM(args, 0, Conversions::pointerToPython(
- (SbkObjectType *)SbkPySide6_QtQmlTypes[SBK_QQMLENGINE_IDX],
- engine));
+ SbkPySide6_QtQmlTypes[SBK_QQMLENGINE_IDX],
+ engine));
AutoDecRef retVal(PyObject_CallObject(callback, args));
- SbkObjectType *qjsvalueType = (SbkObjectType *)SbkPySide6_QtQmlTypes[SBK_QJSVALUE_IDX];
+ PyTypeObject *qjsvalueType = SbkPySide6_QtQmlTypes[SBK_QJSVALUE_IDX];
// Make sure the callback returns something we can convert, else the entire application will crash.
if (retVal.isNull() ||
@@ -271,6 +268,55 @@ int PySide::qmlRegisterSingletonType(PyObject *pyObj, const char *uri, int versi
return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &type);
}
+int PySide::qmlRegisterSingletonInstance(PyObject *pyObj, const char *uri, int versionMajor,
+ int versionMinor, const char *qmlName,
+ PyObject *instanceObject)
+{
+ using namespace Shiboken;
+
+ static PyTypeObject *qobjectType = Conversions::getPythonTypeObject("QObject*");
+ assert(qobjectType);
+
+ // Check if the Python Type inherit from QObject
+ PyTypeObject *pyObjType = reinterpret_cast<PyTypeObject *>(pyObj);
+
+ if (!isQObjectDerived(pyObjType, true))
+ return -1;
+
+ // Check if the instance object derives from QObject
+ PyTypeObject *typeInstanceObject = instanceObject->ob_type;
+
+ if (!isQObjectDerived(typeInstanceObject, true))
+ return -1;
+
+ // Convert the instanceObject (PyObject) into a QObject
+ QObject *instanceQObject = reinterpret_cast<QObject*>(
+ Object::cppPointer(reinterpret_cast<SbkObject*>(instanceObject), qobjectType));
+
+ // Create Singleton Functor to pass the QObject to the Type registration step
+ // similarly to the case when we have a callback
+ QQmlPrivate::SingletonFunctor registrationFunctor;
+ registrationFunctor.m_object = instanceQObject;
+
+ const QMetaObject *metaObject = PySide::retrieveMetaObject(pyObjType);
+ Q_ASSERT(metaObject);
+
+ QQmlPrivate::RegisterSingletonType type;
+ type.structVersion = 0;
+
+ type.uri = uri;
+ type.version = QTypeRevision::fromVersion(versionMajor, versionMinor);
+ type.typeName = qmlName;
+ type.instanceMetaObject = metaObject;
+
+ // FIXME: Fix this to assign new type ids each time.
+ type.typeId = QMetaType(QMetaType::QObjectStar);
+ type.qObjectApi = registrationFunctor;
+
+
+ return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &type);
+}
+
extern "C"
{
@@ -359,12 +405,8 @@ static PyType_Spec PropertyListType_spec = {
PyTypeObject *PropertyListTypeF(void)
{
- static PyTypeObject *type = nullptr;
- if (!type) {
- PyObject *bases = Py_BuildValue("(O)", PySidePropertyTypeF());
- type = (PyTypeObject *)SbkType_FromSpecWithBases(&PropertyListType_spec, bases);
- Py_XDECREF(bases);
- }
+ static Shiboken::AutoDecRef bases(Py_BuildValue("(O)", PySidePropertyTypeF()));
+ static auto *type = SbkType_FromSpecWithBases(&PropertyListType_spec, bases);
return type;
}
@@ -376,8 +418,11 @@ void propListAppender(QQmlListProperty<QObject> *propList, QObject *item)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(2));
- PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], propList->object));
- PyTuple_SET_ITEM(args, 1, Shiboken::Conversions::pointerToPython((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], item));
+ PyTypeObject *qobjectType = SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
+ PyTuple_SET_ITEM(args, 0,
+ Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
+ PyTuple_SET_ITEM(args, 1,
+ Shiboken::Conversions::pointerToPython(qobjectType, item));
auto data = reinterpret_cast<QmlListProperty *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->append, args));
@@ -392,7 +437,9 @@ qsizetype propListCount(QQmlListProperty<QObject> *propList)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(1));
- PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], propList->object));
+ PyTypeObject *qobjectType = SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
+ PyTuple_SET_ITEM(args, 0,
+ Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
auto data = reinterpret_cast<QmlListProperty *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->count, args));
@@ -413,7 +460,9 @@ QObject *propListAt(QQmlListProperty<QObject> *propList, qsizetype index)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(2));
- PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], propList->object));
+ PyTypeObject *qobjectType = SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
+ PyTuple_SET_ITEM(args, 0,
+ Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
PyTuple_SET_ITEM(args, 1, Shiboken::Conversions::copyToPython(Shiboken::Conversions::PrimitiveTypeConverter<qsizetype>(), &index));
auto data = reinterpret_cast<QmlListProperty *>(propList->data);
@@ -423,7 +472,7 @@ QObject *propListAt(QQmlListProperty<QObject> *propList, qsizetype index)
if (PyErr_Occurred())
PyErr_Print();
else if (PyType_IsSubtype(Py_TYPE(retVal), data->type))
- Shiboken::Conversions::pythonToCppPointer((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], retVal, &result);
+ Shiboken::Conversions::pythonToCppPointer(qobjectType, retVal, &result);
return result;
}
@@ -433,7 +482,9 @@ void propListClear(QQmlListProperty<QObject> * propList)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(1));
- PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], propList->object));
+ PyTypeObject *qobjectType = SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
+ PyTuple_SET_ITEM(args, 0,
+ Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
auto data = reinterpret_cast<QmlListProperty *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->clear, args));
@@ -448,9 +499,12 @@ void propListReplace(QQmlListProperty<QObject> *propList, qsizetype index, QObje
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(3));
- PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], propList->object));
+ PyTypeObject *qobjectType = SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
+ PyTuple_SET_ITEM(args, 0,
+ Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
PyTuple_SET_ITEM(args, 1, Shiboken::Conversions::copyToPython(Shiboken::Conversions::PrimitiveTypeConverter<qsizetype>(), &index));
- PyTuple_SET_ITEM(args, 2, Shiboken::Conversions::pointerToPython((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], value));
+ PyTuple_SET_ITEM(args, 2,
+ Shiboken::Conversions::pointerToPython(qobjectType, value));
auto data = reinterpret_cast<QmlListProperty *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->replace, args));
@@ -465,7 +519,9 @@ void propListRemoveLast(QQmlListProperty<QObject> *propList)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(1));
- PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], propList->object));
+ PyTypeObject *qobjectType = SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
+ PyTuple_SET_ITEM(args, 0,
+ Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
auto data = reinterpret_cast<QmlListProperty *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->removeLast, args));
@@ -482,7 +538,8 @@ static void propListMetaCall(PySideProperty *pp, PyObject *self, QMetaObject::Ca
auto data = reinterpret_cast<QmlListProperty *>(PySide::Property::userData(pp));
QObject *qobj;
- Shiboken::Conversions::pythonToCppPointer((SbkObjectType *)SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX], self, &qobj);
+ PyTypeObject *qobjectType = SbkPySide6_QtCoreTypes[SBK_QOBJECT_IDX];
+ Shiboken::Conversions::pythonToCppPointer(qobjectType, self, &qobj);
QQmlListProperty<QObject> declProp(qobj, data,
data->append && data->append != Py_None ? &propListAppender : nullptr,
data->count && data->count != Py_None ? &propListCount : nullptr,
@@ -613,8 +670,7 @@ static PyType_Spec QtQml_VolatileBoolType_spec = {
PyTypeObject *QtQml_VolatileBoolTypeF(void)
{
- static PyTypeObject *type = reinterpret_cast<PyTypeObject *>(
- SbkType_FromSpec(&QtQml_VolatileBoolType_spec));
+ static auto *type = SbkType_FromSpec(&QtQml_VolatileBoolType_spec);
return type;
}
diff --git a/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.h b/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.h
index 9cc7379e9..0dbfb6e5a 100644
--- a/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.h
+++ b/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.h
@@ -42,8 +42,6 @@
#include <sbkpython.h>
-struct SbkObjectType;
-
namespace PySide
{
@@ -71,7 +69,7 @@ int qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor, int vers
const char *qmlName, const char *noCreationReason = nullptr, bool creatable = true);
/**
- * PySide implementation of qmlRegisterType<T> function.
+ * PySide implementation of qmlRegisterSingletonType<T> function.
*
* \param pyObj Python type to be registered.
* \param uri QML element uri.
@@ -84,6 +82,20 @@ int qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor, int vers
int qmlRegisterSingletonType(PyObject *pyObj,const char *uri, int versionMajor, int versionMinor, const char *qmlName,
PyObject *callback, bool isQObject, bool hasCallback);
+/**
+ * PySide implementation of qmlRegisterSingletonInstance<T> function.
+ *
+ * \param pyObj Python type to be registered.
+ * \param uri QML element uri.
+ * \param versionMajor QML component major version.
+ * \param versionMinor QML component minor version.
+ * \param qmlName QML element name
+ * \param instanceObject singleton object to be registered.
+ * \return the metatype id of the registered type.
+ */
+int qmlRegisterSingletonInstance(PyObject *pyObj, const char *uri, int versionMajor,
+ int versionMinor, const char *qmlName, PyObject *instanceObject);
+
/**
* PySide implementation of the QML_ELEMENT macro
diff --git a/sources/pyside6/PySide6/QtQml/typesystem_qml.xml b/sources/pyside6/PySide6/QtQml/typesystem_qml.xml
index 1b855a073..b58b18ee7 100644
--- a/sources/pyside6/PySide6/QtQml/typesystem_qml.xml
+++ b/sources/pyside6/PySide6/QtQml/typesystem_qml.xml
@@ -60,7 +60,7 @@
</inject-code>
<!-- This is to inform the generator that the VolatileBool python type exists -->
- <custom-type name="VolatileBool"/>
+ <custom-type name="VolatileBool" check-function="VolatileBool_Check"/>
<primitive-type name="bool volatile" target-lang-api-name="VolatileBool">
<!-- No conversion rules are specified here, because the generator does not handle
pointer to primitive types without function adjustment.
@@ -92,6 +92,10 @@
<inject-code class="target" file="../glue/qtqml.cpp" snippet="qmlregistersingletontype_qjsvalue"/>
</add-function>
+ <add-function signature="qmlRegisterSingletonInstance(PyTypeObject,const char*,int,int,const char*,PyObject*)" return-type="int">
+ <inject-code class="target" file="../glue/qtqml.cpp" snippet="qmlregistersingletoninstance"/>
+ </add-function>
+
<add-function signature="qmlRegisterUncreatableType(PyTypeObject,const char*,int,int,const char*,const char*)" return-type="int">
<inject-code class="target" file="../glue/qtqml.cpp" snippet="qmlregisteruncreatabletype"/>
</add-function>
@@ -119,6 +123,8 @@
<function signature="qmlProtectModule(const char*,int)"/>
<function signature="qmlRegisterModule(const char*,int,int)"/>
<function signature="qmlTypeId(const char*,int,int,const char*)"/>
+ <function signature="qmlRegisterType(const QUrl &amp;,const char *,int,int,const char *)"/>
+ <function signature="qmlRegisterSingletonType(const QUrl &amp;,const char *,int,int,const char *)"/>
<function signature="qmlRegisterUncreatableMetaObject(const QMetaObject&amp;,const char*,int,int, const char*,const QString&amp;)"/>
<enum-type identified-by-value="QML_HAS_ATTACHED_PROPERTIES">
@@ -152,10 +158,15 @@
<enum-type name="DataType"/>
</object-type>
<object-type name="QQmlApplicationEngine">
- <modify-function signature="load(const QString &amp;)">
+ <!-- PYSIDE-1681: QQmlApplicationEngine constructor, load() and similar need
+ allow-thread in case there is a message handler installed
+ (qInstallMessageHandler) -->
+ <modify-function signature="^QQmlApplicationEngine\(.*\)$" allow-thread="yes"/>
+ <modify-function signature="load(const QString &amp;)" allow-thread="yes">
<modify-argument index="1"><replace-type modified-type="PyPathLike"/></modify-argument>
<inject-code class="target" position="beginning" file="../glue/qtcore.cpp" snippet="qfile-path-1"/>
</modify-function>
+ <modify-function signature="load(const QUrl &amp;)" allow-thread="yes"/>
</object-type>
<object-type name="QQmlComponent">
<enum-type name="CompilationMode"/>
@@ -282,4 +293,5 @@
</object-type>
<!-- Suppress anonymous enum warning -->
<suppress-warning text="Anonymous enum (QmlCurrentSingletonTypeRegistrationVersion) does not have a type entry"/>
+ <suppress-warning text="Enum 'QQmlModuleImportSpecialVersions' does not have a type entry"/>
</typesystem>
diff --git a/sources/pyside6/PySide6/QtQuick/pysidequickregistertype.h b/sources/pyside6/PySide6/QtQuick/pysidequickregistertype.h
index 1955413b2..ee4b60866 100644
--- a/sources/pyside6/PySide6/QtQuick/pysidequickregistertype.h
+++ b/sources/pyside6/PySide6/QtQuick/pysidequickregistertype.h
@@ -42,8 +42,6 @@
#include <sbkpython.h>
-struct SbkObjectType;
-
namespace PySide
{
void initQuickSupport(PyObject *module);
diff --git a/sources/pyside6/PySide6/QtRemoteObjects/typesystem_remoteobjects.xml b/sources/pyside6/PySide6/QtRemoteObjects/typesystem_remoteobjects.xml
index a115a133f..cadf7ec16 100644
--- a/sources/pyside6/PySide6/QtRemoteObjects/typesystem_remoteobjects.xml
+++ b/sources/pyside6/PySide6/QtRemoteObjects/typesystem_remoteobjects.xml
@@ -72,4 +72,9 @@
</object-type>
<object-type name="QRemoteObjectSettingsStore"/>
<value-type name="QRemoteObjectSourceLocationInfo"/>
+
+ <suppress-warning text="^.*Typedef used on signal QRemoteObject.*$"/>
+ <suppress-warning text="^QRemoteObjectPendingCallWatcher inherits from a non polymorphic type.*$"/>
+ <suppress-warning text="Enum 'QRemoteObjectReplica::ConstructorType' (class: QRemoteObjectReplica) does not have a type entry"/>
+ <suppress-warning text="skipping field 'QRemoteObjectReplica::d_impl' with unmatched type 'QSharedPointer'"/>
</typesystem>
diff --git a/sources/pyside6/PySide6/QtSensors/CMakeLists.txt b/sources/pyside6/PySide6/QtSensors/CMakeLists.txt
index bd408dbd7..5970cbb05 100644
--- a/sources/pyside6/PySide6/QtSensors/CMakeLists.txt
+++ b/sources/pyside6/PySide6/QtSensors/CMakeLists.txt
@@ -6,9 +6,9 @@ set(QtSensors_DROPPED_ENTRIES )
set(QtSensors_SRC
# overrides QObject::metaObject() by private method
# ${QtSensors_GEN_DIR}/qsensorgesture_wrapper.cpp
- ${QtSensors_GEN_DIR}/qsensorgesturemanager_wrapper.cpp
- ${QtSensors_GEN_DIR}/qsensorgestureplugininterface_wrapper.cpp
- ${QtSensors_GEN_DIR}/qsensorgesturerecognizer_wrapper.cpp
+# ${QtSensors_GEN_DIR}/qsensorgesturemanager_wrapper.cpp
+# ${QtSensors_GEN_DIR}/qsensorgestureplugininterface_wrapper.cpp
+# ${QtSensors_GEN_DIR}/qsensorgesturerecognizer_wrapper.cpp
${QtSensors_GEN_DIR}/qaccelerometer_wrapper.cpp
${QtSensors_GEN_DIR}/qaccelerometerfilter_wrapper.cpp
${QtSensors_GEN_DIR}/qaccelerometerreading_wrapper.cpp
diff --git a/sources/pyside6/PySide6/QtSensors/typesystem_sensors.xml b/sources/pyside6/PySide6/QtSensors/typesystem_sensors.xml
index 5a1cf3c1e..2449b3d08 100644
--- a/sources/pyside6/PySide6/QtSensors/typesystem_sensors.xml
+++ b/sources/pyside6/PySide6/QtSensors/typesystem_sensors.xml
@@ -44,9 +44,13 @@
<!-- overrides QObject::metaObject() by private method
<object-type name="QSensorGesture"/>
-->
+<!-- Disabled by
+ 5991224e6713eef4a456c408fcf797662fa2a66c in qt/qtsensors :
+ https://codereview.qt-project.org/c/qt/qtsensors/+/364924
<object-type name="QSensorGestureManager"/>
<object-type name="QSensorGesturePluginInterface"/>
<object-type name="QSensorGestureRecognizer"/>
+-->
<object-type name="QAccelerometer">
<enum-type name="AccelerationMode"/>
</object-type>
diff --git a/sources/pyside6/PySide6/QtSerialPort/typesystem_serialport.xml b/sources/pyside6/PySide6/QtSerialPort/typesystem_serialport.xml
index a27221038..06b04856b 100644
--- a/sources/pyside6/PySide6/QtSerialPort/typesystem_serialport.xml
+++ b/sources/pyside6/PySide6/QtSerialPort/typesystem_serialport.xml
@@ -44,7 +44,6 @@
<object-type name="QSerialPort">
<enum-type name="BaudRate"/>
<enum-type name="DataBits"/>
- <enum-type name="DataErrorPolicy"/>
<enum-type name="Direction" flags="Directions"/>
<enum-type name="FlowControl"/>
<enum-type name="Parity"/>
diff --git a/sources/pyside6/PySide6/QtWebEngineCore/CMakeLists.txt b/sources/pyside6/PySide6/QtWebEngineCore/CMakeLists.txt
index 7cb709d27..f6a3fb35c 100644
--- a/sources/pyside6/PySide6/QtWebEngineCore/CMakeLists.txt
+++ b/sources/pyside6/PySide6/QtWebEngineCore/CMakeLists.txt
@@ -38,12 +38,14 @@ set(QtWebEngineCore_include_dirs
${Qt${QT_MAJOR_VERSION}Widgets_INCLUDE_DIRS}
${Qt${QT_MAJOR_VERSION}Network_INCLUDE_DIRS}
${Qt${QT_MAJOR_VERSION}PrintSupport_INCLUDE_DIRS}
+ ${Qt${QT_MAJOR_VERSION}WebChannel_INCLUDE_DIRS}
${libpyside_SOURCE_DIR}
${QtCore_GEN_DIR}
${QtGui_GEN_DIR}
${QtWidgets_GEN_DIR}
${QtNetwork_GEN_DIR}
${QtPrintSupport_GEN_DIR}
+ ${QtWebChannel_GEN_DIR}
)
set(QtWebEngineCore_libraries pyside6
${Qt${QT_MAJOR_VERSION}WebEngineCore_LIBRARIES}
@@ -52,8 +54,11 @@ set(QtWebEngineCore_libraries pyside6
${Qt${QT_MAJOR_VERSION}Widgets_LIBRARIES}
${Qt${QT_MAJOR_VERSION}Network_LIBRARIES}
${Qt${QT_MAJOR_VERSION}PrintSupport_LIBRARIES}
+ ${Qt${QT_MAJOR_VERSION}WebChannel_LIBRARIES}
)
-set(QtWebEngineCore_deps QtCore QtGui QtNetwork QtPrintSupport)
+
+set(QtWebEngineCore_deps QtCore QtGui QtNetwork QtPrintSupport QtWebChannel)
+
create_pyside_module(NAME QtWebEngineCore
INCLUDE_DIRS QtWebEngineCore_include_dirs
LIBRARIES QtWebEngineCore_libraries
diff --git a/sources/pyside6/PySide6/QtWebEngineCore/typesystem_webenginecore.xml b/sources/pyside6/PySide6/QtWebEngineCore/typesystem_webenginecore.xml
index 49f75a319..5072ddfb4 100644
--- a/sources/pyside6/PySide6/QtWebEngineCore/typesystem_webenginecore.xml
+++ b/sources/pyside6/PySide6/QtWebEngineCore/typesystem_webenginecore.xml
@@ -44,6 +44,7 @@
<load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
<load-typesystem name="QtNetwork/typesystem_network.xml" generate="no"/>
<load-typesystem name="QtPrintSupport/typesystem_printsupport.xml" generate="no"/>
+ <load-typesystem name="QtWebChannel/typesystem_webchannel.xml" generate="no"/>
<object-type name="QWebEngineCookieStore"/>
@@ -104,8 +105,6 @@
<object-type name="QWebEngineProfile">
<enum-type name="HttpCacheType"/>
<enum-type name="PersistentCookiesPolicy"/>
- <!-- FIXME Left-over deprecated API, pending fix in qtwebengine repo -->
- <modify-function signature="setRequestInterceptor(QWebEngineUrlRequestInterceptor*)" remove="all"/>
</object-type>
<object-type name="QWebEngineNewWindowRequest">
diff --git a/sources/pyside6/PySide6/QtWebEngineQuick/CMakeLists.txt b/sources/pyside6/PySide6/QtWebEngineQuick/CMakeLists.txt
index 60c48385a..1f3b7d9af 100644
--- a/sources/pyside6/PySide6/QtWebEngineQuick/CMakeLists.txt
+++ b/sources/pyside6/PySide6/QtWebEngineQuick/CMakeLists.txt
@@ -2,7 +2,6 @@ project(QtWebEngineQuick)
set(QtWebEngineQuick_SRC
${QtWebEngineQuick_GEN_DIR}/qquickwebengineprofile_wrapper.cpp
-${QtWebEngineQuick_GEN_DIR}/qquickwebenginescriptcollection_wrapper.cpp
${QtWebEngineQuick_GEN_DIR}/qtwebenginequick_wrapper.cpp
# module is always needed
${QtWebEngineQuick_GEN_DIR}/qtwebenginequick_module_wrapper.cpp
diff --git a/sources/pyside6/PySide6/QtWebEngineQuick/typesystem_webenginequick.xml b/sources/pyside6/PySide6/QtWebEngineQuick/typesystem_webenginequick.xml
index 5a79feaf9..ca3ec21c7 100644
--- a/sources/pyside6/PySide6/QtWebEngineQuick/typesystem_webenginequick.xml
+++ b/sources/pyside6/PySide6/QtWebEngineQuick/typesystem_webenginequick.xml
@@ -49,6 +49,4 @@
<enum-type name="PersistentCookiesPolicy"/>
</object-type>
- <object-type name="QQuickWebEngineScriptCollection"/>
-
</typesystem>
diff --git a/sources/pyside6/PySide6/QtWebEngineWidgets/CMakeLists.txt b/sources/pyside6/PySide6/QtWebEngineWidgets/CMakeLists.txt
index 04ee6174b..c43be68f1 100644
--- a/sources/pyside6/PySide6/QtWebEngineWidgets/CMakeLists.txt
+++ b/sources/pyside6/PySide6/QtWebEngineWidgets/CMakeLists.txt
@@ -15,6 +15,7 @@ set(QtWebEngineWidgets_include_dirs
${Qt${QT_MAJOR_VERSION}Network_INCLUDE_DIRS}
${Qt${QT_MAJOR_VERSION}PrintSupport_INCLUDE_DIRS}
${Qt${QT_MAJOR_VERSION}WebEngineWidgets_INCLUDE_DIRS}
+ ${Qt${QT_MAJOR_VERSION}WebChannel_INCLUDE_DIRS}
${libpyside_SOURCE_DIR}
${QtCore_GEN_DIR}
${QtGui_GEN_DIR}
@@ -23,6 +24,7 @@ set(QtWebEngineWidgets_include_dirs
${QtNetwork_GEN_DIR}
${QtWebEngineCore_GEN_DIR}
${QtPrintSupport_GEN_DIR}
+ ${QtWebChannel_GEN_DIR}
)
set(QtWebEngineWidgets_libraries pyside6
${Qt${QT_MAJOR_VERSION}WebEngineWidgets_LIBRARIES}
@@ -31,8 +33,11 @@ set(QtWebEngineWidgets_libraries pyside6
${Qt${QT_MAJOR_VERSION}Gui_LIBRARIES}
${Qt${QT_MAJOR_VERSION}Core_LIBRARIES}
${Qt${QT_MAJOR_VERSION}PrintSupport_LIBRARIES}
+ ${Qt${QT_MAJOR_VERSION}WebChannel_LIBRARIES}
)
-set(QtWebEngineWidgets_deps QtGui QtWidgets QtNetwork QtPrintSupport QtWebEngineCore)
+
+set(QtWebEngineWidgets_deps QtGui QtWidgets QtNetwork QtPrintSupport QtWebChannel QtWebEngineCore)
+
create_pyside_module(NAME QtWebEngineWidgets
INCLUDE_DIRS QtWebEngineWidgets_include_dirs
LIBRARIES QtWebEngineWidgets_libraries
@@ -40,3 +45,5 @@ create_pyside_module(NAME QtWebEngineWidgets
TYPESYSTEM_PATH QtWebEngineWidgets_SOURCE_DIR
SOURCES QtWebEngineWidgets_SRC)
+
+
diff --git a/sources/pyside6/PySide6/QtWebSockets/typesystem_websockets.xml b/sources/pyside6/PySide6/QtWebSockets/typesystem_websockets.xml
index da1b78159..bc747e179 100644
--- a/sources/pyside6/PySide6/QtWebSockets/typesystem_websockets.xml
+++ b/sources/pyside6/PySide6/QtWebSockets/typesystem_websockets.xml
@@ -64,15 +64,4 @@
<include file-name="QWebSocketCorsAuthenticator" location="global"/>
</extra-includes>
</object-type>
-
- <!-- TODO: Gracefully handle the lack of SSL support -->
- <rejection class="QWebSocket" function-name="ignoreSslErrors"/>
- <rejection class="QWebSocket" function-name="setSslConfiguration"/>
- <rejection class="QWebSocket" function-name="sslConfiguration"/>
- <rejection class="QWebSocket" function-name="ignoreSslErrors"/>
- <rejection class="QWebSocket" function-name="sslErrors"/>
- <rejection class="QWebSocketServer" function-name="setSslConfiguration"/>
- <rejection class="QWebSocketServer" function-name="sslConfiguration"/>
- <rejection class="QWebSocketServer" function-name="peerVerifyError"/>
- <rejection class="QWebSocketServer" function-name="sslErrors"/>
</typesystem>
diff --git a/sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml b/sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml
index f6930986e..bd35e1c39 100644
--- a/sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml
+++ b/sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml
@@ -1216,6 +1216,8 @@
</object-type>
<object-type name="QLayout">
+ <inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp"
+ snippet="qwidget-retrieveobjectname"/>
<inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp" snippet="qlayout-help-functions"/>
<enum-type name="SizeConstraint"/>
@@ -1305,6 +1307,8 @@
</object-type>
<object-type name="QStackedLayout">
+ <inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp"
+ snippet="qwidget-retrieveobjectname"/>
<inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp" snippet="qlayout-help-functions"/>
<enum-type name="StackingMode"/>
<modify-function signature="insertWidget(int,QWidget*)" allow-thread="yes">
@@ -1316,6 +1320,8 @@
</object-type>
<object-type name="QBoxLayout">
+ <inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp"
+ snippet="qwidget-retrieveobjectname"/>
<inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp" snippet="qlayout-help-functions"/>
<enum-type name="Direction"/>
@@ -1346,6 +1352,8 @@
</object-type>
<object-type name="QGridLayout">
+ <inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp"
+ snippet="qwidget-retrieveobjectname"/>
<inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp" snippet="qlayout-help-functions"/>
<modify-function signature="itemAtPosition (int,int)const">
<modify-argument index="return">
@@ -2000,6 +2008,8 @@
<include file-name="QMessageBox" location="global"/>
</extra-includes>
+ <inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp"
+ snippet="qwidget-retrieveobjectname"/>
<inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp" snippet="qwidget-glue"/>
<enum-type name="RenderFlag" flags="RenderFlags"/>
@@ -2857,6 +2867,8 @@
</modify-function>
</object-type>
<object-type name="QFormLayout">
+ <inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp"
+ snippet="qwidget-retrieveobjectname"/>
<inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp" snippet="qlayout-help-functions"/>
<enum-type name="FieldGrowthPolicy"/>
@@ -3337,4 +3349,6 @@
<suppress-warning text="QGraphicsSvgItem::Type' does not have a type entry or is not an enum"/>
<suppress-warning text="QGraphicsTextItem::Type' does not have a type entry or is not an enum"/>
<suppress-warning text="QGraphicsWidget::Type' does not have a type entry or is not an enum"/>
+ <suppress-warning text="signal 'activated' in class 'QCompleter' is overloaded."/>
+ <suppress-warning text="signal 'highlighted' in class 'QCompleter' is overloaded."/>
</typesystem>
diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp
index 66fd3b004..76b0ec0d7 100644
--- a/sources/pyside6/PySide6/glue/qtcore.cpp
+++ b/sources/pyside6/PySide6/glue/qtcore.cpp
@@ -52,8 +52,9 @@
// This avoids that we are passing '0' as defaultValue.
// defaultValue can also be passed as positional argument,
// not only as keyword.
+// PySide-535: Allow for empty dict instead of nullptr in PyPy
QVariant out;
-if (kwds || numArgs > 1) {
+if ((kwds && PyDict_Size(kwds) > 0) || numArgs > 1) {
Py_BEGIN_ALLOW_THREADS
out = %CPPSELF.value(%1, %2);
Py_END_ALLOW_THREADS
@@ -126,16 +127,17 @@ else {
// @snippet qsettings-value
// @snippet conversion-pytypeobject-qmetatype
-if (Shiboken::String::checkType(reinterpret_cast<PyTypeObject *>(%in)))
+auto *pyType = reinterpret_cast<PyTypeObject *&>(%in);
+if (Shiboken::String::checkType(pyType))
%out = QMetaType(QMetaType::QString);
else if (%in == reinterpret_cast<PyObject *>(&PyFloat_Type))
%out = QMetaType(QMetaType::Double);
else if (%in == reinterpret_cast<PyObject *>(&PyLong_Type))
%out = QMetaType(QMetaType::Int);
else if (Py_TYPE(%in) == SbkObjectType_TypeF())
- %out = QMetaType::fromName(Shiboken::ObjectType::getOriginalName((SbkObjectType *)%in));
+ %out = QMetaType::fromName(Shiboken::ObjectType::getOriginalName(pyType));
else
- %out = QMetaType::fromName(reinterpret_cast<PyTypeObject *>(%in)->tp_name);
+ %out = QMetaType::fromName(pyType->tp_name);
// @snippet conversion-pytypeobject-qmetatype
// @snippet conversion-qmetatype-pytypeobject
@@ -149,8 +151,7 @@ return %out;
static QMetaType QVariant_resolveMetaType(PyTypeObject *type)
{
if (PyObject_TypeCheck(type, SbkObjectType_TypeF())) {
- auto sbkType = reinterpret_cast<SbkObjectType *>(type);
- const char *typeName = Shiboken::ObjectType::getOriginalName(sbkType);
+ const char *typeName = Shiboken::ObjectType::getOriginalName(type);
if (!typeName)
return {};
const bool valueType = '*' != typeName[qstrlen(typeName) - 1];
@@ -316,7 +317,7 @@ qAddPostRoutine(PySide::globalPostRoutineCallback);
QList<QByteArray> version = QByteArray(qVersion()).split('.');
PyObject *pyQtVersion = PyTuple_New(3);
for (int i = 0; i < 3; ++i)
- PyTuple_SET_ITEM(pyQtVersion, i, PyInt_FromLong(version[i].toInt()));
+ PyTuple_SET_ITEM(pyQtVersion, i, PyLong_FromLong(version[i].toInt()));
PyModule_AddObject(module, "__version_info__", pyQtVersion);
PyModule_AddStringConstant(module, "__version__", qVersion());
// @snippet qt-version
@@ -649,8 +650,8 @@ static void msgHandlerCallback(QtMsgType type, const QMessageLogContext &ctx, co
PyTuple_SET_ITEM(arglist, 0, %CONVERTTOPYTHON[QtMsgType](type));
PyTuple_SET_ITEM(arglist, 1, %CONVERTTOPYTHON[QMessageLogContext &](ctx));
QByteArray array = msg.toUtf8(); // Python handler requires UTF-8
- char *data = array.data();
- PyTuple_SET_ITEM(arglist, 2, %CONVERTTOPYTHON[char *](data));
+ const char *data = array.constData();
+ PyTuple_SET_ITEM(arglist, 2, %CONVERTTOPYTHON[const char *](data));
Shiboken::AutoDecRef ret(PyObject_CallObject(qtmsghandler, arglist));
}
static void QtCoreModuleExit()
@@ -1315,7 +1316,7 @@ auto *ptr = reinterpret_cast<uchar *>(Shiboken::Buffer::getPointer(%PYARG_1, &si
// %FUNCTION_NAME() - disable generation of c++ function call
(void) %2; // remove warning about unused variable
Shiboken::AutoDecRef emptyTuple(PyTuple_New(0));
-auto *timerType = reinterpret_cast<PyTypeObject *>(Shiboken::SbkType<QTimer>());
+auto *timerType = Shiboken::SbkType<QTimer>();
auto *pyTimer = timerType->tp_new(Shiboken::SbkType<QTimer>(), emptyTuple, nullptr);
timerType->tp_init(pyTimer, emptyTuple, nullptr);
@@ -1338,7 +1339,7 @@ timer->start(%1);
// @snippet qtimer-singleshot-2
// %FUNCTION_NAME() - disable generation of c++ function call
Shiboken::AutoDecRef emptyTuple(PyTuple_New(0));
-auto *timerType = reinterpret_cast<PyTypeObject *>(Shiboken::SbkType<QTimer>());
+auto *timerType = Shiboken::SbkType<QTimer>();
auto *pyTimer = timerType->tp_new(Shiboken::SbkType<QTimer>(), emptyTuple, nullptr);
timerType->tp_init(pyTimer, emptyTuple, nullptr);
QTimer * timer = %CONVERTTOCPP[QTimer *](pyTimer);
@@ -1429,7 +1430,7 @@ if (result == -1) {
Py_INCREF(Py_None);
%PYARG_0 = Py_None;
} else {
- %PYARG_0 = PyBytes_FromStringAndSize(data.data(), result);
+ %PYARG_0 = PyBytes_FromStringAndSize(data.constData(), result);
}
// @snippet qdatastream-readrawdata
@@ -1548,11 +1549,11 @@ QString &res = *%0;
// @snippet return-readData
%RETURN_TYPE %0 = 0;
if (PyBytes_Check(%PYARG_0)) {
- %0 = PyBytes_GET_SIZE((PyObject *)%PYARG_0);
- memcpy(%1, PyBytes_AS_STRING((PyObject *)%PYARG_0), %0);
-} else if (Shiboken::String::check(%PYARG_0)) {
- %0 = Shiboken::String::len((PyObject *)%PYARG_0);
- memcpy(%1, Shiboken::String::toCString((PyObject *)%PYARG_0), %0);
+ %0 = PyBytes_GET_SIZE(%PYARG_0.object());
+ memcpy(%1, PyBytes_AS_STRING(%PYARG_0.object()), %0);
+} else if (Shiboken::String::check(%PYARG_0.object())) {
+ %0 = Shiboken::String::len(%PYARG_0.object());
+ memcpy(%1, Shiboken::String::toCString(%PYARG_0.object()), %0);
}
// @snippet return-readData
@@ -1681,25 +1682,19 @@ if (PyErr_WarnEx(PyExc_DeprecationWarning,
// @snippet conversion-pylong-quintptr
// @snippet conversion-pyunicode
-#ifndef Py_LIMITED_API
-void *data = PyUnicode_DATA(%in);
+void *data = _PepUnicode_DATA(%in);
Py_ssize_t len = PyUnicode_GetLength(%in);
-switch (PyUnicode_KIND(%in)) {
- case PyUnicode_1BYTE_KIND:
+switch (_PepUnicode_KIND(%in)) {
+ case PepUnicode_1BYTE_KIND:
%out = QString::fromLatin1(reinterpret_cast<const char *>(data));
break;
- case PyUnicode_2BYTE_KIND:
+ case PepUnicode_2BYTE_KIND:
%out = QString::fromUtf16(reinterpret_cast<const char16_t *>(data), len);
break;
- case PyUnicode_4BYTE_KIND:
+ case PepUnicode_4BYTE_KIND:
%out = QString::fromUcs4(reinterpret_cast<const char32_t *>(data), len);
break;
}
-#else
-wchar_t *temp = PyUnicode_AsWideCharString(%in, nullptr);
-%out = QString::fromWCharArray(temp);
-PyMem_Free(temp);
-#endif
// @snippet conversion-pyunicode
// @snippet conversion-pynone
@@ -1859,6 +1854,11 @@ QByteArray ba = %in.toUtf8();
return PyUnicode_FromStringAndSize(ba.constData(), ba.size());
// @snippet return-pyunicode
+// @snippet return-pyunicode-from-qanystringview
+QByteArray ba = %in.toString().toUtf8();
+return PyUnicode_FromStringAndSize(ba.constData(), ba.size());
+// @snippet return-pyunicode-from-qanystringview
+
// @snippet return-pyunicode-qchar
auto c = wchar_t(%in.unicode());
return PyUnicode_FromWideChar(&c, 1);
@@ -1966,3 +1966,25 @@ Py_DECREF(suffix);
%PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.size(),
Shiboken::Buffer::ReadWrite);
// @snippet qsharedmemory_data_readwrite
+
+// @snippet std-function-void-lambda
+auto *callable = %PYARG_1;
+auto cppCallback = [callable]()
+{
+ Shiboken::GilState state;
+ Shiboken::AutoDecRef arglist(PyTuple_New(0));
+ Shiboken::AutoDecRef ret(PyObject_CallObject(callable, arglist));
+ Py_DECREF(callable);
+};
+// @snippet std-function-void-lambda
+
+// @snippet qthreadpool-start
+Py_INCREF(callable);
+%CPPSELF.%FUNCTION_NAME(cppCallback, %2);
+// @snippet qthreadpool-start
+
+// @snippet qthreadpool-trystart
+Py_INCREF(callable);
+%RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(cppCallback);
+%PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
+// @snippet qthreadpool-trystart
diff --git a/sources/pyside6/PySide6/glue/qtdatavisualization.cpp b/sources/pyside6/PySide6/glue/qtdatavisualization.cpp
index b22340801..21c8eb23f 100644
--- a/sources/pyside6/PySide6/glue/qtdatavisualization.cpp
+++ b/sources/pyside6/PySide6/glue/qtdatavisualization.cpp
@@ -77,3 +77,8 @@ using ListType = decltype(%2);
using ListType = decltype(%2);
%CPPSELF.setRow(%1, new ListType(%2), %3);
// @snippet dataproxy-setrow-string
+//
+// @snippet dataproxy-resetarray
+using ListType = decltype(%1);
+%CPPSELF.resetArray(new ListType(%1));
+// @snippet dataproxy-resetarray
diff --git a/sources/pyside6/PySide6/glue/qtgui.cpp b/sources/pyside6/PySide6/glue/qtgui.cpp
index 6b30952d2..81181dac4 100644
--- a/sources/pyside6/PySide6/glue/qtgui.cpp
+++ b/sources/pyside6/PySide6/glue/qtgui.cpp
@@ -41,6 +41,101 @@
* INJECT CODE
********************************************************************/
+// @snippet qaccessible-pysidefactory
+// Helper for QAccessible::installFactory() that forwards the calls to
+// Python callables.
+class PySideAccessibleFactory
+{
+ PySideAccessibleFactory() = default;
+public:
+ ~PySideAccessibleFactory();
+
+ static PySideAccessibleFactory *instance() { return m_instance; }
+ static PySideAccessibleFactory *ensureInstance();
+
+ static void installFactory(PyObject *f);
+ static void cleanup();
+
+ static QAccessibleInterface *factory(const QString &key, QObject *o);
+
+private:
+ QAccessibleInterface *callFactories(const QString &key, QObject *o);
+
+ static PySideAccessibleFactory *m_instance;
+
+ QList<PyObject *> m_factoryFunctions;
+ QList<PyObject *> m_objects;
+};
+
+PySideAccessibleFactory *PySideAccessibleFactory::m_instance = nullptr;
+
+PySideAccessibleFactory::~PySideAccessibleFactory()
+{
+ QAccessible::removeFactory(PySideAccessibleFactory::factory);
+ if (!m_factoryFunctions.isEmpty()) {
+ Shiboken::GilState state;
+ for (auto *f : m_factoryFunctions)
+ Py_DECREF(f);
+ for (auto *o : m_objects)
+ Py_DECREF(o);
+ }
+}
+
+PySideAccessibleFactory *PySideAccessibleFactory::ensureInstance()
+{
+ if (m_instance == nullptr) {
+ m_instance = new PySideAccessibleFactory;
+ QAccessible::installFactory(PySideAccessibleFactory::factory);
+ qAddPostRoutine(PySideAccessibleFactory::cleanup);
+ }
+ return m_instance;
+}
+
+void PySideAccessibleFactory::installFactory(PyObject *f)
+{
+ if (m_instance != nullptr) {
+ Py_INCREF(f);
+ m_instance->m_factoryFunctions.append(f);
+ }
+}
+
+void PySideAccessibleFactory::cleanup()
+{
+ delete m_instance;
+ m_instance = nullptr;
+}
+
+QAccessibleInterface *PySideAccessibleFactory::factory(const QString &key, QObject *o)
+{
+ return m_instance ? m_instance->callFactories(key, o) : nullptr;
+}
+
+QAccessibleInterface *PySideAccessibleFactory::callFactories(const QString &key, QObject *o)
+{
+ Shiboken::GilState state;
+ Shiboken::AutoDecRef arglist(PyTuple_New(2));
+ PyTuple_SET_ITEM(arglist, 0, %CONVERTTOPYTHON[QString](key));
+ PyTuple_SET_ITEM(arglist, 1, %CONVERTTOPYTHON[QObject *](o));
+
+ for (auto *f : m_factoryFunctions) {
+ if (PyObject *pyResult = PyObject_CallObject(f, arglist)) {
+ if (pyResult != Py_None) {
+ m_objects.append(pyResult);
+ QAccessibleInterface* result = %CONVERTTOCPP[QAccessibleInterface *](pyResult);
+ return result;
+ }
+ Py_DECREF(pyResult);
+ }
+ }
+
+ return nullptr;
+}
+// @snippet qaccessible-pysidefactory
+
+// @snippet qaccessible-installfactory
+PySideAccessibleFactory::ensureInstance()->installFactory(%1);
+// @snippet qaccessible-installfactory
+
// @snippet glgetshadersource
GLsizei bufSize = 4096;
GLsizei length = bufSize - 1;
@@ -474,7 +569,7 @@ const auto points = PySide::Numpy::xyDataToQPointFList(%PYARG_1, %PYARG_2);
// @snippet qpainter-drawpointsnp-numpy-x-y
// @snippet qpainter-drawpolygon
-%CPPSELF.%FUNCTION_NAME(%1.data(), %1.size(), %2);
+%CPPSELF.%FUNCTION_NAME(%1.constData(), %1.size(), %2);
// @snippet qpainter-drawpolygon
// @snippet qmatrix4x4
@@ -510,8 +605,8 @@ if (PySequence_Check(_key)) {
if (PySequence_Fast_GET_SIZE(key.object()) == 2) {
PyObject *posx = PySequence_Fast_GET_ITEM(key.object(), 0);
PyObject *posy = PySequence_Fast_GET_ITEM(key.object(), 1);
- Py_ssize_t x = PyInt_AsSsize_t(posx);
- Py_ssize_t y = PyInt_AsSsize_t(posy);
+ Py_ssize_t x = PyLong_AsSsize_t(posx);
+ Py_ssize_t y = PyLong_AsSsize_t(posy);
float ret = (*%CPPSELF)(x,y);
return %CONVERTTOPYTHON[float](ret);
}
diff --git a/sources/pyside6/PySide6/glue/qtmultimedia.cpp b/sources/pyside6/PySide6/glue/qtmultimedia.cpp
index ddb63740f..36f831f07 100644
--- a/sources/pyside6/PySide6/glue/qtmultimedia.cpp
+++ b/sources/pyside6/PySide6/glue/qtmultimedia.cpp
@@ -39,7 +39,8 @@
// @snippet qvideoframe-bits
%BEGIN_ALLOW_THREADS
-%RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME();
+%RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(%1);
%END_ALLOW_THREADS
-%PYARG_0 = Shiboken::Buffer::newObject(%0, %CPPSELF.bytesPerLine() * %CPPSELF.height(), Shiboken::Buffer::ReadWrite);
+const auto size = %CPPSELF.mappedBytes(%1);
+%PYARG_0 = Shiboken::Buffer::newObject(%0, size, Shiboken::Buffer::ReadWrite);
// @snippet qvideoframe-bits
diff --git a/sources/pyside6/PySide6/glue/qtqml.cpp b/sources/pyside6/PySide6/glue/qtqml.cpp
index eab6eab95..99a1c441a 100644
--- a/sources/pyside6/PySide6/glue/qtqml.cpp
+++ b/sources/pyside6/PySide6/glue/qtqml.cpp
@@ -57,6 +57,11 @@ int %0 = PySide::qmlRegisterSingletonType(nullptr, %ARGUMENT_NAMES, false, true)
%PYARG_0 = %CONVERTTOPYTHON[int](%0);
// @snippet qmlregistersingletontype_qjsvalue
+// @snippet qmlregistersingletoninstance
+int %0 = PySide::qmlRegisterSingletonInstance(%ARGUMENT_NAMES);
+%PYARG_0 = %CONVERTTOPYTHON[int](%0);
+// @snippet qmlregistersingletoninstance
+
// @snippet qmlregisteruncreatabletype
int %0 = PySide::qmlRegisterType(%ARGUMENT_NAMES, false);
%PYARG_0 = %CONVERTTOPYTHON[int](%0);
diff --git a/sources/pyside6/PySide6/glue/qtstatemachine.cpp b/sources/pyside6/PySide6/glue/qtstatemachine.cpp
index 8a00bd3fd..16b096b5d 100644
--- a/sources/pyside6/PySide6/glue/qtstatemachine.cpp
+++ b/sources/pyside6/PySide6/glue/qtstatemachine.cpp
@@ -43,12 +43,13 @@
// @snippet qsignaltransition
if (PyObject_TypeCheck(%1, PySideSignalInstanceTypeF())) {
- PyObject *dataSource = PySide::Signal::getObject((PySideSignalInstance *)%PYARG_1);
+ auto *signalInstance = reinterpret_cast<PySideSignalInstance *>(%PYARG_1);
+ PyObject *dataSource = PySide::Signal::getObject(signalInstance);
Shiboken::AutoDecRef obType(PyObject_Type(dataSource));
QObject * sender = %CONVERTTOCPP[QObject *](dataSource);
//XXX /|\ omitting this space crashes shiboken!
if (sender) {
- const char *dataSignature = PySide::Signal::getSignature((PySideSignalInstance *)%PYARG_1);
+ const char *dataSignature = PySide::Signal::getSignature(signalInstance);
QByteArray signature(dataSignature); // Append SIGNAL flag (2)
signature.prepend('2');
%0 = new QSignalTransitionWrapper(sender, signature, %2);
diff --git a/sources/pyside6/PySide6/glue/qtwidgets.cpp b/sources/pyside6/PySide6/glue/qtwidgets.cpp
index ca9acb349..802a3c172 100644
--- a/sources/pyside6/PySide6/glue/qtwidgets.cpp
+++ b/sources/pyside6/PySide6/glue/qtwidgets.cpp
@@ -55,8 +55,8 @@ Shiboken::Object::releaseOwnership(%PYARG_0);
// @snippet qtreewidgetitemiterator-value
// @snippet qgraphicsitem
-PyObject *userTypeConstant = PyInt_FromLong(QGraphicsItem::UserType);
-PyDict_SetItemString(reinterpret_cast<PyTypeObject *>(Sbk_QGraphicsItem_TypeF())->tp_dict, "UserType", userTypeConstant);
+PyObject *userTypeConstant = PyLong_FromLong(QGraphicsItem::UserType);
+PyDict_SetItemString(Sbk_QGraphicsItem_TypeF()->tp_dict, "UserType", userTypeConstant);
// @snippet qgraphicsitem
// @snippet qgraphicsitem-scene-return-parenting
@@ -211,12 +211,6 @@ if (_widget) {
void addLayoutOwnership(QLayout *layout, QLayoutItem *item);
void removeLayoutOwnership(QLayout *layout, QWidget *widget);
-inline QByteArray retrieveObjectName(PyObject *obj)
-{
- Shiboken::AutoDecRef objName(PyObject_Str(obj));
- return Shiboken::String::toCString(objName);
-}
-
inline void addLayoutOwnership(QLayout *layout, QWidget *widget)
{
//transfer ownership to parent widget
@@ -232,7 +226,9 @@ inline void addLayoutOwnership(QLayout *layout, QWidget *widget)
if (!lw && !pw) {
//keep the reference while the layout is orphan
Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget *](layout));
- Shiboken::Object::keepReference(reinterpret_cast<SbkObject *>(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild, true);
+ Shiboken::Object::keepReference(reinterpret_cast<SbkObject *>(pyParent.object()),
+ retrieveObjectName(pyParent).constData(),
+ pyChild, true);
} else {
if (!lw)
lw = pw;
@@ -250,7 +246,8 @@ inline void addLayoutOwnership(QLayout *layout, QLayout *other)
Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QLayout *](layout));
Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayout *](other));
Shiboken::Object::keepReference(reinterpret_cast<SbkObject *>(pyParent.object()),
- retrieveObjectName(pyParent).data(), pyChild, true);
+ retrieveObjectName(pyParent).constData(),
+ pyChild, true);
return;
}
@@ -295,7 +292,8 @@ static void removeWidgetFromLayout(QLayout *layout, QWidget *widget)
Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget *](layout));
Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QWidget *](widget));
Shiboken::Object::removeReference(reinterpret_cast<SbkObject *>(pyParent.object()),
- retrieveObjectName(pyParent).data(), pyChild);
+ retrieveObjectName(pyParent).constData(),
+ pyChild);
}
}
@@ -430,13 +428,15 @@ for (int i = 0, count = %CPPSELF.count(); i < count; ++i) {
%CPPSELF.%FUNCTION_NAME();
// @snippet qlistwidget-clear
-// @snippet qwidget-glue
-static QString retrieveObjectName(PyObject *obj)
+// @snippet qwidget-retrieveobjectname
+static QByteArray retrieveObjectName(PyObject *obj)
{
Shiboken::AutoDecRef objName(PyObject_Str(obj));
- return QString(Shiboken::String::toCString(objName));
+ return Shiboken::String::toCString(objName);
}
+// @snippet qwidget-retrieveobjectname
+// @snippet qwidget-glue
// Transfer objects ownership from layout to widget
static inline void qwidgetReparentLayout(QWidget *parent, QLayout *layout)
@@ -464,7 +464,8 @@ static inline void qwidgetReparentLayout(QWidget *parent, QLayout *layout)
Shiboken::Object::setParent(pyParent, pyChild);
//remove previous references
Shiboken::Object::keepReference(reinterpret_cast<SbkObject *>(pyChild.object()),
- qPrintable(retrieveObjectName(pyChild)), Py_None);
+ retrieveObjectName(pyChild).constData(),
+ Py_None);
}
static inline void qwidgetSetLayout(QWidget *self, QLayout *layout)
diff --git a/sources/pyside6/PySide6/support/generate_pyi.py b/sources/pyside6/PySide6/support/generate_pyi.py
index e618ae0a7..ecc04019b 100644
--- a/sources/pyside6/PySide6/support/generate_pyi.py
+++ b/sources/pyside6/PySide6/support/generate_pyi.py
@@ -99,8 +99,6 @@ def generate_all_pyi(outpath, options):
if __name__ == "__main__":
- # PYSIDE-1621: Enforce embedding to ensure that it always works.
- sys.pyside_uses_embedding = True
parser = argparse.ArgumentParser(
description="This script generates the .pyi file for all PySide modules.")
parser.add_argument("modules", nargs="+",
diff --git a/sources/pyside6/PySide6/templates/core_common.xml b/sources/pyside6/PySide6/templates/core_common.xml
index e8fbb083b..abc0d6425 100644
--- a/sources/pyside6/PySide6/templates/core_common.xml
+++ b/sources/pyside6/PySide6/templates/core_common.xml
@@ -114,35 +114,52 @@
<insert-template name="tuple_retval_ok"/>
</template>
+ <!-- QInputDialog: these should allow threads -->
<template name="fix_arg,arg,arg,arg,arg,arg,arg,bool*,arg">
bool ok_;
- %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, %7, &amp;ok_, %9);
+ %RETURN_TYPE retval_;
+ Py_BEGIN_ALLOW_THREADS
+ retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, %7, &amp;ok_, %9);
+ Py_END_ALLOW_THREADS
<insert-template name="tuple_retval_ok"/>
</template>
<template name="fix_arg,arg,arg,arg,arg,arg,arg,bool*,arg,arg">
bool ok_;
- %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, %7, &amp;ok_, %9, %10);
+ %RETURN_TYPE retval_;
+ Py_BEGIN_ALLOW_THREADS
+ retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, %7, &amp;ok_, %9, %10);
+ Py_END_ALLOW_THREADS
<insert-template name="tuple_retval_ok"/>
</template>
<template name="fix_arg,arg,arg,arg,arg,arg,bool*,arg">
bool ok_;
- %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, &amp;ok_, %8);
+ %RETURN_TYPE retval_;
+ Py_BEGIN_ALLOW_THREADS
+ retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, &amp;ok_, %8);
+ Py_END_ALLOW_THREADS
<insert-template name="tuple_retval_ok"/>
</template>
<template name="fix_arg,arg,arg,arg,arg,bool*,arg">
bool ok_;
- %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, &amp;ok_, %7);
+ %RETURN_TYPE retval_;
+ Py_BEGIN_ALLOW_THREADS
+ retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, &amp;ok_, %7);
+ Py_END_ALLOW_THREADS
<insert-template name="tuple_retval_ok"/>
</template>
<template name="fix_arg,arg,arg,arg,bool*,arg,arg">
bool ok_;
- %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, &amp;ok_, %6, %7);
+ %RETURN_TYPE retval_;
+ Py_BEGIN_ALLOW_THREADS
+ retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, &amp;ok_, %6, %7);
+ Py_END_ALLOW_THREADS
<insert-template name="tuple_retval_ok"/>
</template>
+ <!-- End of QInputDialog templates -->
<template name="fix_char*">
char val_{};
@@ -176,10 +193,10 @@
PyObject* _obj = %PYARG_0.object();
if (!PySequence_Check(_obj)
|| PySequence_Fast_GET_SIZE(_obj) != 4
- || !SbkNumber_Check(PySequence_Fast_GET_ITEM(_obj, 0))
- || !SbkNumber_Check(PySequence_Fast_GET_ITEM(_obj, 1))
- || !SbkNumber_Check(PySequence_Fast_GET_ITEM(_obj, 2))
- || !SbkNumber_Check(PySequence_Fast_GET_ITEM(_obj, 3))) {
+ || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 0))
+ || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 1))
+ || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 2))
+ || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 3))) {
PyErr_SetString(PyExc_TypeError, "Sequence of 4 numbers expected");
} else {
*%1 = %CONVERTTOCPP[$TYPE](PySequence_Fast_GET_ITEM(_obj, 0));
diff --git a/sources/pyside6/PySide6/templates/gui_common.xml b/sources/pyside6/PySide6/templates/gui_common.xml
index 874f8df5f..b802054a8 100644
--- a/sources/pyside6/PySide6/templates/gui_common.xml
+++ b/sources/pyside6/PySide6/templates/gui_common.xml
@@ -172,7 +172,7 @@
</template>
<template name="qpainter_drawlist">
- %CPPSELF.%FUNCTION_NAME(%1.data(), %1.size());
+ %CPPSELF.%FUNCTION_NAME(%1.constData(), %1.size());
</template>
<template name="inplace_add">
diff --git a/sources/pyside6/PySide6/templates/opengl_common.xml b/sources/pyside6/PySide6/templates/opengl_common.xml
index e4e15e770..8160a13ba 100644
--- a/sources/pyside6/PySide6/templates/opengl_common.xml
+++ b/sources/pyside6/PySide6/templates/opengl_common.xml
@@ -55,7 +55,7 @@
%CPPSELF.%FUNCTION_NAME(%1, _list, $ARG0);
delete[] _list;
} else {
- %CPPSELF.%FUNCTION_NAME(%1, ($ATTR_TYPE*)nullptr, $ARG1);
+ %CPPSELF.%FUNCTION_NAME(%1, reinterpret_cast&lt;$ATTR_TYPE*&gt;(nullptr), $ARG1);
}
</template>
<template name="glGetString_return_QString">
diff --git a/sources/pyside6/doc/CMakeLists.txt b/sources/pyside6/doc/CMakeLists.txt
index f900b96eb..b36c1828f 100644
--- a/sources/pyside6/doc/CMakeLists.txt
+++ b/sources/pyside6/doc/CMakeLists.txt
@@ -184,6 +184,7 @@ configure_file("conf.py.in" "rst/conf.py" @ONLY)
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/rst/PySide6/QtCore/index.rst"
COMMAND Shiboken6::shiboken6 --generator-set=qtdoc ${docHeader}
+ --enable-pyside-extensions
--include-paths="${QT_INCLUDE_DIR}${PATH_SEP}${pyside6_SOURCE_DIR}${PATH_SEP}${TS_ROOT}"
--api-version=${SUPPORTED_QT_VERSION}
--typesystem-paths="${QDOC_TYPESYSTEM_PATH}"
diff --git a/sources/pyside6/doc/_templates/layout.html b/sources/pyside6/doc/_templates/layout.html
index 6ab1276a3..630fb9533 100644
--- a/sources/pyside6/doc/_templates/layout.html
+++ b/sources/pyside6/doc/_templates/layout.html
@@ -1,29 +1,45 @@
{% extends "!layout.html" %}
-# Invert sidebars
{%- block sidebar1 %}{{ sidebar() }}{%- endblock %}
{%- block sidebar2 %}{%- endblock %}
+{% block sidebarlogo %}
+<div class="logo">
+ <a href="http://www.pyside.org">
+ <img alt="PySide" src="{{ pathto('_static/pysidelogo.png', 1) }}"/>
+ </a>
+</div>
+{% endblock %}
+
{%- block header %}
<div id="container">
-<div class="header">
+ <div class="header">
<div class="header_container">
- <div class="logo"><a href="http://www.pyside.org"><img alt="PySide" src="{{ pathto('_static/pysidelogo.png', 1) }}"/></a></div>
- <div class="related">
- <ul>
- {%- block rootrellink %}
- <li><a href="{{ pathto( 'index' ) }}">{{ shorttitle|e }}</a></li>
- {%- endblock %}
- {%- for parent in parents %}
- <li>{{ reldelim1 }} <a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a></li>
- {%- endfor %}
- {%- block relbaritems %} {% endblock %}
- </ul>
- </div>
+ <div class="related">
+ <ul>
+ {%- block rootrellink %}
+ <li><a href="{{ pathto( 'index' ) }}">{{ shorttitle|e }}</a></li>
+ {%- endblock %}
+ {%- for parent in parents %}
+ <li>{{ reldelim1 }} <a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a></li>
+ {%- endfor %}
+ {%- block relbaritems %} {% endblock %}
+ </ul>
+ </div>
</div>
-</div>
+ </div>
{%- endblock -%}
+{%- block document %}
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+ {% block body %} {% endblock %}
+ </div>
+ </div>
+ </div>
+{% endblock %}
+
{%- block footer %}
<div class="footer">
<a href="http://www.qt.io/"><img src="{{ pathto('_static/logo_qt.png', 1) }}" alt="Qt" border="0" /></a>
@@ -33,8 +49,5 @@
</div>
{%- endblock %}
-# No top relbar.
{%- block relbar1 %}{%- endblock %}
-
-# No bottom relbar.
{%- block relbar2 %}{%- endblock %}
diff --git a/sources/pyside6/doc/_themes/pysidedocs/static/pyside.css b/sources/pyside6/doc/_themes/pysidedocs/static/pyside.css
index c4767f57f..e0fd3d507 100644
--- a/sources/pyside6/doc/_themes/pysidedocs/static/pyside.css
+++ b/sources/pyside6/doc/_themes/pysidedocs/static/pyside.css
@@ -1206,7 +1206,7 @@ div.multi-column div {
.sphinxsidebar {
position: -webkit-sticky;
position: sticky;
- top: 64px;
+ top: 0px;
width: 200px;
overflow: scroll;
overflow-x: hidden;
@@ -2168,6 +2168,15 @@ div.rightside {
border-color: #fff;
}
+.btn-link {
+ color: #41cd52 !important;
+}
+
+.btn-link:hover {
+ color: #222840 !important;
+ text-decoration: underline;
+}
+
/* Using !important is not recommended, but out CSS is being added
* to the pages before the bootstrap ones, so we cannot override them
* without using it */
@@ -2176,20 +2185,14 @@ div.rightside {
border-color: #41cd52 !important;
font-weight: bold !important;
}
-
-.card {
- height: 250px;
- text-align: center;
+.card-img-top-main {
+ padding-top: 10px;
+ height: 70px !important;
}
.card-img-top {
- object-fit: cover;
- width: 50px;
+ object-fit: contain;
height: 120px;
-}
-
-.card-body {
- vertical-align: middle;
- padding: 5px !important;
- text-align: center;
+ padding-top: 20px;
+ transform: scale(1.3, 1.3);
}
diff --git a/sources/pyside6/doc/conf.py.in b/sources/pyside6/doc/conf.py.in
index 55726f21a..94f81e105 100644
--- a/sources/pyside6/doc/conf.py.in
+++ b/sources/pyside6/doc/conf.py.in
@@ -86,8 +86,6 @@ release = '@BINDING_API_VERSION_FULL@'
# for source files.
exclude_patterns = ['_build',
'extras',
- 'tutorials/datavisualize', # not in 6.0.0
- 'tutorials/expenses', # not in 6.0.0
]
# The reST default role (used for this markup: `text`) to use for all documents.
diff --git a/sources/pyside6/doc/contents.rst b/sources/pyside6/doc/contents.rst
index b11298016..2dbd09997 100644
--- a/sources/pyside6/doc/contents.rst
+++ b/sources/pyside6/doc/contents.rst
@@ -12,7 +12,6 @@
examples/index.rst
videos.rst
deployment.rst
- licenses.rst
modules.rst
considerations.rst
..
diff --git a/sources/pyside6/doc/deployment-nuitka.rst b/sources/pyside6/doc/deployment-nuitka.rst
new file mode 100644
index 000000000..9be982a4c
--- /dev/null
+++ b/sources/pyside6/doc/deployment-nuitka.rst
@@ -0,0 +1,132 @@
+|project| & Nuitka
+##################
+
+`Nuitka <https://nuitka.net/>`_ lets you compile your python application into a
+stand-alone executable. Besides being a Python compiler which provides a fair
+acceleration, it has the side-effect of acting as an installer as well.
+Nuitka supports Linux, macOS and Windows.
+
+For more details, see the `official documentation <https://nuitka.net/pages/overview.html>`_.
+
+Preparation
+===========
+
+Install `Nuitka` via **pip** with the following command::
+
+ pip3 install nuitka
+
+After installation, the `nuitka3` binary is located in your virtual environment's `bin/`
+directory, or where your Python executable is located.
+Alternatively, you can also run::
+
+ python3 -m nuitka
+
+to achieve the same effect.
+
+Freeze an application
+=====================
+
+`Nuitka` has many options that you can use. To list them all, run `nuitka3 -h`.
+
+To simply compile a project, you can run::
+
+ nuitka3 <programname>
+
+There are two main features:
+
+ * the option to place it in a directory containing the libraries
+ (`--standalone`)
+ * the option to package the whole project (including shared libraries) into one executable file
+ (`--onefile`)
+
+If you use these options, you need to specify `--plugin-enable=pyside6`.
+
+Run an example
+--------------
+
+Now, consider the following script, named `hello.py`::
+
+ import sys
+ import random
+ from PySide6.QtWidgets import (QApplication, QLabel, QPushButton,
+ QVBoxLayout, QWidget)
+ from PySide6.QtCore import Slot, Qt
+
+ class MyWidget(QWidget):
+ def __init__(self):
+ QWidget.__init__(self)
+
+ self.hello = ["Hallo Welt", "你好,世界", "Hei maailma",
+ "Hola Mundo", "Привет мир"]
+
+ self.button = QPushButton("Click me!")
+ self.text = QLabel("Hello World")
+ self.text.setAlignment(Qt.AlignCenter)
+
+ self.layout = QVBoxLayout()
+ self.layout.addWidget(self.text)
+ self.layout.addWidget(self.button)
+ self.setLayout(self.layout)
+
+ # Connecting the signal
+ self.button.clicked.connect(self.magic)
+
+ @Slot()
+ def magic(self):
+ self.text.setText(random.choice(self.hello))
+
+ if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ widget = MyWidget()
+ widget.resize(800, 600)
+ widget.show()
+
+ sys.exit(app.exec())
+
+You don't have to copy this script. You find it as `examples/installer_test/hello.py`.
+
+The command line to proceed looks like this::
+
+ nuitka3 examples/installer_test/hello.py
+
+This process creates an executable `hello.bin` and a directory hello.build that you
+don't need. You can execute the binary directly.
+
+In order to create a bundle which can be copied onto a machine without any pre-existing
+installation, run::
+
+ nuitka3 --standalone --plugin-enable=pyside6 examples/installer_test/hello.py
+
+This creates an application `hello.dist/hello` that contains everything needed to run.
+
+To run the application, go to `hello.dist/` and run the program::
+
+ cd hello.dist
+ ./hello
+
+Use the `--onefile` option if you prefer to have everything bundled into one executable, without
+the shared libraries next to it. First you need to install::
+
+ pip3 install zstandard
+
+for data compression. Then you can run
+
+ nuitka3 --onefile --plugin-enable=pyside6 examples/installer_test/hello.py
+
+This process takes a bit longer, but in the end you have one executable `hello.bin`::
+
+ ./hello.bin
+
+
+Some Caveats
+============
+
+
+Nuitka issue on macOS
+---------------------
+
+Nuitka currently has a problem with the macOS bundle files on current macOS versions.
+That has the effect that `--standalone` and `--onefile` create a crashing application.
+Older versions which don't have the recent macOS API changes from 2020 will work.
+We are currently trying to fix that problem.
diff --git a/sources/pyside6/doc/deployment.rst b/sources/pyside6/doc/deployment.rst
index a294905a0..f8b22ae44 100644
--- a/sources/pyside6/doc/deployment.rst
+++ b/sources/pyside6/doc/deployment.rst
@@ -104,6 +104,15 @@ The following table summarizes the platform support for those packaging tools:
<td><p style="color: green;">yes</p></td>
<td><p style="color: green;">yes</p></td>
</tr>
+ <tr>
+ <td><p>Nuitka</p></td>
+ <td><p>MIT</p></td>
+ <td><p style="color: green;">yes</p></td>
+ <td><p style="color: green;">yes</p></td>
+ <td><p style="color: green;">yes</p></td>
+ <td><p style="color: green;">yes</p></td>
+ <td><p style="color: green;">yes</p></td>
+ </tr>
</tbody>
</table>
@@ -134,3 +143,4 @@ Here's a set of tutorials on how to use these tools:
deployment-cxfreeze.rst
deployment-briefcase.rst
deployment-py2exe.rst
+ deployment-nuitka.rst
diff --git a/sources/pyside6/doc/extras/QtCore.ClassInfo.rst b/sources/pyside6/doc/extras/QtCore.ClassInfo.rst
index b767ae153..0cb6d32ed 100644
--- a/sources/pyside6/doc/extras/QtCore.ClassInfo.rst
+++ b/sources/pyside6/doc/extras/QtCore.ClassInfo.rst
@@ -4,20 +4,33 @@
ClassInfo
*********
-This class is used to associates extra information to the class, which is available
+This class is used to associate extra information to the class, which is available
using QObject.metaObject(). Qt and PySide doesn't use this information.
The extra information takes the form of a dictionary with key and value in a literal string.
+The recommended usage is to provide the key/value using python keyword syntax, where the
+keyword becomes the key, and the provided string becomes the value.
+
+If the key needs to contain special characters (spaces, commas, '::', start with a number, etc),
+it is also possible to pass a python dictionary with arbitrary strings for both the key and
+value and enabling special characters in the key.
+
.. note:: This Class is a implementation of Q_CLASSINFO macro.
-
+
Example
-------
::
+ # Recommended syntax
@ClassInfo(Author='PySide Team', URL='http://www.pyside.org')
class MyObject(QObject):
...
+
+ # Provided to support keys not supported by Python's keyword syntax
+ @ClassInfo({'Some key text $': 'This syntax supports special characters in keys'})
+ class MyObject(QObject):
+ ...
diff --git a/sources/pyside6/doc/extras/QtQml.qmlRegisterSingletonInstance.rst b/sources/pyside6/doc/extras/QtQml.qmlRegisterSingletonInstance.rst
new file mode 100644
index 000000000..19d59893e
--- /dev/null
+++ b/sources/pyside6/doc/extras/QtQml.qmlRegisterSingletonInstance.rst
@@ -0,0 +1,25 @@
+.. currentmodule:: PySide6.QtQml
+.. _qmlRegisterSingletonInstance:
+
+qmlRegisterSingletonInstance
+****************************
+
+.. py:function:: qmlRegisterSingletonInstance(pytype: type,\
+ uri: str,\
+ versionMajor: int,\
+ versionMinor: int,\
+ typeName: str,\
+ instanceObject: object) -> int
+
+ :param type pytype: Python class
+ :param str uri: uri to use while importing the component in QML
+ :param int versionMajor: major version
+ :param int versionMinor: minor version
+ :param str typeName: name exposed to QML
+ :param object instanceObject: singleton object to be registered
+ :return: int (the QML type id)
+
+ This function registers a singleton Python object *instanceObject*, with a particular *uri* and
+ *typeName*. Its version is a combination of *versionMajor* and *versionMinor*.
+
+ Use this function to register an object of the given type *pytype* as a singleton type.
diff --git a/sources/pyside6/doc/feature-why.rst b/sources/pyside6/doc/feature-why.rst
index b95cb77ac..a2f3e146b 100644
--- a/sources/pyside6/doc/feature-why.rst
+++ b/sources/pyside6/doc/feature-why.rst
@@ -256,6 +256,15 @@ When using ``__feature__`` often with common IDEs, you may want to provide
a feature-aware version of ``.pyi`` files to get a correct display. The simplest
way to change them all in-place is the command
+
+Using __feature__ with UIC files
+--------------------------------
+
+Features can be freely used together with generated UIC files. The UIC files
+are _not_ converted, intentionally. Mixing them with feature selections in other
+Python modules should always work, because switching will happen as needed, selected
+by the currently active module. (Please report to us if this fails for an example)
+
.. code-block:: python
pyside6-genpyi all --feature snake_case true_property
diff --git a/sources/pyside6/doc/gettingstarted.rst b/sources/pyside6/doc/gettingstarted.rst
index 58a5d646b..6b2ced6d4 100644
--- a/sources/pyside6/doc/gettingstarted.rst
+++ b/sources/pyside6/doc/gettingstarted.rst
@@ -46,11 +46,10 @@ You can refer to the following pages for platform specific instructions:
</tr>
</table>
-.. important:: The |project| does not yet support WebAssembly and the mobile operating
- systems (Android or iOS).
+.. important:: |project| does not yet support WebAssembly and the mobile operating systems (Android or iOS).
- Most Linux-based embedded OS provide PySide with their official
- package manager (for example, `Raspbian`_ and `ArchlinuxARM`_).
+Most Linux-based embedded OS provide PySide with their official
+package manager (for example, `Raspbian`_ and `ArchlinuxARM`_).
.. _Raspbian: https://www.raspbian.org/
.. _ArchlinuxARM: https://archlinuxarm.org/
diff --git a/sources/pyside6/doc/images/Deployment.svg b/sources/pyside6/doc/images/Deployment.svg
new file mode 100644
index 000000000..cd5a63d2a
--- /dev/null
+++ b/sources/pyside6/doc/images/Deployment.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="38px" height="38px" viewBox="0 0 38 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title>robot</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <linearGradient x1="100%" y1="100%" x2="-22.8515625%" y2="-33.2356771%" id="linearGradient-1">
+ <stop stop-color="#6FFF80" offset="0%"></stop>
+ <stop stop-color="#43CE57" offset="37.2587344%"></stop>
+ <stop stop-color="#425FD0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Mainpage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Mainpage_Layout_V4_Megamenu" transform="translate(-832.000000, -3701.000000)" fill="url(#linearGradient-1)">
+ <g id="Content" transform="translate(-44.000000, 1530.000000)">
+ <g id="Deliver" transform="translate(62.000000, 1032.000000)">
+ <g id="Product" transform="translate(776.000000, 967.000000)">
+ <g id="Auto" transform="translate(37.420728, 172.000000)">
+ <path d="M32.973961,22.1666667 L32.973961,27.2333333 C32.973961,28.9794333 31.5766823,30.4 29.8592069,30.4 L8.67887904,30.4 C6.96140363,30.4 5.56412494,28.9794333 5.56412494,27.2333333 L5.56412494,22.1666667 C5.56412494,21.8170667 5.84258395,21.5333333 6.18707576,21.5333333 C6.53156756,21.5333333 6.81002658,21.8170667 6.81002658,22.1666667 L6.81002658,27.2333333 C6.81002658,28.2808667 7.64851838,29.1333333 8.67887904,29.1333333 L29.8592069,29.1333333 C30.8895676,29.1333333 31.7280594,28.2808667 31.7280594,27.2333333 L31.7280594,22.1666667 C31.7280594,21.8170667 32.0065184,21.5333333 32.3510102,21.5333333 C32.695502,21.5333333 32.973961,21.8170667 32.973961,22.1666667 L32.973961,22.1666667 Z M37.9575676,19.6333333 C37.9575676,20.6808667 37.1190758,21.5333333 36.0887151,21.5333333 C35.2776331,21.5333333 34.5930102,21.0026 34.3351085,20.2666667 L32.3510102,20.2666667 C32.0065184,20.2666667 31.7280594,19.9829333 31.7280594,19.6333333 L31.7280594,13.3 C31.7280594,12.2524667 30.8895676,11.4 29.8592069,11.4 L16.1542889,11.4 C15.8097971,11.4 15.5313381,11.1162667 15.5313381,10.7666667 C15.5313381,10.4170667 15.8097971,10.1333333 16.1542889,10.1333333 L29.8592069,10.1333333 C31.5766823,10.1333333 32.973961,11.5539 32.973961,13.3 L32.973961,19 L34.3351085,19 C34.5930102,18.2640667 35.2776331,17.7333333 36.0887151,17.7333333 C37.1190758,17.7333333 37.9575676,18.5858 37.9575676,19.6333333 L37.9575676,19.6333333 Z M36.7116659,19.6333333 C36.7116659,19.2843667 36.432584,19 36.0887151,19 C35.7448462,19 35.4657643,19.2843667 35.4657643,19.6333333 C35.4657643,19.9823 35.7448462,20.2666667 36.0887151,20.2666667 C36.432584,20.2666667 36.7116659,19.9823 36.7116659,19.6333333 L36.7116659,19.6333333 Z M12.416584,19 C11.3862233,19 10.5477315,18.1475333 10.5477315,17.1 C10.5477315,16.0524667 11.3862233,15.2 12.416584,15.2 C13.4469446,15.2 14.2854364,16.0524667 14.2854364,17.1 C14.2854364,18.1475333 13.4469446,19 12.416584,19 L12.416584,19 Z M13.0395348,17.1 C13.0395348,16.7510333 12.7604528,16.4666667 12.416584,16.4666667 C12.0727151,16.4666667 11.7936331,16.7510333 11.7936331,17.1 C11.7936331,17.4489667 12.0727151,17.7333333 12.416584,17.7333333 C12.7604528,17.7333333 13.0395348,17.4489667 13.0395348,17.1 L13.0395348,17.1 Z M26.121502,19 C25.0911413,19 24.2526495,18.1475333 24.2526495,17.1 C24.2526495,16.0524667 25.0911413,15.2 26.121502,15.2 C27.1518626,15.2 27.9903544,16.0524667 27.9903544,17.1 C27.9903544,18.1475333 27.1518626,19 26.121502,19 L26.121502,19 Z M26.121502,17.7333333 C26.4653708,17.7333333 26.7444528,17.4489667 26.7444528,17.1 C26.7444528,16.7510333 26.4653708,16.4666667 26.121502,16.4666667 C25.7776331,16.4666667 25.4985512,16.7510333 25.4985512,17.1 C25.4985512,17.4489667 25.7776331,17.7333333 26.121502,17.7333333 L26.121502,17.7333333 Z M24.8756003,31.6666667 L13.6624856,31.6666667 C13.3179938,31.6666667 13.0395348,31.9504 13.0395348,32.3 C13.0395348,32.6496 13.3179938,32.9333333 13.6624856,32.9333333 L24.8756003,32.9333333 C25.2200921,32.9333333 25.4985512,32.6496 25.4985512,32.3 C25.4985512,31.9504 25.2200921,31.6666667 24.8756003,31.6666667 L24.8756003,31.6666667 Z M23.6296987,34.2 L14.9083872,34.2 C14.5638954,34.2 14.2854364,34.4837333 14.2854364,34.8333333 C14.2854364,35.1829333 14.5638954,35.4666667 14.9083872,35.4666667 L23.6296987,35.4666667 C23.9741905,35.4666667 24.2526495,35.1829333 24.2526495,34.8333333 C24.2526495,34.4837333 23.9741905,34.2 23.6296987,34.2 L23.6296987,34.2 Z M23.6296987,36.7333333 L14.9083872,36.7333333 C14.5638954,36.7333333 14.2854364,37.0170667 14.2854364,37.3666667 C14.2854364,37.7162667 14.5638954,38 14.9083872,38 L23.6296987,38 C23.9741905,38 24.2526495,37.7162667 24.2526495,37.3666667 C24.2526495,37.0170667 23.9741905,36.7333333 23.6296987,36.7333333 L23.6296987,36.7333333 Z M24.8756003,22.8 C25.2200921,22.8 25.4985512,23.0837333 25.4985512,23.4333333 L25.4985512,25.9666667 C25.4985512,26.3162667 25.2200921,26.6 24.8756003,26.6 L13.6624856,26.6 C13.3179938,26.6 13.0395348,26.3162667 13.0395348,25.9666667 L13.0395348,23.4333333 C13.0395348,23.0837333 13.3179938,22.8 13.6624856,22.8 L24.8756003,22.8 L24.8756003,22.8 Z M18.0231413,25.3333333 L20.5149446,25.3333333 L20.5149446,24.0666667 L18.0231413,24.0666667 L18.0231413,25.3333333 Z M14.2854364,25.3333333 L16.7772397,25.3333333 L16.7772397,24.0666667 L14.2854364,24.0666667 L14.2854364,25.3333333 Z M21.7608462,25.3333333 L24.2526495,25.3333333 L24.2526495,24.0666667 L21.7608462,24.0666667 L21.7608462,25.3333333 Z M4.20235444,20.2666667 C3.94382985,21.0026 3.2592069,21.5333333 2.44812494,21.5333333 C1.41776428,21.5333333 0.579272478,20.6808667 0.579272478,19.6333333 C0.579272478,18.5858 1.41776428,17.7333333 2.44812494,17.7333333 C3.2592069,17.7333333 3.94382985,18.2640667 4.20235444,19 L5.56287904,19 L5.56412494,13.3 C5.56412494,11.5539 6.96140363,10.1333333 8.67887904,10.1333333 L13.0812725,10.1333333 C13.442584,7.41443333 16.0789118,5.39473333 18.6460921,5.10593333 L18.6460921,3.68283333 C17.9228462,3.42063333 17.4001905,2.7246 17.4001905,1.9 C17.4001905,0.852466667 18.2386823,0 19.269043,0 C20.2994036,0 21.1378954,0.852466667 21.1378954,1.9 C21.1378954,2.7246 20.6152397,3.42063333 19.8919938,3.68346667 L19.8919938,5.10783333 C21.7222233,5.3048 23.5057315,6.34093333 24.5610102,7.87106667 C24.7591085,8.15733333 24.690584,8.5519 24.4090102,8.7533 C24.1268135,8.95406667 23.7387151,8.88376667 23.5412397,8.59813333 C22.6061905,7.24343333 20.889961,6.33333333 19.269043,6.33333333 C16.9647479,6.33333333 14.2854364,8.27006667 14.2854364,10.7666667 C14.2854364,11.1162667 14.0069774,11.4 13.6624856,11.4 L8.67887904,11.4 C7.64851838,11.4 6.81002658,12.2524667 6.81002658,13.3 L6.81002658,19.6333333 C6.81002658,19.9829333 6.53156756,20.2666667 6.18707576,20.2666667 L4.20235444,20.2666667 L4.20235444,20.2666667 Z M18.6460921,1.9 C18.6460921,2.24896667 18.9251741,2.53333333 19.269043,2.53333333 C19.6129118,2.53333333 19.8919938,2.24896667 19.8919938,1.9 C19.8919938,1.55103333 19.6129118,1.26666667 19.269043,1.26666667 C18.9251741,1.26666667 18.6460921,1.55103333 18.6460921,1.9 L18.6460921,1.9 Z M3.07107576,19.6333333 C3.07107576,19.2843667 2.79199379,19 2.44812494,19 C2.10425608,19 1.82517412,19.2843667 1.82517412,19.6333333 C1.82517412,19.9823 2.10425608,20.2666667 2.44812494,20.2666667 C2.79199379,20.2666667 3.07107576,19.9823 3.07107576,19.6333333 L3.07107576,19.6333333 Z" id="robot"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/sources/pyside6/doc/images/Desktop.svg b/sources/pyside6/doc/images/Desktop.svg
new file mode 100644
index 000000000..408786a61
--- /dev/null
+++ b/sources/pyside6/doc/images/Desktop.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="38px" height="38px" viewBox="0 0 38 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title>imac copy</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <linearGradient x1="100%" y1="100%" x2="-22.8515625%" y2="-33.2356771%" id="linearGradient-1">
+ <stop stop-color="#6FFF80" offset="0%"></stop>
+ <stop stop-color="#43CE57" offset="37.2587344%"></stop>
+ <stop stop-color="#425FD0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Mainpage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Mainpage_Layout_V4_Megamenu" transform="translate(-150.000000, -3059.000000)" fill="url(#linearGradient-1)">
+ <g id="Content" transform="translate(-44.000000, 1530.000000)">
+ <g id="Deliver" transform="translate(62.000000, 1032.000000)">
+ <g id="Solution" transform="translate(0.907344, 0.000000)">
+ <g id="Auto" transform="translate(130.982155, 497.000000)">
+ <path d="M38.110501,3.16666667 L38.110501,25.9666667 C38.110501,27.5943333 36.571501,29.1333333 34.9438344,29.1333333 L3.2771677,29.1333333 C1.64950103,29.1333333 0.11050103,27.5943333 0.11050103,25.9666667 L0.11050103,22.1666667 C0.11050103,21.8170667 0.394234363,21.5333333 0.743834363,21.5333333 L34.9438344,21.5333333 C35.2934344,21.5333333 35.5771677,21.8170667 35.5771677,22.1666667 C35.5771677,22.5162667 35.2934344,22.8 34.9438344,22.8 L1.3771677,22.8 L1.3771677,25.9666667 C1.3771677,26.8900667 2.3537677,27.8666667 3.2771677,27.8666667 L34.9438344,27.8666667 C35.8672344,27.8666667 36.8438344,26.8900667 36.8438344,25.9666667 L36.8438344,3.16666667 C36.8438344,2.24326667 35.8672344,1.26666667 34.9438344,1.26666667 L3.2771677,1.26666667 C2.3537677,1.26666667 1.3771677,2.24326667 1.3771677,3.16666667 L1.3771677,19.6333333 C1.3771677,19.9829333 1.09343436,20.2666667 0.743834363,20.2666667 C0.394234363,20.2666667 0.11050103,19.9829333 0.11050103,19.6333333 L0.11050103,3.16666667 C0.11050103,1.539 1.64950103,0 3.2771677,0 L34.9438344,0 C36.571501,0 38.110501,1.539 38.110501,3.16666667 L38.110501,3.16666667 Z M17.8438344,25.3333333 C17.8438344,26.0319 18.4119344,26.6 19.110501,26.6 C19.8090677,26.6 20.3771677,26.0319 20.3771677,25.3333333 C20.3771677,24.6347667 19.8090677,24.0666667 19.110501,24.0666667 C18.4119344,24.0666667 17.8438344,24.6347667 17.8438344,25.3333333 L17.8438344,25.3333333 Z M16.5961677,19.6333333 C16.5961677,19.2837333 16.3130677,19 15.9628344,19 L15.956501,19 C15.606901,19 15.3263344,19.2837333 15.3263344,19.6333333 C15.3263344,19.9829333 15.6132344,20.2666667 15.9628344,20.2666667 C16.3130677,20.2666667 16.5961677,19.9829333 16.5961677,19.6333333 L16.5961677,19.6333333 Z M19.129501,19.6333333 C19.129501,19.2837333 18.846401,19 18.4961677,19 L18.4898344,19 C18.1402344,19 17.8596677,19.2837333 17.8596677,19.6333333 C17.8596677,19.9829333 18.1465677,20.2666667 18.4961677,20.2666667 C18.846401,20.2666667 19.129501,19.9829333 19.129501,19.6333333 L19.129501,19.6333333 Z M21.6628344,19.6333333 C21.6628344,19.2837333 21.3797344,19 21.029501,19 L21.0231677,19 C20.6735677,19 20.393001,19.2837333 20.393001,19.6333333 C20.393001,19.9829333 20.679901,20.2666667 21.029501,20.2666667 C21.3797344,20.2666667 21.6628344,19.9829333 21.6628344,19.6333333 L21.6628344,19.6333333 Z M14.0628344,19.6333333 C14.0628344,19.2837333 13.7797344,19 13.429501,19 L13.4231677,19 C13.0735677,19 12.793001,19.2837333 12.793001,19.6333333 C12.793001,19.9829333 13.079901,20.2666667 13.429501,20.2666667 C13.7797344,20.2666667 14.0628344,19.9829333 14.0628344,19.6333333 L14.0628344,19.6333333 Z M11.529501,19.6333333 C11.529501,19.2837333 11.246401,19 10.8961677,19 L10.8898344,19 C10.5402344,19 10.2596677,19.2837333 10.2596677,19.6333333 C10.2596677,19.9829333 10.5465677,20.2666667 10.8961677,20.2666667 C11.246401,20.2666667 11.529501,19.9829333 11.529501,19.6333333 L11.529501,19.6333333 Z M27.9961677,19.6333333 C27.9961677,19.2837333 27.7130677,19 27.3628344,19 L27.356501,19 C27.006901,19 26.7263344,19.2837333 26.7263344,19.6333333 C26.7263344,19.9829333 27.0132344,20.2666667 27.3628344,20.2666667 C27.7130677,20.2666667 27.9961677,19.9829333 27.9961677,19.6333333 L27.9961677,19.6333333 Z M25.4628344,19.6333333 C25.4628344,19.2837333 25.1797344,19 24.829501,19 L24.8231677,19 C24.4735677,19 24.193001,19.2837333 24.193001,19.6333333 C24.193001,19.9829333 24.479901,20.2666667 24.829501,20.2666667 C25.1797344,20.2666667 25.4628344,19.9829333 25.4628344,19.6333333 L25.4628344,19.6333333 Z M26.0771677,36.7333333 L25.4438344,36.7333333 L25.4438344,36.1 C25.4438344,35.7504 25.160101,35.4666667 24.810501,35.4666667 C24.460901,35.4666667 24.1771677,35.7504 24.1771677,36.1 L24.1771677,36.7333333 L22.910501,36.7333333 L22.910501,36.1 C22.910501,35.7504 22.6267677,35.4666667 22.2771677,35.4666667 C21.9275677,35.4666667 21.6438344,35.7504 21.6438344,36.1 L21.6438344,36.7333333 L20.3771677,36.7333333 L20.3771677,36.1 C20.3771677,35.7504 20.0934344,35.4666667 19.7438344,35.4666667 C19.3942344,35.4666667 19.110501,35.7504 19.110501,36.1 L19.110501,36.7333333 L17.8438344,36.7333333 L17.8438344,36.1 C17.8438344,35.7504 17.560101,35.4666667 17.210501,35.4666667 C16.860901,35.4666667 16.5771677,35.7504 16.5771677,36.1 L16.5771677,36.7333333 L15.310501,36.7333333 L15.310501,36.1 C15.310501,35.7504 15.0267677,35.4666667 14.6771677,35.4666667 C14.3275677,35.4666667 14.0438344,35.7504 14.0438344,36.1 L14.0438344,36.7333333 L12.7771677,36.7333333 L12.7771677,36.1 C12.7771677,35.7504 12.4934344,35.4666667 12.1438344,35.4666667 C11.7942344,35.4666667 11.510501,35.7504 11.510501,36.1 L11.510501,36.7333333 L10.2438344,36.7333333 L10.2438344,36.1 C10.2438344,35.7504 9.96010103,35.4666667 9.61050103,35.4666667 C9.26090103,35.4666667 8.9771677,35.7504 8.9771677,36.1 L8.9771677,36.7333333 L7.71050103,36.7333333 L7.71050103,36.1 C7.71050103,35.7504 7.4267677,35.4666667 7.0771677,35.4666667 C6.7275677,35.4666667 6.44383436,35.7504 6.44383436,36.1 L6.44383436,36.7333333 L5.1771677,36.7333333 L5.1771677,36.1 C5.1771677,35.7504 4.89343436,35.4666667 4.54383436,35.4666667 C4.19423436,35.4666667 3.91050103,35.7504 3.91050103,36.1 L3.91050103,36.7333333 L3.2771677,36.7333333 C2.9275677,36.7333333 2.64383436,37.0170667 2.64383436,37.3666667 C2.64383436,37.7162667 2.9275677,38 3.2771677,38 L26.0771677,38 C26.4267677,38 26.710501,37.7162667 26.710501,37.3666667 C26.710501,37.0170667 26.4267677,36.7333333 26.0771677,36.7333333 L26.0771677,36.7333333 Z M16.5771677,33.5666667 L16.5771677,31.0333333 C16.5771677,30.6837333 16.2934344,30.4 15.9438344,30.4 C15.5942344,30.4 15.310501,30.6837333 15.310501,31.0333333 L15.310501,33.5666667 C15.310501,33.9162667 15.5942344,34.2 15.9438344,34.2 C16.2934344,34.2 16.5771677,33.9162667 16.5771677,33.5666667 L16.5771677,33.5666667 Z M22.2771677,34.2 C22.6267677,34.2 22.910501,33.9162667 22.910501,33.5666667 L22.910501,31.0333333 C22.910501,30.6837333 22.6267677,30.4 22.2771677,30.4 C21.9275677,30.4 21.6438344,30.6837333 21.6438344,31.0333333 L21.6438344,33.5666667 C21.6438344,33.9162667 21.9275677,34.2 22.2771677,34.2 L22.2771677,34.2 Z M35.5771677,36.7333333 L35.5771677,37.3666667 C35.5771677,37.7162667 35.2934344,38 34.9438344,38 L29.8771677,38 C29.5275677,38 29.2438344,37.7162667 29.2438344,37.3666667 L29.2438344,36.7333333 C29.2438344,35.3362 30.3800344,34.2 31.7771677,34.2 L33.0438344,34.2 C34.4409677,34.2 35.5771677,35.3362 35.5771677,36.7333333 L35.5771677,36.7333333 Z M34.310501,36.7333333 C34.310501,36.0347667 33.742401,35.4666667 33.0438344,35.4666667 L31.7771677,35.4666667 C31.078601,35.4666667 30.510501,36.0347667 30.510501,36.7333333 L34.310501,36.7333333 L34.310501,36.7333333 Z" id="imac-copy"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/sources/pyside6/doc/images/Dev.svg b/sources/pyside6/doc/images/Dev.svg
new file mode 100644
index 000000000..53e332718
--- /dev/null
+++ b/sources/pyside6/doc/images/Dev.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="37px" height="37px" viewBox="0 0 37 37" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title>book-write</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <linearGradient x1="100%" y1="100%" x2="-22.8515625%" y2="-33.2356771%" id="linearGradient-1">
+ <stop stop-color="#6FFF80" offset="0%"></stop>
+ <stop stop-color="#43CE57" offset="37.2587344%"></stop>
+ <stop stop-color="#425FD0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Mainpage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Mainpage_Layout_V4_Megamenu" transform="translate(-266.000000, -5715.000000)" fill="url(#linearGradient-1)">
+ <g id="Content" transform="translate(-44.000000, 1530.000000)">
+ <g id="Support" transform="translate(277.000000, 4042.000000)">
+ <g id="1" transform="translate(0.774880, 117.000000)">
+ <path d="M65.2327264,56.0069148 C65.5646029,56.0069148 65.8328647,55.7380528 65.8328647,55.4067765 L65.8328647,33.8017978 C65.8328647,33.4705215 65.5646029,33.2016596 65.2327264,33.2016596 C64.9008499,33.2016596 64.6325881,33.4705215 64.6325881,33.8017978 L64.6325881,55.4067765 C64.6325881,55.7380528 64.9008499,56.0069148 65.2327264,56.0069148 L65.2327264,56.0069148 Z M67.0331413,59.0076063 L67.0331413,58.407468 L65.2327264,58.407468 C64.9008499,58.407468 64.6325881,58.138606 64.6325881,57.8073297 C64.6325881,57.4760533 64.9008499,57.2071914 65.2327264,57.2071914 L67.0331413,57.2071914 L67.0331413,32.001383 L65.2327264,32.001383 C64.9008499,32.001383 64.6325881,31.732521 64.6325881,31.4012447 C64.6325881,31.0699683 64.9008499,30.8011064 65.2327264,30.8011064 L66.6622558,30.8011064 L65.2327264,27.9420475 L63.4323115,31.5428773 L63.4323115,59.0076063 C63.4323115,60.000235 64.2400976,60.8080212 65.2327264,60.8080212 C66.2253551,60.8080212 67.0331413,60.000235 67.0331413,59.0076063 L67.0331413,59.0076063 Z M68.2454206,31.4012447 C68.2454206,31.4420541 68.2412197,31.4822633 68.2334179,31.5212723 L68.2334179,59.0076063 C68.2334179,60.6621876 66.8873077,62.0082978 65.2327264,62.0082978 C63.5781451,62.0082978 62.2320349,60.6621876 62.2320349,59.0076063 L62.2320349,31.4012447 C62.2320349,31.3082232 62.2536399,31.2158019 62.2950494,31.1329828 L64.6956026,26.3318765 C64.8996496,25.9249827 65.5658031,25.9249827 65.7698502,26.3318765 L68.1217921,31.0363606 C68.19921,31.137784 68.2454206,31.263813 68.2454206,31.4012447 L68.2454206,31.4012447 Z M50.8294073,44.0041489 L44.8280243,44.0041489 C44.4961478,44.0041489 44.227886,44.2730108 44.227886,44.6042872 C44.227886,44.9355635 44.4961478,45.2044255 44.8280243,45.2044255 L50.8294073,45.2044255 C51.1612838,45.2044255 51.4295456,44.9355635 51.4295456,44.6042872 C51.4295456,44.2730108 51.1612838,44.0041489 50.8294073,44.0041489 L50.8294073,44.0041489 Z M44.8280243,42.8038723 L48.4288541,42.8038723 C48.7607306,42.8038723 49.0289924,42.5350103 49.0289924,42.203734 C49.0289924,41.8724577 48.7607306,41.6035957 48.4288541,41.6035957 L44.8280243,41.6035957 C44.4961478,41.6035957 44.227886,41.8724577 44.227886,42.203734 C44.227886,42.5350103 44.4961478,42.8038723 44.8280243,42.8038723 L44.8280243,42.8038723 Z M41.8273328,47.6049787 L53.8300988,47.6049787 L53.8300988,39.2030425 L41.8273328,39.2030425 L41.8273328,47.6049787 Z M40.6270563,48.205117 L40.6270563,38.6029042 C40.6270563,38.2716279 40.8953181,38.0027659 41.2271946,38.0027659 L54.4302371,38.0027659 C54.7621135,38.0027659 55.0303754,38.2716279 55.0303754,38.6029042 L55.0303754,48.205117 C55.0303754,48.5363933 54.7621135,48.8052552 54.4302371,48.8052552 L41.2271946,48.8052552 C40.8953181,48.8052552 40.6270563,48.5363933 40.6270563,48.205117 L40.6270563,48.205117 Z M33.4253967,31.4534567 L33.4253967,59.0076063 C33.4253967,59.9666273 34.2667906,60.8080212 35.2258116,60.8080212 L58.0310668,60.8080212 C58.9900878,60.8080212 59.8314817,59.9666273 59.8314817,59.0076063 L59.8314817,32.001383 L35.2258116,32.001383 C34.7318978,32.001383 34.0273354,31.8591502 33.4253967,31.4534567 L33.4253967,31.4534567 Z M60.43162,27.2002766 L34.6256733,27.2002766 C33.9637208,27.2002766 33.4253967,27.7386006 33.4253967,28.4005532 L33.4253967,29.0006915 C33.4253967,30.6948819 34.928143,30.7975055 35.2294124,30.8011064 L60.43162,30.8011064 C60.7634965,30.8011064 61.0317583,31.0699683 61.0317583,31.4012447 L61.0317583,59.0076063 C61.0317583,60.6339811 59.6574416,62.0082978 58.0310668,62.0082978 L35.2258116,62.0082978 C33.5994368,62.0082978 32.2251201,60.6339811 32.2251201,59.0076063 L32.2251201,28.4005532 C32.2251201,27.0766481 33.3017682,26 34.6256733,26 L60.43162,26 C60.7634965,26 61.0317583,26.268862 61.0317583,26.6001383 C61.0317583,26.9314146 60.7634965,27.2002766 60.43162,27.2002766 L60.43162,27.2002766 Z M35.2258116,59.6077446 C35.5576881,59.6077446 35.8259499,59.3388826 35.8259499,59.0076063 L35.8259499,33.8017978 C35.8259499,33.4705215 35.5576881,33.2016596 35.2258116,33.2016596 C34.8939351,33.2016596 34.6256733,33.4705215 34.6256733,33.8017978 L34.6256733,59.0076063 C34.6256733,59.3388826 34.8939351,59.6077446 35.2258116,59.6077446 L35.2258116,59.6077446 Z M59.2313434,28.4005532 C59.5632199,28.4005532 59.8314817,28.6694151 59.8314817,29.0006915 C59.8314817,29.3319678 59.5632199,29.6008298 59.2313434,29.6008298 L35.2258116,29.6008298 C34.8939351,29.6008298 34.6256733,29.3319678 34.6256733,29.0006915 C34.6256733,28.6694151 34.8939351,28.4005532 35.2258116,28.4005532 L59.2313434,28.4005532 Z" id="book-write"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/sources/pyside6/doc/images/Examples.svg b/sources/pyside6/doc/images/Examples.svg
new file mode 100644
index 000000000..98116957e
--- /dev/null
+++ b/sources/pyside6/doc/images/Examples.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="49px" height="48px" viewBox="0 0 49 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title>web-development</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <linearGradient x1="100%" y1="100%" x2="-22.8515625%" y2="-33.2356771%" id="linearGradient-1">
+ <stop stop-color="#6FFF80" offset="0%"></stop>
+ <stop stop-color="#43CE57" offset="37.2587344%"></stop>
+ <stop stop-color="#425FD0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Mainpage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Mainpage_Layout_V4_Megamenu" transform="translate(-1084.000000, -1756.000000)" fill="url(#linearGradient-1)">
+ <g id="Content" transform="translate(-44.000000, 1530.000000)">
+ <g id="WhatQtis" transform="translate(194.000000, 0.000000)">
+ <g id="Block3_Hover" transform="translate(726.316067, 114.000000)">
+ <path d="M214.4,115.2 C215.2816,115.2 216,115.9176 216,116.8 C216,117.6824 215.2816,118.4 214.4,118.4 C213.5176,118.4 212.8,117.6824 212.8,116.8 C212.8,115.9176 213.5176,115.2 214.4,115.2 L214.4,115.2 Z M217.6,116.8 C217.6,117.6824 218.3176,118.4 219.2,118.4 C220.0816,118.4 220.8,117.6824 220.8,116.8 C220.8,115.9176 220.0816,115.2 219.2,115.2 C218.3176,115.2 217.6,115.9176 217.6,116.8 L217.6,116.8 Z M222.4,116.8 C222.4,117.6824 223.1176,118.4 224,118.4 C224.8816,118.4 225.6,117.6824 225.6,116.8 C225.6,115.9176 224.8816,115.2 224,115.2 C223.1176,115.2 222.4,115.9176 222.4,116.8 L222.4,116.8 Z M215.2,128 L216.8,128 C217.2424,128 217.6,127.6416 217.6,127.2 C217.6,126.7584 217.2424,126.4 216.8,126.4 L215.2,126.4 C214.7576,126.4 214.4,126.7584 214.4,127.2 C214.4,127.6416 214.7576,128 215.2,128 L215.2,128 Z M215.2,131.2 L216.8,131.2 C217.2424,131.2 217.6,130.8416 217.6,130.4 C217.6,129.9584 217.2424,129.6 216.8,129.6 L215.2,129.6 C214.7576,129.6 214.4,129.9584 214.4,130.4 C214.4,130.8416 214.7576,131.2 215.2,131.2 L215.2,131.2 Z M215.2,134.4 L216.8,134.4 C217.2424,134.4 217.6,134.0416 217.6,133.6 C217.6,133.1584 217.2424,132.8 216.8,132.8 L215.2,132.8 C214.7576,132.8 214.4,133.1584 214.4,133.6 C214.4,134.0416 214.7576,134.4 215.2,134.4 L215.2,134.4 Z M215.2,137.6 L216.8,137.6 C217.2424,137.6 217.6,137.2416 217.6,136.8 C217.6,136.3584 217.2424,136 216.8,136 L215.2,136 C214.7576,136 214.4,136.3584 214.4,136.8 C214.4,137.2416 214.7576,137.6 215.2,137.6 L215.2,137.6 Z M215.2,140.8 L216.8,140.8 C217.2424,140.8 217.6,140.4416 217.6,140 C217.6,139.5584 217.2424,139.2 216.8,139.2 L215.2,139.2 C214.7576,139.2 214.4,139.5584 214.4,140 C214.4,140.4416 214.7576,140.8 215.2,140.8 L215.2,140.8 Z M215.2,144 L216.8,144 C217.2424,144 217.6,143.6416 217.6,143.2 C217.6,142.7584 217.2424,142.4 216.8,142.4 L215.2,142.4 C214.7576,142.4 214.4,142.7584 214.4,143.2 C214.4,143.6416 214.7576,144 215.2,144 L215.2,144 Z M215.2,147.2 L216.8,147.2 C217.2424,147.2 217.6,146.8416 217.6,146.4 C217.6,145.9584 217.2424,145.6 216.8,145.6 L215.2,145.6 C214.7576,145.6 214.4,145.9584 214.4,146.4 C214.4,146.8416 214.7576,147.2 215.2,147.2 L215.2,147.2 Z M215.2,150.4 L216.8,150.4 C217.2424,150.4 217.6,150.0416 217.6,149.6 C217.6,149.1584 217.2424,148.8 216.8,148.8 L215.2,148.8 C214.7576,148.8 214.4,149.1584 214.4,149.6 C214.4,150.0416 214.7576,150.4 215.2,150.4 L215.2,150.4 Z M215.2,153.6 L216.8,153.6 C217.2424,153.6 217.6,153.2416 217.6,152.8 C217.6,152.3584 217.2424,152 216.8,152 L215.2,152 C214.7576,152 214.4,152.3584 214.4,152.8 C214.4,153.2416 214.7576,153.6 215.2,153.6 L215.2,153.6 Z M242.4,128 C242.8424,128 243.2,127.6416 243.2,127.2 C243.2,126.7584 242.8424,126.4 242.4,126.4 L239.2,126.4 C238.7576,126.4 238.4,126.7584 238.4,127.2 C238.4,127.6416 238.7576,128 239.2,128 L242.4,128 L242.4,128 Z M235.2,130.4 C235.2,130.8416 235.5576,131.2 236,131.2 L244,131.2 C244.4424,131.2 244.8,130.8416 244.8,130.4 C244.8,129.9584 244.4424,129.6 244,129.6 L236,129.6 C235.5576,129.6 235.2,129.9584 235.2,130.4 L235.2,130.4 Z M220,131.2 L232.8,131.2 C233.2424,131.2 233.6,130.8416 233.6,130.4 C233.6,129.9584 233.2424,129.6 232.8,129.6 L220,129.6 C219.5576,129.6 219.2,129.9584 219.2,130.4 C219.2,130.8416 219.5576,131.2 220,131.2 L220,131.2 Z M220,128 L228,128 C228.4424,128 228.8,127.6416 228.8,127.2 C228.8,126.7584 228.4424,126.4 228,126.4 L220,126.4 C219.5576,126.4 219.2,126.7584 219.2,127.2 C219.2,127.6416 219.5576,128 220,128 L220,128 Z M236,126.4 L231.2,126.4 C230.7576,126.4 230.4,126.7584 230.4,127.2 C230.4,127.6416 230.7576,128 231.2,128 L236,128 C236.4424,128 236.8,127.6416 236.8,127.2 C236.8,126.7584 236.4424,126.4 236,126.4 L236,126.4 Z M248,133.6 C248,133.1584 247.6424,132.8 247.2,132.8 L234.4,132.8 C233.9576,132.8 233.6,133.1584 233.6,133.6 C233.6,134.0416 233.9576,134.4 234.4,134.4 L247.2,134.4 C247.6424,134.4 248,134.0416 248,133.6 L248,133.6 Z M242.4,137.6 C242.8424,137.6 243.2,137.2416 243.2,136.8 C243.2,136.3584 242.8424,136 242.4,136 L236,136 C235.5576,136 235.2,136.3584 235.2,136.8 C235.2,137.2416 235.5576,137.6 236,137.6 L242.4,137.6 L242.4,137.6 Z M220,137.6 L232.8,137.6 C233.2424,137.6 233.6,137.2416 233.6,136.8 C233.6,136.3584 233.2424,136 232.8,136 L220,136 C219.5576,136 219.2,136.3584 219.2,136.8 C219.2,137.2416 219.5576,137.6 220,137.6 L220,137.6 Z M220,134.4 L223.2,134.4 C223.6424,134.4 224,134.0416 224,133.6 C224,133.1584 223.6424,132.8 223.2,132.8 L220,132.8 C219.5576,132.8 219.2,133.1584 219.2,133.6 C219.2,134.0416 219.5576,134.4 220,134.4 L220,134.4 Z M226.4,132.8 C225.9576,132.8 225.6,133.1584 225.6,133.6 C225.6,134.0416 225.9576,134.4 226.4,134.4 L231.2,134.4 C231.6424,134.4 232,134.0416 232,133.6 C232,133.1584 231.6424,132.8 231.2,132.8 L226.4,132.8 L226.4,132.8 Z M237.6,146.4 C237.6,145.9584 237.2424,145.6 236.8,145.6 L234.4,145.6 C233.9576,145.6 233.6,145.9584 233.6,146.4 C233.6,146.8416 233.9576,147.2 234.4,147.2 L236.8,147.2 C237.2424,147.2 237.6,146.8416 237.6,146.4 L237.6,146.4 Z M220,147.2 L223.2,147.2 C223.6424,147.2 224,146.8416 224,146.4 C224,145.9584 223.6424,145.6 223.2,145.6 L220,145.6 C219.5576,145.6 219.2,145.9584 219.2,146.4 C219.2,146.8416 219.5576,147.2 220,147.2 L220,147.2 Z M231.2,145.6 L226.4,145.6 C225.9576,145.6 225.6,145.9584 225.6,146.4 C225.6,146.8416 225.9576,147.2 226.4,147.2 L231.2,147.2 C231.6424,147.2 232,146.8416 232,146.4 C232,145.9584 231.6424,145.6 231.2,145.6 L231.2,145.6 Z M220,150.4 L229.6,150.4 C230.0424,150.4 230.4,150.0416 230.4,149.6 C230.4,149.1584 230.0424,148.8 229.6,148.8 L220,148.8 C219.5576,148.8 219.2,149.1584 219.2,149.6 C219.2,150.0416 219.5576,150.4 220,150.4 L220,150.4 Z M232.8,150.4 L234.4,150.4 C234.8424,150.4 235.2,150.0416 235.2,149.6 C235.2,149.1584 234.8424,148.8 234.4,148.8 L232.8,148.8 C232.3576,148.8 232,149.1584 232,149.6 C232,150.0416 232.3576,150.4 232.8,150.4 L232.8,150.4 Z M220,153.6 L224.8,153.6 C225.2424,153.6 225.6,153.2416 225.6,152.8 C225.6,152.3584 225.2424,152 224.8,152 L220,152 C219.5576,152 219.2,152.3584 219.2,152.8 C219.2,153.2416 219.5576,153.6 220,153.6 L220,153.6 Z M227.2,152.8 C227.2,153.2416 227.5576,153.6 228,153.6 L236,153.6 C236.4424,153.6 236.8,153.2416 236.8,152.8 C236.8,152.3584 236.4424,152 236,152 L228,152 C227.5576,152 227.2,152.3584 227.2,152.8 L227.2,152.8 Z M244.8,140 C244.8,139.5584 244.4424,139.2 244,139.2 L231.2,139.2 C230.7576,139.2 230.4,139.5584 230.4,140 C230.4,140.4416 230.7576,140.8 231.2,140.8 L244,140.8 C244.4424,140.8 244.8,140.4416 244.8,140 L244.8,140 Z M239.2,143.2 C239.2,142.7584 238.8424,142.4 238.4,142.4 L232.8,142.4 C232.3576,142.4 232,142.7584 232,143.2 C232,143.6416 232.3576,144 232.8,144 L238.4,144 C238.8424,144 239.2,143.6416 239.2,143.2 L239.2,143.2 Z M220,144 L229.6,144 C230.0424,144 230.4,143.6416 230.4,143.2 C230.4,142.7584 230.0424,142.4 229.6,142.4 L220,142.4 C219.5576,142.4 219.2,142.7584 219.2,143.2 C219.2,143.6416 219.5576,144 220,144 L220,144 Z M220,140.8 L228,140.8 C228.4424,140.8 228.8,140.4416 228.8,140 C228.8,139.5584 228.4424,139.2 228,139.2 L220,139.2 C219.5576,139.2 219.2,139.5584 219.2,140 C219.2,140.4416 219.5576,140.8 220,140.8 L220,140.8 Z M256,149.6 L256,152.8 C256,153.2416 255.6424,153.6 255.2,153.6 L253.9816,153.6 C253.8976,153.8384 253.8008,154.072 253.692,154.3 L254.5528,155.1608 C254.8656,155.4736 254.8656,155.98 254.5528,156.292 L252.2904,158.5544 C252.1408,158.7048 251.9376,158.7888 251.7248,158.7888 C251.5128,158.7888 251.3096,158.7048 251.1592,158.5544 L250.2976,157.6928 C250.0704,157.8008 249.8376,157.8976 249.5992,157.9816 L249.5992,159.2 C249.5992,159.6416 249.2416,160 248.7992,160 L245.5992,160 C245.1568,160 244.7992,159.6416 244.7992,159.2 L244.7992,157.9816 C244.5616,157.8976 244.3288,157.8008 244.1008,157.692 L243.24,158.5528 C242.94,158.8528 242.4088,158.8528 242.1088,158.5528 L239.8464,156.2904 C239.5336,155.9784 239.5336,155.472 239.8464,155.1592 L240.7072,154.2984 C240.5992,154.0704 240.5024,153.8376 240.4184,153.6 L239.2,153.6 C238.7576,153.6 238.4,153.2416 238.4,152.8 L238.4,149.6 C238.4,149.1584 238.7576,148.8 239.2,148.8 L240.4184,148.8 C240.5024,148.5616 240.5992,148.328 240.708,148.1 L239.8472,147.2392 C239.5344,146.9264 239.5344,146.42 239.8472,146.108 L242.1088,143.8456 C242.4088,143.5456 242.94,143.5456 243.24,143.8456 L244.1016,144.7072 C244.3288,144.5984 244.5624,144.5016 244.8008,144.4176 L244.8008,143.2 C244.8008,142.7584 245.1584,142.4 245.6008,142.4 L248.8,142.4 C249.2424,142.4 249.6,142.7584 249.6,143.2 L249.6,144.4176 C249.8384,144.5016 250.072,144.5984 250.2984,144.7064 L251.16,143.8456 C251.4728,143.5344 251.9792,143.5336 252.2912,143.8464 L254.5536,146.1088 C254.8664,146.4208 254.8664,146.9272 254.5536,147.24 L253.6928,148.1008 C253.8016,148.3288 253.8976,148.5624 253.9816,148.8 L255.2,148.8 C255.6424,148.8 256,149.1584 256,149.6 L256,149.6 Z M254.4,150.4 L253.3896,150.4 C253.0248,150.4 252.7064,150.1528 252.6152,149.7992 C252.4848,149.2928 252.2848,148.8088 252.0192,148.3608 C251.8344,148.0464 251.8848,147.6464 252.1432,147.388 L252.8568,146.6744 L251.7256,145.5432 L251.012,146.2568 C250.7528,146.5144 250.352,146.5648 250.0392,146.3792 C249.5928,146.116 249.1088,145.916 248.6,145.784 C248.2472,145.6928 248,145.3744 248,145.0096 L248,144 L246.4008,144 L246.4008,145.0096 C246.4008,145.3744 246.1536,145.6928 245.8008,145.784 C245.292,145.916 244.8072,146.116 244.36,146.38 C244.0472,146.5656 243.6472,146.5152 243.388,146.256 L242.6744,145.5424 L241.544,146.6736 L242.2568,147.3872 C242.5152,147.6456 242.5656,148.0456 242.3808,148.36 C242.1152,148.8072 241.9152,149.292 241.7848,149.7992 C241.6936,150.1528 241.3752,150.4 241.0104,150.4 L240,150.4 L240,152 L241.0104,152 C241.3752,152 241.6936,152.2472 241.7848,152.6 C241.9152,153.1064 242.1152,153.5904 242.3808,154.0384 C242.5656,154.3528 242.5152,154.7528 242.2568,155.0112 L241.5432,155.7248 L242.6744,156.856 L243.388,156.1424 C243.6472,155.884 244.048,155.8336 244.3608,156.0192 C244.8112,156.2848 245.2944,156.4848 245.7976,156.6144 C246.152,156.7048 246.3992,157.024 246.3992,157.3888 L246.3992,158.4 L247.9992,158.4 L247.9992,157.3896 C247.9992,157.0248 248.2464,156.7056 248.6,156.6152 C249.1064,156.4848 249.5904,156.284 250.0384,156.02 C250.352,155.8344 250.7536,155.8848 251.0112,156.1432 L251.7248,156.8576 L252.856,155.7264 L252.1424,155.0128 C251.8832,154.7544 251.8336,154.3536 252.0192,154.0392 C252.2848,153.5912 252.4848,153.1072 252.6152,152.6008 C252.7064,152.2472 253.0248,152 253.3896,152 L254.4,152 L254.4,150.4 L254.4,150.4 Z M249.6,151.2 C249.6,152.5232 248.5232,153.6 247.2,153.6 C245.8768,153.6 244.8,152.5232 244.8,151.2 C244.8,149.8768 245.8768,148.8 247.2,148.8 C248.5232,148.8 249.6,149.8768 249.6,151.2 L249.6,151.2 Z M248,151.2 C248,150.7592 247.6416,150.4 247.2,150.4 C246.7584,150.4 246.4,150.7592 246.4,151.2 C246.4,151.6408 246.7584,152 247.2,152 C247.6416,152 248,151.6408 248,151.2 L248,151.2 Z M239.2,158.4 L212,158.4 C210.6768,158.4 209.6,157.3232 209.6,156 L209.6,124 C209.6,123.5584 209.2424,123.2 208.8,123.2 C208.3576,123.2 208,123.5584 208,124 L208,156 C208,158.2056 209.7944,160 212,160 L239.2,160 C239.6424,160 240,159.6416 240,159.2 C240,158.7584 239.6424,158.4 239.2,158.4 L239.2,158.4 Z M252,112 L212,112 C209.7944,112 208,113.7944 208,116 L208,120.8 C208,121.2416 208.3576,121.6 208.8,121.6 L252,121.6 C252.4424,121.6 252.8,121.2416 252.8,120.8 C252.8,120.3584 252.4424,120 252,120 L209.6,120 L209.6,116 C209.6,114.6768 210.6768,113.6 212,113.6 L252,113.6 C253.3232,113.6 254.4,114.6768 254.4,116 L254.4,143.2 C254.4,143.6416 254.7576,144 255.2,144 C255.6424,144 256,143.6416 256,143.2 L256,116 C256,113.7944 254.2056,112 252,112 L252,112 Z" id="web-development"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/sources/pyside6/doc/images/Support.svg b/sources/pyside6/doc/images/Support.svg
new file mode 100644
index 000000000..98b93d95c
--- /dev/null
+++ b/sources/pyside6/doc/images/Support.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="38px" height="38px" viewBox="0 0 38 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title>website-fix</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <linearGradient x1="100%" y1="100%" x2="-22.8515625%" y2="-33.2356771%" id="linearGradient-1">
+ <stop stop-color="#6FFF80" offset="0%"></stop>
+ <stop stop-color="#43CE57" offset="37.2587344%"></stop>
+ <stop stop-color="#425FD0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Mainpage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Mainpage_Layout_V4_Megamenu" transform="translate(-794.000000, -5715.000000)" fill="url(#linearGradient-1)">
+ <g id="Content" transform="translate(-44.000000, 1530.000000)">
+ <g id="Support" transform="translate(277.000000, 4042.000000)">
+ <g id="1" transform="translate(560.490048, 136.000000)">
+ <path d="M19.509952,37.4 C20.2085186,37.4 20.7766186,36.8319 20.7766186,36.1333333 C20.7766186,35.4347667 20.2085186,34.8666667 19.509952,34.8666667 C18.8113853,34.8666667 18.2432853,35.4347667 18.2432853,36.1333333 C18.2432853,36.8319 18.8113853,37.4 19.509952,37.4 L19.509952,37.4 Z M19.509952,38.6666667 C18.1128186,38.6666667 16.9766186,37.5304667 16.9766186,36.1333333 C16.9766186,34.7362 18.1128186,33.6 19.509952,33.6 C20.9070853,33.6 22.0432853,34.7362 22.0432853,36.1333333 C22.0432853,37.5304667 20.9070853,38.6666667 19.509952,38.6666667 L19.509952,38.6666667 Z M19.509952,41.2 C22.3035853,41.2 24.5766186,38.9269667 24.5766186,36.1333333 C24.5766186,33.3397 22.3035853,31.0666667 19.509952,31.0666667 C16.7163186,31.0666667 14.4432853,33.3397 14.4432853,36.1333333 C14.4432853,38.9269667 16.7163186,41.2 19.509952,41.2 L19.509952,41.2 Z M19.509952,42.4666667 C16.017752,42.4666667 13.1766186,39.6255333 13.1766186,36.1333333 C13.1766186,32.6411333 16.017752,29.8 19.509952,29.8 C23.002152,29.8 25.8432853,32.6411333 25.8432853,36.1333333 C25.8432853,39.6255333 23.002152,42.4666667 19.509952,42.4666667 L19.509952,42.4666667 Z M35.3432853,7 L3.67661862,7 C1.93051862,7 0.509951956,8.42056667 0.509951956,10.1666667 L0.509951956,13.9666667 C0.509951956,14.3162667 0.793685289,14.6 1.14328529,14.6 L35.3432853,14.6 C35.6928853,14.6 35.9766186,14.3162667 35.9766186,13.9666667 C35.9766186,13.6170667 35.6928853,13.3333333 35.3432853,13.3333333 L1.77661862,13.3333333 L1.77661862,10.1666667 C1.77661862,9.11913333 2.62908529,8.26666667 3.67661862,8.26666667 L35.3432853,8.26666667 C36.3908186,8.26666667 37.2432853,9.11913333 37.2432853,10.1666667 L37.2432853,41.8333333 C37.2432853,42.9163333 36.4262853,43.7333333 35.3432853,43.7333333 L30.5932853,43.7333333 L29.1796853,41.8479 C29.766152,41.0594 30.184152,40.1296667 30.4248186,39.3715667 C31.303252,39.1828333 32.1158186,39.0086667 32.304552,38.9700333 C33.0183186,38.8231 33.4439186,38.236 33.4439186,37.3993667 C33.4432853,36.9243667 33.4432853,35.3283667 33.4439186,34.8654 C33.442652,34.0357333 33.018952,33.4492667 32.310252,33.2966333 L30.429252,32.8938333 C30.203152,32.1306667 29.8985186,31.396 29.521052,30.6999667 C30.0080853,29.9469333 30.457752,29.2521667 30.5635186,29.0919333 C30.9637853,28.4833 30.8497853,27.7676333 30.258252,27.1761 L28.466552,25.3844 C27.8788186,24.7979333 27.165052,24.6826667 26.5545186,25.0766 L24.9414186,26.1209667 C24.2453853,25.7435 23.5100853,25.4388667 22.7469186,25.2134 C22.5588186,24.3375 22.3859186,23.5274667 22.346652,23.3387333 C22.200352,22.6256 21.6126186,22.2 20.7766186,22.2 L18.2432853,22.2 C17.4129853,22.2 16.8265186,22.6237 16.6738853,23.3336667 L16.2710853,25.2140333 C15.5079186,25.4401333 14.7726186,25.7441333 14.0765853,26.1222333 C13.3241853,25.6358333 12.6294186,25.1861667 12.468552,25.0797667 C11.8611853,24.6807667 11.1448853,24.7941333 10.553352,25.3856667 L8.76165196,27.1767333 C8.17518529,27.7632 8.05991862,28.4776 8.45385196,29.0881333 L9.49821862,30.7012333 C9.12011862,31.3966333 8.81611862,32.1325667 8.59001862,32.8957333 C7.71411862,33.0838333 6.90345196,33.2573667 6.71471862,33.2966333 C6.00221862,33.4442 5.57661862,34.0313 5.57661862,34.8673 L5.57661862,37.4 C5.57661862,38.2296667 6.00031862,38.8161333 6.71028529,38.9694 L8.59508529,39.3728333 C8.93328529,40.4444333 9.53051862,41.5439 10.1727186,42.2570333 C10.4064186,42.5173333 10.8066853,42.5376 11.0669853,42.3039 C11.3272853,42.0702 11.3481853,41.6699333 11.113852,41.4096333 C10.4406186,40.6610333 9.92445196,39.4963333 9.71165196,38.6742667 C9.65148529,38.4424667 9.46528529,38.2638667 9.23095196,38.2138333 L6.97628529,37.7306 C6.93005196,37.7204667 6.84328529,37.7021 6.84328529,37.4 L6.84328529,34.8666667 C6.84328529,34.5633 6.93638529,34.5436667 6.97058529,34.5367 C7.18655196,34.4923667 8.21635196,34.2719667 9.23095196,34.0534667 C9.46528529,34.0034333 9.65148529,33.8248333 9.71101862,33.5930333 C9.94725196,32.6791333 10.308252,31.8070333 10.7838853,31.0008 C10.9054853,30.7943333 10.9004186,30.5372 10.769952,30.3358 L9.51785196,28.4003333 C9.49188529,28.3604333 9.44375196,28.2857 9.65718529,28.0722667 L11.4488853,26.2805667 C11.6623186,26.0671333 11.7421186,26.1184333 11.7725186,26.1380667 C11.9561853,26.2590333 12.8403186,26.8309333 13.711152,27.3939667 C13.912552,27.5238 14.170952,27.5301333 14.3767853,27.4079 C15.1830186,26.9322667 16.0551186,26.5712667 16.9683853,26.3350333 C17.2008186,26.2748667 17.3787853,26.0886667 17.429452,25.8543333 L17.9126853,23.5990333 C17.9228186,23.5528 17.9411853,23.4666667 18.2432853,23.4666667 L20.7766186,23.4666667 C21.0799853,23.4666667 21.0989853,23.5591333 21.1065853,23.5939667 C21.1502853,23.8099333 21.3713186,24.8397333 21.5891853,25.8543333 C21.6392186,26.0886667 21.8178186,26.2748667 22.0496186,26.3344 C22.9635186,26.5706333 23.8356186,26.9316333 24.641852,27.4066333 C24.8483186,27.5288667 25.1060853,27.5231667 25.3074853,27.3927 L27.2416853,26.1406 C27.2815853,26.1152667 27.3575853,26.0658667 27.5710186,26.2799333 L29.363352,28.0716333 C29.5774186,28.2863333 29.524852,28.3655 29.5052186,28.3959 C29.384252,28.5795667 28.812352,29.4637 28.2486853,30.3345333 C28.118852,30.5359333 28.113152,30.7930667 28.2353853,31.0001667 C28.7110186,31.8057667 29.0720186,32.6778667 29.308252,33.5911333 C29.3684186,33.8235667 29.5539853,34.0015333 29.7883186,34.0522 L32.0436186,34.5354333 C32.089852,34.5455667 32.1766186,34.5639333 32.177252,34.8654 C32.1766186,35.3271 32.1766186,36.9256333 32.177252,37.4 C32.177252,37.7027333 32.084152,37.7223667 32.0486853,37.7293333 C31.833352,37.7736667 30.803552,37.9947 29.788952,38.2125667 C29.5546186,38.2626 29.3684186,38.4412 29.3088853,38.673 C29.0523853,39.6635333 28.500752,40.7389333 27.9028853,41.4128 C27.7033853,41.6382667 27.689452,41.9726667 27.869952,42.2133333 L29.769952,44.7466667 C29.889652,44.9062667 30.0771186,45 30.2766186,45 L35.3432853,45 C37.119152,45 38.509952,43.6092 38.509952,41.8333333 L38.509952,10.1666667 C38.509952,8.42056667 37.0893853,7 35.3432853,7 L35.3432853,7 Z M23.9432853,18.4 C24.2928853,18.4 24.5766186,18.1162667 24.5766186,17.7666667 C24.5766186,17.4170667 24.2928853,17.1333333 23.9432853,17.1333333 L21.409952,17.1333333 C21.060352,17.1333333 20.7766186,17.4170667 20.7766186,17.7666667 C20.7766186,18.1162667 21.060352,18.4 21.409952,18.4 L23.9432853,18.4 Z M34.0766186,18.4 C34.4262186,18.4 34.709952,18.1162667 34.709952,17.7666667 C34.709952,17.4170667 34.4262186,17.1333333 34.0766186,17.1333333 L31.5432853,17.1333333 C31.1936853,17.1333333 30.909952,17.4170667 30.909952,17.7666667 C30.909952,18.1162667 31.1936853,18.4 31.5432853,18.4 L34.0766186,18.4 Z M29.009952,18.4 C29.359552,18.4 29.6432853,18.1162667 29.6432853,17.7666667 C29.6432853,17.4170667 29.359552,17.1333333 29.009952,17.1333333 L26.4766186,17.1333333 C26.1270186,17.1333333 25.8432853,17.4170667 25.8432853,17.7666667 C25.8432853,18.1162667 26.1270186,18.4 26.4766186,18.4 L29.009952,18.4 Z M10.009952,18.4 C10.359552,18.4 10.6432853,18.1162667 10.6432853,17.7666667 C10.6432853,17.4170667 10.359552,17.1333333 10.009952,17.1333333 L4.94328529,17.1333333 C4.59368529,17.1333333 4.30995196,17.4170667 4.30995196,17.7666667 C4.30995196,18.1162667 4.59368529,18.4 4.94328529,18.4 L10.009952,18.4 Z M11.909952,10.8 C11.909952,11.4985667 12.478052,12.0666667 13.1766186,12.0666667 C13.8751853,12.0666667 14.4432853,11.4985667 14.4432853,10.8 C14.4432853,10.1014333 13.8751853,9.53333333 13.1766186,9.53333333 C12.478052,9.53333333 11.909952,10.1014333 11.909952,10.8 L11.909952,10.8 Z M8.10995196,10.8 C8.10995196,11.4985667 8.67805196,12.0666667 9.37661862,12.0666667 C10.0751853,12.0666667 10.6432853,11.4985667 10.6432853,10.8 C10.6432853,10.1014333 10.0751853,9.53333333 9.37661862,9.53333333 C8.67805196,9.53333333 8.10995196,10.1014333 8.10995196,10.8 L8.10995196,10.8 Z M4.30995196,10.8 C4.30995196,11.4985667 4.87805196,12.0666667 5.57661862,12.0666667 C6.27518529,12.0666667 6.84328529,11.4985667 6.84328529,10.8 C6.84328529,10.1014333 6.27518529,9.53333333 5.57661862,9.53333333 C4.87805196,9.53333333 4.30995196,10.1014333 4.30995196,10.8 L4.30995196,10.8 Z M27.7432853,44.3666667 C27.7432853,44.7162667 27.459552,45 27.109952,45 L3.67661862,45 C1.90075196,45 0.509951956,43.6092 0.509951956,41.8333333 L0.509951956,16.5 C0.509951956,16.1504 0.793685289,15.8666667 1.14328529,15.8666667 C1.49288529,15.8666667 1.77661862,16.1504 1.77661862,16.5 L1.77661862,41.8333333 C1.77661862,42.9163333 2.59361862,43.7333333 3.67661862,43.7333333 L27.109952,43.7333333 C27.459552,43.7333333 27.7432853,44.0170667 27.7432853,44.3666667 L27.7432853,44.3666667 Z" id="website-fix"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/sources/pyside6/doc/images/Training.svg b/sources/pyside6/doc/images/Training.svg
new file mode 100644
index 000000000..96ecf71ec
--- /dev/null
+++ b/sources/pyside6/doc/images/Training.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="38px" height="38px" viewBox="0 0 38 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title>presentation-man</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <linearGradient x1="100%" y1="100%" x2="-22.8515625%" y2="-33.2356771%" id="linearGradient-1">
+ <stop stop-color="#6FFF80" offset="0%"></stop>
+ <stop stop-color="#43CE57" offset="37.2587344%"></stop>
+ <stop stop-color="#425FD0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Mainpage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Mainpage_Layout_V4_Megamenu" transform="translate(-264.000000, -5885.000000)" fill="url(#linearGradient-1)">
+ <g id="Content" transform="translate(-44.000000, 1530.000000)">
+ <g id="Support" transform="translate(277.000000, 4042.000000)">
+ <g id="1" transform="translate(30.774880, 308.000000)">
+ <path d="M38.2251201,6.9 L38.2251201,9.43333333 C38.2251201,9.78293333 37.9413868,10.0666667 37.5917868,10.0666667 L36.9584534,10.0666667 L36.9584534,24.6333333 C36.9584534,24.9829333 36.6747201,25.2666667 36.3251201,25.2666667 C35.9755201,25.2666667 35.6917868,24.9829333 35.6917868,24.6333333 L35.6917868,9.43333333 C35.6917868,9.08373333 35.9755201,8.8 36.3251201,8.8 L36.9584534,8.8 L36.9584534,7.53333333 L1.49178678,7.53333333 L1.49178678,8.8 L33.7917868,8.8 C34.1413868,8.8 34.4251201,9.08373333 34.4251201,9.43333333 C34.4251201,9.78293333 34.1413868,10.0666667 33.7917868,10.0666667 L0.858453443,10.0666667 C0.508853443,10.0666667 0.22512011,9.78293333 0.22512011,9.43333333 L0.22512011,6.9 C0.22512011,6.5504 0.508853443,6.26666667 0.858453443,6.26666667 L18.5917868,6.26666667 L18.5917868,5.63333333 C18.5917868,5.28373333 18.8755201,5 19.2251201,5 C19.5747201,5 19.8584534,5.28373333 19.8584534,5.63333333 L19.8584534,6.26666667 L37.5917868,6.26666667 C37.9413868,6.26666667 38.2251201,6.5504 38.2251201,6.9 L38.2251201,6.9 Z M8.45845344,15.1333333 L13.5251201,15.1333333 C13.8747201,15.1333333 14.1584534,14.8496 14.1584534,14.5 C14.1584534,14.1504 13.8747201,13.8666667 13.5251201,13.8666667 L8.45845344,13.8666667 C8.10885344,13.8666667 7.82512011,14.1504 7.82512011,14.5 C7.82512011,14.8496 8.10885344,15.1333333 8.45845344,15.1333333 L8.45845344,15.1333333 Z M8.45845344,18.9333333 L19.8584534,18.9333333 C20.2080534,18.9333333 20.4917868,18.6496 20.4917868,18.3 C20.4917868,17.9504 20.2080534,17.6666667 19.8584534,17.6666667 L8.45845344,17.6666667 C8.10885344,17.6666667 7.82512011,17.9504 7.82512011,18.3 C7.82512011,18.6496 8.10885344,18.9333333 8.45845344,18.9333333 L8.45845344,18.9333333 Z M18.5917868,15.1333333 C18.9413868,15.1333333 19.2251201,14.8496 19.2251201,14.5 C19.2251201,14.1504 18.9413868,13.8666667 18.5917868,13.8666667 L16.0584534,13.8666667 C15.7088534,13.8666667 15.4251201,14.1504 15.4251201,14.5 C15.4251201,14.8496 15.7088534,15.1333333 16.0584534,15.1333333 L18.5917868,15.1333333 L18.5917868,15.1333333 Z M8.45845344,22.7333333 L10.3584534,22.7333333 C10.7080534,22.7333333 10.9917868,22.4496 10.9917868,22.1 C10.9917868,21.7504 10.7080534,21.4666667 10.3584534,21.4666667 L8.45845344,21.4666667 C8.10885344,21.4666667 7.82512011,21.7504 7.82512011,22.1 C7.82512011,22.4496 8.10885344,22.7333333 8.45845344,22.7333333 L8.45845344,22.7333333 Z M19.8584534,21.4666667 L13.5251201,21.4666667 C13.1755201,21.4666667 12.8917868,21.7504 12.8917868,22.1 C12.8917868,22.4496 13.1755201,22.7333333 13.5251201,22.7333333 L19.8584534,22.7333333 C20.2080534,22.7333333 20.4917868,22.4496 20.4917868,22.1 C20.4917868,21.7504 20.2080534,21.4666667 19.8584534,21.4666667 L19.8584534,21.4666667 Z M31.2996201,25.2749 C30.9690201,25.2742667 30.6757868,25.4953 30.6308201,25.8221 L28.7308201,39.7478333 C28.6839534,40.0942667 28.9258868,40.4134667 29.2729534,40.4609667 C29.3020868,40.4647667 29.3305868,40.4666667 29.3597201,40.4666667 C29.6713201,40.4666667 29.9423868,40.2367667 29.9860868,39.9188333 L31.8107201,26.5472667 C33.9976201,26.6023667 35.4935534,27.0178333 36.2611534,27.7841667 C36.7304534,28.2522 36.9584534,28.8792 36.9584534,29.7 L36.9584534,39.8333333 C36.9584534,40.1829333 37.2421868,40.4666667 37.5917868,40.4666667 C37.9413868,40.4666667 38.2251201,40.1829333 38.2251201,39.8333333 L38.2251201,29.7 C38.2251201,28.5416333 37.8653868,27.5954333 37.1560534,26.888 C36.0692534,25.8024667 34.1534201,25.2749 31.2996201,25.2749 L31.2996201,25.2749 Z M25.5527534,25.8145 L27.4527534,39.7478333 C27.4996201,40.0942667 27.2570534,40.4134667 26.9106201,40.4609667 C26.5654534,40.5097333 26.2443534,40.2659 26.1974868,39.9188333 L24.3722201,26.5333333 L14.1584534,26.5333333 L14.1584534,29.0666667 L21.1251201,29.0666667 C21.4506534,29.0666667 21.7229868,29.3130333 21.7552868,29.6366667 L23.0219534,42.3033333 C23.0567868,42.6516667 22.8028201,42.962 22.4551201,42.9968333 C22.4335868,42.9987333 22.4120534,43 22.3911534,43 C22.0694201,43 21.7945534,42.7561667 21.7616201,42.43 L20.5519534,30.3333333 L12.2584534,30.3333333 C9.30648678,30.3333333 7.82512011,27.4909333 7.82512011,25.9 C7.82512011,25.5504 8.10885344,25.2666667 8.45845344,25.2666667 L24.9251201,25.2666667 C25.2417868,25.2666667 25.5096868,25.501 25.5527534,25.8145 L25.5527534,25.8145 Z M12.8917868,26.5333333 L9.20135344,26.5333333 C9.51105344,27.5688333 10.4863868,29.0666667 12.2584534,29.0666667 L12.8917868,29.0666667 L12.8917868,26.5333333 L12.8917868,26.5333333 Z M29.3584534,26.5333333 C29.3584534,25.8347667 28.7903534,25.2666667 28.0917868,25.2666667 C27.3932201,25.2666667 26.8251201,25.8347667 26.8251201,26.5333333 C26.8251201,27.0001 27.0816201,27.4041667 27.4584534,27.6239333 L27.4584534,32.2333333 C27.4584534,32.5829333 27.7421868,32.8666667 28.0917868,32.8666667 C28.4413868,32.8666667 28.7251201,32.5829333 28.7251201,32.2333333 L28.7251201,27.6239333 C29.1019534,27.4041667 29.3584534,27.0001 29.3584534,26.5333333 L29.3584534,26.5333333 Z M33.1584534,15.1333333 L33.1584534,15.3037 C33.5365534,15.5228333 33.7917868,15.9319667 33.7917868,16.4 L33.7917868,17.6666667 C33.7917868,18.1442 33.5257868,18.5615667 33.1337534,18.7769 C33.0134201,19.9941667 32.4839534,21.0657667 32.4586201,21.1164333 C31.8841868,22.2646667 31.0165201,24 28.0917868,24 C25.1670534,24 24.2993868,22.2646667 23.7255868,21.1164333 C23.6996201,21.0657667 23.1701534,19.9941667 23.0498201,18.7769 C22.6577868,18.5615667 22.3917868,18.1442 22.3917868,17.6666667 L22.3917868,16.4 C22.3917868,15.9319667 22.6470201,15.5228333 23.0251201,15.3037 L23.0251201,15.1333333 C23.0251201,13.0376333 24.7294201,11.3333333 26.8251201,11.3333333 L29.3584534,11.3333333 C31.4541534,11.3333333 33.1584534,13.0376333 33.1584534,15.1333333 L33.1584534,15.1333333 Z M32.5251201,16.4 C32.1755201,16.4 31.8917868,16.1162667 31.8917868,15.7666667 L31.8917868,15.1333333 C31.8917868,13.7362 30.7555868,12.6 29.3584534,12.6 L26.8251201,12.6 C25.4279868,12.6 24.2917868,13.7362 24.2917868,15.1333333 L24.2917868,15.7666667 C24.2917868,16.1162667 24.0080534,16.4 23.6584534,16.4 L23.6584534,17.6666667 C24.0080534,17.6666667 24.2917868,17.9504 24.2917868,18.3 C24.2917868,19.3956667 24.8529201,20.5394667 24.8586201,20.5508667 C25.5179201,21.8688333 26.0993201,22.7333333 28.0917868,22.7333333 C30.0842534,22.7333333 30.6656534,21.8688333 31.3249534,20.5502333 C31.3306534,20.5394667 31.8917868,19.3956667 31.8917868,18.3 C31.8917868,17.9504 32.1755201,17.6666667 32.5251201,17.6666667 L32.5251201,16.4 L32.5251201,16.4 Z M29.9917868,16.4 L29.3584534,16.4 C29.0088534,16.4 28.7251201,16.6837333 28.7251201,17.0333333 C28.7251201,17.3829333 29.0088534,17.6666667 29.3584534,17.6666667 L29.9917868,17.6666667 C30.3413868,17.6666667 30.6251201,17.3829333 30.6251201,17.0333333 C30.6251201,16.6837333 30.3413868,16.4 29.9917868,16.4 L29.9917868,16.4 Z M26.8251201,16.4 L26.1917868,16.4 C25.8421868,16.4 25.5584534,16.6837333 25.5584534,17.0333333 C25.5584534,17.3829333 25.8421868,17.6666667 26.1917868,17.6666667 L26.8251201,17.6666667 C27.1747201,17.6666667 27.4584534,17.3829333 27.4584534,17.0333333 C27.4584534,16.6837333 27.1747201,16.4 26.8251201,16.4 L26.8251201,16.4 Z M33.7917868,32.8666667 C33.4421868,32.8666667 33.1584534,33.1504 33.1584534,33.5 L33.1584534,42.3666667 C33.1584534,42.7162667 33.4421868,43 33.7917868,43 C34.1413868,43 34.4251201,42.7162667 34.4251201,42.3666667 L34.4251201,33.5 C34.4251201,33.1504 34.1413868,32.8666667 33.7917868,32.8666667 L33.7917868,32.8666667 Z M19.2251201,32.8666667 L4.65845344,32.8666667 C3.57545344,32.8666667 2.75845344,32.0496667 2.75845344,30.9666667 L2.75845344,11.9666667 C2.75845344,11.6170667 2.47472011,11.3333333 2.12512011,11.3333333 C1.77552011,11.3333333 1.49178678,11.6170667 1.49178678,11.9666667 L1.49178678,30.9666667 C1.49178678,32.7425333 2.88258678,34.1333333 4.65845344,34.1333333 L19.2251201,34.1333333 C19.5747201,34.1333333 19.8584534,33.8496 19.8584534,33.5 C19.8584534,33.1504 19.5747201,32.8666667 19.2251201,32.8666667 L19.2251201,32.8666667 Z" id="presentation-man"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/sources/pyside6/doc/images/Tutorials.svg b/sources/pyside6/doc/images/Tutorials.svg
new file mode 100644
index 000000000..1bbf54e53
--- /dev/null
+++ b/sources/pyside6/doc/images/Tutorials.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="38px" height="38px" viewBox="0 0 38 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title>design-skills</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <linearGradient x1="100%" y1="100%" x2="-22.8515625%" y2="-33.2356771%" id="linearGradient-1">
+ <stop stop-color="#6FFF80" offset="0%"></stop>
+ <stop stop-color="#43CE57" offset="37.2587344%"></stop>
+ <stop stop-color="#425FD0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Mainpage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Mainpage_Layout_V4_Megamenu" transform="translate(-798.000000, -5886.000000)" fill="url(#linearGradient-1)">
+ <g id="Content" transform="translate(-44.000000, 1530.000000)">
+ <g id="Support" transform="translate(277.000000, 4042.000000)">
+ <g id="1" transform="translate(564.490048, 308.000000)">
+ <path d="M0.509951956,25.6333333 L0.509951956,9.16666667 C0.509951956,7.539 2.04895196,6 3.67661862,6 L7.47661862,6 C7.82621862,6 8.10995196,6.28373333 8.10995196,6.63333333 C8.10995196,6.98293333 7.82621862,7.26666667 7.47661862,7.26666667 L3.67661862,7.26666667 C2.75321862,7.26666667 1.77661862,8.24326667 1.77661862,9.16666667 L1.77661862,25.6333333 C1.77661862,25.9829333 1.49288529,26.2666667 1.14328529,26.2666667 C0.793685289,26.2666667 0.509951956,25.9829333 0.509951956,25.6333333 L0.509951956,25.6333333 Z M35.3432853,6 L29.009952,6 C28.660352,6 28.3766186,6.28373333 28.3766186,6.63333333 C28.3766186,6.98293333 28.660352,7.26666667 29.009952,7.26666667 L35.3432853,7.26666667 C36.2666853,7.26666667 37.2432853,8.24326667 37.2432853,9.16666667 L37.2432853,31.9666667 C37.2432853,32.8900667 36.2666853,33.8666667 35.3432853,33.8666667 L3.67661862,33.8666667 C2.75321862,33.8666667 1.77661862,32.8900667 1.77661862,31.9666667 L1.77661862,28.8 L35.3432853,28.8 C35.6928853,28.8 35.9766186,28.5162667 35.9766186,28.1666667 C35.9766186,27.8170667 35.6928853,27.5333333 35.3432853,27.5333333 L1.14328529,27.5333333 C0.793685289,27.5333333 0.509951956,27.8170667 0.509951956,28.1666667 L0.509951956,31.9666667 C0.509951956,33.5943333 2.04895196,35.1333333 3.67661862,35.1333333 L35.3432853,35.1333333 C36.970952,35.1333333 38.509952,33.5943333 38.509952,31.9666667 L38.509952,9.16666667 C38.509952,7.539 36.970952,6 35.3432853,6 L35.3432853,6 Z M18.2432853,31.3333333 C18.2432853,32.0319 18.8113853,32.6 19.509952,32.6 C20.2085186,32.6 20.7766186,32.0319 20.7766186,31.3333333 C20.7766186,30.6347667 20.2085186,30.0666667 19.509952,30.0666667 C18.8113853,30.0666667 18.2432853,30.6347667 18.2432853,31.3333333 L18.2432853,31.3333333 Z M26.4766186,42.7333333 L25.8432853,42.7333333 L25.8432853,42.1 C25.8432853,41.7504 25.559552,41.4666667 25.209952,41.4666667 C24.860352,41.4666667 24.5766186,41.7504 24.5766186,42.1 L24.5766186,42.7333333 L23.309952,42.7333333 L23.309952,42.1 C23.309952,41.7504 23.0262186,41.4666667 22.6766186,41.4666667 C22.3270186,41.4666667 22.0432853,41.7504 22.0432853,42.1 L22.0432853,42.7333333 L20.7766186,42.7333333 L20.7766186,42.1 C20.7766186,41.7504 20.4928853,41.4666667 20.1432853,41.4666667 C19.7936853,41.4666667 19.509952,41.7504 19.509952,42.1 L19.509952,42.7333333 L18.2432853,42.7333333 L18.2432853,42.1 C18.2432853,41.7504 17.959552,41.4666667 17.609952,41.4666667 C17.260352,41.4666667 16.9766186,41.7504 16.9766186,42.1 L16.9766186,42.7333333 L15.709952,42.7333333 L15.709952,42.1 C15.709952,41.7504 15.4262186,41.4666667 15.0766186,41.4666667 C14.7270186,41.4666667 14.4432853,41.7504 14.4432853,42.1 L14.4432853,42.7333333 L13.1766186,42.7333333 L13.1766186,42.1 C13.1766186,41.7504 12.8928853,41.4666667 12.5432853,41.4666667 C12.1936853,41.4666667 11.909952,41.7504 11.909952,42.1 L11.909952,42.7333333 L10.6432853,42.7333333 L10.6432853,42.1 C10.6432853,41.7504 10.359552,41.4666667 10.009952,41.4666667 C9.66035196,41.4666667 9.37661862,41.7504 9.37661862,42.1 L9.37661862,42.7333333 L8.10995196,42.7333333 L8.10995196,42.1 C8.10995196,41.7504 7.82621862,41.4666667 7.47661862,41.4666667 C7.12701862,41.4666667 6.84328529,41.7504 6.84328529,42.1 L6.84328529,42.7333333 L5.57661862,42.7333333 L5.57661862,42.1 C5.57661862,41.7504 5.29288529,41.4666667 4.94328529,41.4666667 C4.59368529,41.4666667 4.30995196,41.7504 4.30995196,42.1 L4.30995196,42.7333333 L3.67661862,42.7333333 C3.32701862,42.7333333 3.04328529,43.0170667 3.04328529,43.3666667 C3.04328529,43.7162667 3.32701862,44 3.67661862,44 L26.4766186,44 C26.8262186,44 27.109952,43.7162667 27.109952,43.3666667 C27.109952,43.0170667 26.8262186,42.7333333 26.4766186,42.7333333 L26.4766186,42.7333333 Z M16.9766186,39.5666667 L16.9766186,37.0333333 C16.9766186,36.6837333 16.6928853,36.4 16.3432853,36.4 C15.9936853,36.4 15.709952,36.6837333 15.709952,37.0333333 L15.709952,39.5666667 C15.709952,39.9162667 15.9936853,40.2 16.3432853,40.2 C16.6928853,40.2 16.9766186,39.9162667 16.9766186,39.5666667 L16.9766186,39.5666667 Z M22.6766186,40.2 C23.0262186,40.2 23.309952,39.9162667 23.309952,39.5666667 L23.309952,37.0333333 C23.309952,36.6837333 23.0262186,36.4 22.6766186,36.4 C22.3270186,36.4 22.0432853,36.6837333 22.0432853,37.0333333 L22.0432853,39.5666667 C22.0432853,39.9162667 22.3270186,40.2 22.6766186,40.2 L22.6766186,40.2 Z M35.9766186,42.7333333 L35.9766186,43.3666667 C35.9766186,43.7162667 35.6928853,44 35.3432853,44 L30.2766186,44 C29.9270186,44 29.6432853,43.7162667 29.6432853,43.3666667 L29.6432853,42.7333333 C29.6432853,41.3362 30.7794853,40.2 32.1766186,40.2 L33.4432853,40.2 C34.8404186,40.2 35.9766186,41.3362 35.9766186,42.7333333 L35.9766186,42.7333333 Z M34.709952,42.7333333 C34.709952,42.0347667 34.141852,41.4666667 33.4432853,41.4666667 L32.1766186,41.4666667 C31.478052,41.4666667 30.909952,42.0347667 30.909952,42.7333333 L34.709952,42.7333333 L34.709952,42.7333333 Z M22.6766186,26.2666667 C23.0262186,26.2666667 23.309952,25.9829333 23.309952,25.6333333 L23.309952,11.8817667 L25.8432853,7.82843333 L27.8674186,11.0666667 L25.209952,11.0666667 C24.860352,11.0666667 24.5766186,11.3504 24.5766186,11.7 C24.5766186,12.0496 24.860352,12.3333333 25.209952,12.3333333 L29.009952,12.3333333 C29.2404853,12.3333333 29.4520186,12.2085667 29.5641186,12.0071667 C29.6755853,11.8057667 29.669252,11.5594 29.5470186,11.3643333 L26.380352,6.29766667 C26.148552,5.92716667 25.5380186,5.92716667 25.3062186,6.29766667 L22.139552,11.3643333 C22.076852,11.4650333 22.0432853,11.5809333 22.0432853,11.7 L22.0432853,25.6333333 C22.0432853,25.9829333 22.3270186,26.2666667 22.6766186,26.2666667 L22.6766186,26.2666667 Z M10.009952,26.2666667 L13.809952,26.2666667 C14.159552,26.2666667 14.4432853,25.9829333 14.4432853,25.6333333 C14.4432853,25.2837333 14.159552,25 13.809952,25 L10.6432853,25 L10.6432853,23.7333333 L11.2766186,23.7333333 C11.6262186,23.7333333 11.909952,23.4496 11.909952,23.1 C11.909952,22.7504 11.6262186,22.4666667 11.2766186,22.4666667 L10.6432853,22.4666667 L10.6432853,21.2 L11.2766186,21.2 C11.6262186,21.2 11.909952,20.9162667 11.909952,20.5666667 C11.909952,20.2170667 11.6262186,19.9333333 11.2766186,19.9333333 L10.6432853,19.9333333 L10.6432853,18.6666667 L13.809952,18.6666667 C14.159552,18.6666667 14.4432853,18.3829333 14.4432853,18.0333333 C14.4432853,17.6837333 14.159552,17.4 13.809952,17.4 L10.6432853,17.4 L10.6432853,16.1333333 L11.2766186,16.1333333 C11.6262186,16.1333333 11.909952,15.8496 11.909952,15.5 C11.909952,15.1504 11.6262186,14.8666667 11.2766186,14.8666667 L10.6432853,14.8666667 L10.6432853,13.6 L11.2766186,13.6 C11.6262186,13.6 11.909952,13.3162667 11.909952,12.9666667 C11.909952,12.6170667 11.6262186,12.3333333 11.2766186,12.3333333 L10.6432853,12.3333333 L10.6432853,11.0666667 L13.809952,11.0666667 C14.159552,11.0666667 14.4432853,10.7829333 14.4432853,10.4333333 C14.4432853,10.0837333 14.159552,9.8 13.809952,9.8 L10.6432853,9.8 L10.6432853,7.26666667 L19.509952,7.26666667 L19.509952,25.6333333 C19.509952,25.9829333 19.7936853,26.2666667 20.1432853,26.2666667 C20.4928853,26.2666667 20.7766186,25.9829333 20.7766186,25.6333333 L20.7766186,6.63333333 C20.7766186,6.28373333 20.4928853,6 20.1432853,6 L10.009952,6 C9.66035196,6 9.37661862,6.28373333 9.37661862,6.63333333 L9.37661862,25.6333333 C9.37661862,25.9829333 9.66035196,26.2666667 10.009952,26.2666667 L10.009952,26.2666667 Z M29.009952,13.6 C28.660352,13.6 28.3766186,13.8837333 28.3766186,14.2333333 L28.3766186,25.6333333 C28.3766186,25.9829333 28.660352,26.2666667 29.009952,26.2666667 C29.359552,26.2666667 29.6432853,25.9829333 29.6432853,25.6333333 L29.6432853,14.2333333 C29.6432853,13.8837333 29.359552,13.6 29.009952,13.6 L29.009952,13.6 Z M25.209952,14.2333333 L25.209952,25.6333333 C25.209952,25.9829333 25.4936853,26.2666667 25.8432853,26.2666667 C26.1928853,26.2666667 26.4766186,25.9829333 26.4766186,25.6333333 L26.4766186,14.2333333 C26.4766186,13.8837333 26.1928853,13.6 25.8432853,13.6 C25.4936853,13.6 25.209952,13.8837333 25.209952,14.2333333 L25.209952,14.2333333 Z" id="design-skills"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/sources/pyside6/doc/images/cpp_python.svg b/sources/pyside6/doc/images/cpp_python.svg
new file mode 100644
index 000000000..163df9ee0
--- /dev/null
+++ b/sources/pyside6/doc/images/cpp_python.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="38px"
+ height="38px"
+ viewBox="0 0 38 38"
+ version="1.1"
+ id="svg22"
+ sodipodi:docname="cpp_python.svg"
+ inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <sodipodi:namedview
+ id="namedview24"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ showgrid="false"
+ inkscape:zoom="11.381579"
+ inkscape:cx="14.057803"
+ inkscape:cy="17.528324"
+ inkscape:window-width="1920"
+ inkscape:window-height="1062"
+ inkscape:window-x="0"
+ inkscape:window-y="18"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="chat-dialog" />
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title
+ id="title2">chat-dialog</title>
+ <desc
+ id="desc4">Created with Sketch.</desc>
+ <defs
+ id="defs13">
+ <linearGradient
+ x1="100%"
+ y1="100%"
+ x2="-22.8515625%"
+ y2="-33.2356771%"
+ id="linearGradient-1">
+ <stop
+ stop-color="#6FFF80"
+ offset="0%"
+ id="stop6" />
+ <stop
+ stop-color="#43CE57"
+ offset="37.2587344%"
+ id="stop8" />
+ <stop
+ stop-color="#425FD0"
+ offset="100%"
+ id="stop10" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient-1"
+ id="linearGradient4458"
+ x1="1"
+ y1="1"
+ x2="-0.22851562"
+ y2="-0.33235675"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(145.49943,77.584003)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient-1"
+ id="linearGradient11948"
+ x1="1"
+ y1="1"
+ x2="-0.22851562"
+ y2="-0.33235675"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(144.59116,75.64207)" />
+ </defs>
+ <g
+ id="Mainpage"
+ stroke="none"
+ stroke-width="1"
+ fill="none"
+ fill-rule="evenodd">
+ <g
+ id="Mainpage_Layout_V4_Megamenu"
+ transform="translate(-882.000000, -7064.000000)"
+ fill="url(#linearGradient-1)">
+ <g
+ id="Content"
+ transform="translate(-44.000000, 1530.000000)">
+ <g
+ id="Buynow"
+ transform="translate(68.000000, 3932.000000)">
+ <g
+ transform="translate(712.000000, 1527.000000)"
+ id="chat-dialog">
+ <path
+ d="m 184,78.166667 v 11.4 c 0,1.7461 -1.4212,3.166666 -3.1673,3.166666 h -15.2 c -1.74547,0 -3.16603,-1.420566 -3.16603,-3.166666 V 82.6 c 0,-0.3496 0.28373,-0.633333 0.63333,-0.633333 0.3496,0 0.63333,0.283733 0.63333,0.633333 v 6.966667 c 0,1.047533 0.85184,1.9 1.89937,1.9 h 15.2 c 1.04753,0 1.90063,-0.852467 1.90063,-1.9 v -11.4 c 0,-1.047534 -0.8531,-1.9 -1.90063,-1.9 h -20.0032 l 3.98557,3.985566 c 0.24763,0.247634 0.24763,0.6479 0,0.895534 -0.24764,0.247633 -0.6479,0.247633 -0.89554,0 L 158.85223,76.0811 C 158.6711,75.899967 158.61663,75.627633 158.7148,75.390767 158.81297,75.154533 159.04413,75 159.3,75 h 21.5327 C 182.5788,75 184,76.420567 184,78.166667 Z m -13.3,17.1 h -21.7664 c -1.61753,0 -2.9336,1.420566 -2.9336,3.166666 v 11.399997 c 0,1.7461 1.31607,3.16667 2.9336,3.16667 h 15.3995 c 1.70493,0 3.20023,-1.47947 3.20023,-3.16983 v -6.96604 c -0.002,-0.34896 -0.285,-0.6308 -0.63333,-0.6308 h -0.003 c -0.3496,0.002 -0.63206,0.2869 -0.63016,0.6365 v 6.9635 c 0,1.07034 -1.0393,1.9 -1.93357,1.9 h -15.3995 c -0.91897,0 -1.66693,-0.85246 -1.66693,-1.9 V 98.433333 c 0,-1.047533 0.74796,-1.9 1.66693,-1.9 h 20.2445 l -3.96087,3.986837 c -0.24636,0.24826 -0.2451,0.64916 0.003,0.89553 0.24827,0.247 0.64917,0.24573 0.89553,-0.003 l 5.0331,-5.06667 c 0.1805,-0.181767 0.2337,-0.453467 0.13554,-0.6897 -0.0975,-0.236233 -0.3287,-0.390133 -0.58457,-0.390133 z M 146,81.333333 v -1.266666 c 0,-0.468034 0.25523,-0.877167 0.63333,-1.0963 V 78.8 c 0,-2.0957 1.7043,-3.8 3.8,-3.8 h 2.53334 c 2.0957,0 3.8,1.7043 3.8,3.8 v 0.170367 c 0.3781,0.219133 0.63333,0.628266 0.63333,1.0963 v 1.266666 c 0,0.477534 -0.266,0.8949 -0.65803,1.110234 -0.12034,1.217266 -0.6498,2.288866 -0.67577,2.339533 -0.5738,1.148233 -1.44147,2.883567 -4.3662,2.883567 -2.92473,0 -3.7924,-1.735334 -4.36683,-2.883567 -0.0253,-0.05067 -0.55417,-1.122267 -0.67514,-2.339533 C 146.266,82.228233 146,81.810867 146,81.333333 Z m 1.26667,0 c 0.3496,0 0.63333,0.283734 0.63333,0.633334 0,1.095666 0.56113,2.239466 0.56683,2.250866 C 149.1255,85.5355 149.7069,86.4 151.7,86.4 c 1.99247,0 2.5745,-0.8645 3.23317,-2.1831 0.006,-0.01077 0.56683,-1.154567 0.56683,-2.250233 0,-0.3496 0.28373,-0.633334 0.63333,-0.633334 v -1.266666 c -0.3496,0 -0.63333,-0.283734 -0.63333,-0.633334 V 78.8 c 0,-1.397133 -1.1362,-2.533333 -2.53333,-2.533333 h -2.53334 c -1.39713,0 -2.53333,1.1362 -2.53333,2.533333 v 0.633333 c 0,0.3496 -0.28373,0.633334 -0.63333,0.633334 z m 5.7,0 H 153.6 c 0.3496,0 0.63333,-0.283733 0.63333,-0.633333 0,-0.3496 -0.28373,-0.633333 -0.63333,-0.633333 h -0.63333 c -0.3496,0 -0.63334,0.283733 -0.63334,0.633333 0,0.3496 0.28374,0.633333 0.63334,0.633333 z m -3.16667,0 h 0.63333 c 0.3496,0 0.63334,-0.283733 0.63334,-0.633333 0,-0.3496 -0.28374,-0.633333 -0.63334,-0.633333 H 149.8 c -0.3496,0 -0.63333,0.283733 -0.63333,0.633333 0,0.3496 0.28373,0.633333 0.63333,0.633333 z M 184,100.33333 V 101.6 c 0,0.47753 -0.266,0.8949 -0.6574,1.11023 -0.12097,1.21727 -0.65043,2.28887 -0.6764,2.33954 -0.5738,1.14823 -1.44147,2.88356 -4.3662,2.88356 -2.92473,0 -3.7924,-1.73533 -4.36683,-2.88356 -0.0253,-0.0507 -0.5548,-1.12227 -0.67577,-2.33954 C 172.866,102.4949 172.6,102.07753 172.6,101.6 v -1.26667 c 0,-0.46803 0.2546,-0.877163 0.63333,-1.096297 v -0.170366 c 0,-2.0957 1.7043,-3.8 3.8,-3.8 h 2.53334 c 2.0957,0 3.8,1.7043 3.8,3.8 v 0.170366 C 183.7454,99.456167 184,99.8653 184,100.33333 Z m -1.26667,0 C 182.3831,100.33333 182.1,100.0496 182.1,99.7 v -0.633333 c 0,-1.397134 -1.1362,-2.533334 -2.53333,-2.533334 h -2.53334 c -1.39713,0 -2.53333,1.1362 -2.53333,2.533334 V 99.7 c 0,0.3496 -0.2831,0.63333 -0.63333,0.63333 V 101.6 c 0.35023,0 0.63333,0.28373 0.63333,0.63333 0,1.09567 0.56113,2.23947 0.56683,2.25087 0.65867,1.31797 1.24007,2.18247 3.23317,2.18247 1.9931,0 2.5745,-0.8645 3.23317,-2.1831 0.006,-0.0108 0.56683,-1.15457 0.56683,-2.25024 0,-0.3496 0.2831,-0.63333 0.63333,-0.63333 z m -2.53333,0 h -0.63333 c -0.35024,0 -0.63334,0.28374 -0.63334,0.63334 0,0.3496 0.2831,0.63333 0.63334,0.63333 H 180.2 c 0.35023,0 0.63333,-0.28373 0.63333,-0.63333 0,-0.3496 -0.2831,-0.63334 -0.63333,-0.63334 z m -3.16667,0 H 176.4 c -0.35023,0 -0.63333,0.28374 -0.63333,0.63334 0,0.3496 0.2831,0.63333 0.63333,0.63333 h 0.63333 c 0.35024,0 0.63334,-0.28373 0.63334,-0.63333 0,-0.3496 -0.2831,-0.63334 -0.63334,-0.63334 z"
+ id="path15"
+ sodipodi:nodetypes="ssssssssssssssccscccsssssssssscsccssssssccccccssscsssscssccsccscscscsccssssssccssssssssssssssssccsccsscsssscscssssssccscscsccssssssssssssss" />
+ <text
+ xml:space="preserve"
+ style="font-style:italic;font-weight:bold;font-size:8px;line-height:1.25;font-family:'Open Sans';-inkscape-font-specification:'Open Sans Bold Italic';letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient4458)"
+ x="149.47179"
+ y="107.35308"
+ id="text4456"><tspan
+ sodipodi:role="line"
+ id="tspan4454"
+ x="149.47179"
+ y="107.35308"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:8px;font-family:'Open Sans';-inkscape-font-specification:'Open Sans Semi-Bold';fill:url(#linearGradient4458)">C++</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:italic;font-weight:bold;font-size:5.33333px;line-height:1.25;font-family:'Open Sans';-inkscape-font-specification:'Open Sans Bold Italic';letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient11948)"
+ x="164.67328"
+ y="85.527855"
+ id="text11946"><tspan
+ sodipodi:role="line"
+ id="tspan11944"
+ x="164.67328"
+ y="85.527855"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.33333px;font-family:'Open Sans';-inkscape-font-specification:'Open Sans';fill:url(#linearGradient11948)">Python</tspan></text>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <metadata
+ id="metadata841">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:title>chat-dialog</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+</svg>
diff --git a/sources/pyside6/doc/images/stopwatch.svg b/sources/pyside6/doc/images/stopwatch.svg
new file mode 100644
index 000000000..12f313ae6
--- /dev/null
+++ b/sources/pyside6/doc/images/stopwatch.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="49px" height="48px" viewBox="0 0 49 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
+ <title>stopwatch</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <linearGradient x1="100%" y1="100%" x2="-22.8515625%" y2="-33.2356771%" id="linearGradient-1">
+ <stop stop-color="#6FFF80" offset="0%"></stop>
+ <stop stop-color="#43CE57" offset="37.2587344%"></stop>
+ <stop stop-color="#425FD0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Mainpage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Mainpage_Layout_V4_Megamenu" transform="translate(-695.000000, -1755.000000)" fill="url(#linearGradient-1)">
+ <g id="Content" transform="translate(-44.000000, 1530.000000)">
+ <g id="WhatQtis" transform="translate(194.000000, 0.000000)">
+ <g id="Block2" transform="translate(378.657594, 178.000000)">
+ <path d="M189.4002,50.2 C177.049,50.2 167.0002,60.2488 167.0002,72.6 C167.0002,73.4096 167.0474,74.2464 167.141,75.088 C167.1898,75.5272 167.5882,75.84 168.0242,75.7952 C168.4634,75.7464 168.7802,75.3504 168.7314,74.912 C168.6442,74.128 168.6002,73.3504 168.6002,72.6 C168.6002,61.1312 177.9314,51.8 189.4002,51.8 C200.8698,51.8 210.2002,61.1312 210.2002,72.6 C210.2002,84.0688 200.8698,93.4 189.4002,93.4 C185.5434,93.4 181.7762,92.3344 178.5058,90.3192 C178.1306,90.0864 177.637,90.204 177.405,90.58 C177.173,90.956 177.2906,91.4496 177.6666,91.6808 C181.189,93.852 185.2466,95 189.4002,95 C201.7514,95 211.8002,84.9512 211.8002,72.6 C211.8002,60.2488 201.7514,50.2 189.4002,50.2 L189.4002,50.2 Z M186.2002,87.8 C186.2002,87.3584 185.8418,87 185.4002,87 L171.0002,87 C170.5586,87 170.2002,87.3584 170.2002,87.8 C170.2002,88.2416 170.5586,88.6 171.0002,88.6 L185.4002,88.6 C185.8418,88.6 186.2002,88.2416 186.2002,87.8 L186.2002,87.8 Z M181.4002,83 C181.4002,82.5584 181.0418,82.2 180.6002,82.2 L167.8002,82.2 C167.3586,82.2 167.0002,82.5584 167.0002,83 C167.0002,83.4416 167.3586,83.8 167.8002,83.8 L180.6002,83.8 C181.0418,83.8 181.4002,83.4416 181.4002,83 L181.4002,83 Z M168.6002,78.2 C168.6002,78.6416 168.9586,79 169.4002,79 L175.8002,79 C176.2418,79 176.6002,78.6416 176.6002,78.2 C176.6002,77.7584 176.2418,77.4 175.8002,77.4 L169.4002,77.4 C168.9586,77.4 168.6002,77.7584 168.6002,78.2 L168.6002,78.2 Z M189.4002,71 C188.5178,71 187.8002,71.7176 187.8002,72.6 C187.8002,73.4824 188.5178,74.2 189.4002,74.2 C190.2826,74.2 191.0002,73.4824 191.0002,72.6 C191.0002,71.7176 190.2826,71 189.4002,71 L189.4002,71 Z M176.9426,59.0304 L187.7842,69.8536 C188.2602,69.5728 188.8082,69.4 189.4002,69.4 C191.165,69.4 192.6002,70.8352 192.6002,72.6 C192.6002,74.3648 191.165,75.8 189.4002,75.8 C187.6354,75.8 186.2002,74.3648 186.2002,72.6 C186.2002,72.0088 186.3722,71.4608 186.653,70.9848 L175.8122,60.1624 C175.5002,59.8504 175.4994,59.344 175.8114,59.0312 C176.1234,58.7168 176.6298,58.7168 176.9426,59.0304 L176.9426,59.0304 Z M193.1778,89.8096 L193.385,90.5816 C193.4818,90.9384 193.805,91.1736 194.157,91.1736 C194.2258,91.1736 194.2962,91.1648 194.3658,91.1464 C194.7922,91.0312 195.0458,90.592 194.9306,90.1656 L194.7226,89.3936 C194.6082,88.9672 194.1674,88.7128 193.7426,88.8288 C193.3162,88.944 193.0626,89.3832 193.1778,89.8096 L193.1778,89.8096 Z M197.5034,88.2448 L197.9042,88.9368 C198.0522,89.1928 198.3202,89.336 198.597,89.336 C198.733,89.336 198.8714,89.3008 198.997,89.228 C199.3802,89.0072 199.5106,88.5176 199.2882,88.1352 L198.8874,87.4432 C198.6658,87.0608 198.1762,86.9304 197.7946,87.1512 C197.4122,87.3728 197.2818,87.8624 197.5034,88.2448 L197.5034,88.2448 Z M201.2754,85.6128 L201.8418,86.1784 C201.9978,86.3344 202.2026,86.4128 202.4074,86.4128 C202.6122,86.4128 202.817,86.3344 202.9738,86.1776 C203.285,85.8656 203.285,85.3584 202.973,85.0464 L202.4066,84.4808 C202.0938,84.1688 201.5866,84.168 201.2746,84.4816 C200.9626,84.7944 200.9626,85.3008 201.2754,85.6128 L201.2754,85.6128 Z M205.0386,80.7096 C204.6554,80.4888 204.1666,80.6192 203.9458,81.0024 C203.7242,81.3848 203.8554,81.8744 204.2386,82.0952 L204.9314,82.4952 C205.057,82.568 205.1946,82.6024 205.3306,82.6024 C205.6074,82.6024 205.8762,82.4592 206.0242,82.2024 C206.2458,81.8192 206.1146,81.3304 205.7314,81.1096 L205.0386,80.7096 Z M206.9634,78.1376 C207.033,78.156 207.1026,78.1656 207.1714,78.1656 C207.5242,78.1656 207.8482,77.9296 207.9434,77.572 C208.057,77.1448 207.8042,76.7064 207.3778,76.592 L206.6042,76.3848 C206.1794,76.2704 205.7386,76.524 205.6242,76.9504 C205.5106,77.3776 205.7634,77.8168 206.1898,77.9304 L206.9634,78.1376 Z M204.6018,73.4024 L207.8002,73.4024 C208.2426,73.4024 208.6002,73.044 208.6002,72.6024 C208.6002,72.1608 208.2426,71.8024 207.8002,71.8024 L204.6018,71.8024 C204.1594,71.8024 203.8018,72.1608 203.8018,72.6024 C203.8018,73.044 204.1594,73.4024 204.6018,73.4024 L204.6018,73.4024 Z M205.6258,68.2536 C205.721,68.6112 206.045,68.8472 206.3978,68.8472 C206.4666,68.8472 206.5362,68.8384 206.6058,68.8192 L207.3794,68.6128 C207.8058,68.4984 208.0586,68.06 207.945,67.6328 C207.8306,67.2064 207.3914,66.9528 206.965,67.0672 L206.1914,67.2744 C205.765,67.388 205.5122,67.8272 205.6258,68.2536 L205.6258,68.2536 Z M204.9354,62.7088 L204.2418,63.1088 C203.8586,63.3296 203.7266,63.8184 203.9482,64.2008 C204.0954,64.4584 204.365,64.6016 204.6418,64.6016 C204.777,64.6016 204.9146,64.5672 205.0402,64.4944 L205.7338,64.0944 C206.117,63.8736 206.249,63.3848 206.0274,63.0016 C205.8074,62.6192 205.3186,62.4872 204.9354,62.7088 L204.9354,62.7088 Z M201.8442,60.956 C202.049,60.956 202.2522,60.8784 202.409,60.7224 L202.9762,60.1568 C203.289,59.8448 203.289,59.3384 202.9778,59.0256 C202.6658,58.7136 202.1594,58.712 201.8466,59.024 L201.2794,59.5896 C200.9658,59.9016 200.9658,60.408 201.2778,60.7208 C201.4338,60.8776 201.6386,60.956 201.8442,60.956 L201.8442,60.956 Z M184.8434,56.4008 C184.9114,56.4008 184.981,56.392 185.0498,56.3736 C185.4762,56.2608 185.7306,55.8224 185.617,55.3952 L185.4114,54.6224 C185.2978,54.196 184.8586,53.9408 184.433,54.0552 C184.0058,54.168 183.7514,54.6064 183.8658,55.0336 L184.0706,55.8064 C184.1666,56.1648 184.4898,56.4008 184.8434,56.4008 L184.8434,56.4008 Z M180.601,58.1584 C180.7362,58.1584 180.8738,58.124 181.0002,58.0512 C181.3826,57.8304 181.5138,57.3416 181.293,56.9584 L180.893,56.2656 C180.6714,55.8832 180.1826,55.7512 179.8002,55.9728 C179.4178,56.1936 179.2866,56.6832 179.5074,57.0656 L179.9074,57.7584 C180.0554,58.0152 180.3242,58.1584 180.601,58.1584 L180.601,58.1584 Z M197.7986,58.0504 C197.9242,58.124 198.0626,58.1584 198.1986,58.1584 C198.4746,58.1584 198.7434,58.016 198.8914,57.7592 L199.2922,57.0672 C199.5146,56.6848 199.3834,56.1952 199.001,55.9744 C198.6194,55.752 198.129,55.8832 197.9082,56.2656 L197.5074,56.9576 C197.285,57.34 197.4162,57.8296 197.7986,58.0504 L197.7986,58.0504 Z M193.7474,56.3728 C193.817,56.3912 193.8866,56.4 193.9554,56.4 C194.3082,56.4 194.6314,56.1648 194.7274,55.808 L194.9354,55.0352 C195.0498,54.6088 194.797,54.1696 194.3706,54.0544 C193.9466,53.9408 193.5058,54.1928 193.3898,54.6192 L193.1826,55.392 C193.0674,55.8184 193.3202,56.2576 193.7474,56.3728 L193.7474,56.3728 Z M188.6002,87.8 L188.6002,91 C188.6002,91.4416 188.9586,91.8 189.4002,91.8 C189.8418,91.8 190.2002,91.4416 190.2002,91 L190.2002,87.8 C190.2002,87.3584 189.8418,87 189.4002,87 C188.9586,87 188.6002,87.3584 188.6002,87.8 L188.6002,87.8 Z M190.2002,57.4 L190.2002,54.2 C190.2002,53.7584 189.8418,53.4 189.4002,53.4 C188.9586,53.4 188.6002,53.7584 188.6002,54.2 L188.6002,57.4 C188.6002,57.8416 188.9586,58.2 189.4002,58.2 C189.8418,58.2 190.2002,57.8416 190.2002,57.4 L190.2002,57.4 Z M168.9314,55.8 L169.4002,56.2688 L173.069,52.6 L172.6002,52.1312 L168.9314,55.8 Z M167.2346,56.3656 C166.9218,56.0528 166.9218,55.5472 167.2346,55.2344 L172.0346,50.4344 C172.3474,50.1216 172.853,50.1216 173.1658,50.4344 L174.7658,52.0344 C175.0786,52.3472 175.0786,52.8528 174.7658,53.1656 L169.9658,57.9656 C169.8098,58.1216 169.605,58.2 169.4002,58.2 C169.1954,58.2 168.9906,58.1216 168.8346,57.9656 L167.2346,56.3656 Z M187.0002,48.6 L191.8002,48.6 C192.2426,48.6 192.6002,48.2416 192.6002,47.8 C192.6002,47.3584 192.2426,47 191.8002,47 L187.0002,47 C186.5586,47 186.2002,47.3584 186.2002,47.8 C186.2002,48.2416 186.5586,48.6 187.0002,48.6 L187.0002,48.6 Z M207.2074,55.924 L210.7658,52.3656 C211.0786,52.0528 211.0786,51.5472 210.7658,51.2344 C210.453,50.9216 209.9474,50.9216 209.6346,51.2344 L206.0762,54.7928 C205.7634,55.1056 205.7634,55.612 206.0762,55.924 C206.2322,56.0808 206.437,56.1584 206.6418,56.1584 C206.8466,56.1584 207.0506,56.0808 207.2074,55.924 L207.2074,55.924 Z M215.0002,51.8 C215.0002,54.4472 212.8474,56.6 210.2002,56.6 C209.7578,56.6 209.4002,56.2416 209.4002,55.8 C209.4002,55.3584 209.7578,55 210.2002,55 C211.965,55 213.4002,53.5648 213.4002,51.8 C213.4002,50.0352 211.965,48.6 210.2002,48.6 C208.4354,48.6 207.0002,50.0352 207.0002,51.8 C207.0002,52.2416 206.6426,52.6 206.2002,52.6 C205.7578,52.6 205.4002,52.2416 205.4002,51.8 C205.4002,49.1528 207.553,47 210.2002,47 C212.8474,47 215.0002,49.1528 215.0002,51.8 L215.0002,51.8 Z" id="stopwatch"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/sources/pyside6/doc/index.rst b/sources/pyside6/doc/index.rst
index c982c7c3b..53dd3de38 100644
--- a/sources/pyside6/doc/index.rst
+++ b/sources/pyside6/doc/index.rst
@@ -39,9 +39,12 @@ Documentation
.. ifconfig:: output_format == 'html'
.. panels::
- :body: text-center
+ :body: align-items-center jutify-content-center text-center
:container: container-lg pb-3
:column: col-lg-4 col-md-4 col-sm-6 col-xs-12 p-2
+ :img-top-cls: d-flex align-self-center img-responsive card-img-top-main
+
+ :img-top: images/Desktop.svg
Write your first Qt application.
@@ -52,6 +55,7 @@ Documentation
:text: Check it out!
:classes: btn-qt btn-block stretched-link
---
+ :img-top: images/Support.svg
Install and build from source.
@@ -62,6 +66,7 @@ Documentation
:text: Getting Started
:classes: btn-qt btn-block stretched-link
---
+ :img-top: images/Dev.svg
PySide API reference.
@@ -73,6 +78,7 @@ Documentation
:classes: btn-qt btn-block stretched-link
---
+ :img-top: images/Tutorials.svg
Learn with step-by-step guides.
@@ -83,6 +89,7 @@ Documentation
:text: Tutorials
:classes: btn-qt btn-block stretched-link
---
+ :img-top: images/Examples.svg
Check all the available examples.
@@ -93,6 +100,7 @@ Documentation
:text: Examples
:classes: btn-qt btn-block stretched-link
---
+ :img-top: images/Training.svg
Watch webinars, talks, and more.
@@ -104,6 +112,7 @@ Documentation
:classes: btn-qt btn-block stretc