diff options
Diffstat (limited to 'sources/pyside6/PySide6/QtUiTools')
4 files changed, 171 insertions, 0 deletions
diff --git a/sources/pyside6/PySide6/QtUiTools/CMakeLists.txt b/sources/pyside6/PySide6/QtUiTools/CMakeLists.txt new file mode 100644 index 000000000..e16d2d585 --- /dev/null +++ b/sources/pyside6/PySide6/QtUiTools/CMakeLists.txt @@ -0,0 +1,45 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +project(QtUiTools) + +set(QtUiTools_SRC +${QtUiTools_GEN_DIR}/quiloader_wrapper.cpp +# module is always needed +${QtUiTools_GEN_DIR}/qtuitools_module_wrapper.cpp +) + +set(QtUiTools_glue_sources + "${QtUiTools_SOURCE_DIR}/glue/plugins.h" +) + +set(QtUiTools_include_dirs ${QtUiTools_SOURCE_DIR} + ${QtUiTools_BINARY_DIR} + ${Qt${QT_MAJOR_VERSION}Core_INCLUDE_DIRS} + ${Qt${QT_MAJOR_VERSION}Gui_INCLUDE_DIRS} + ${Qt${QT_MAJOR_VERSION}Widgets_INCLUDE_DIRS} + ${Qt${QT_MAJOR_VERSION}Xml_INCLUDE_DIRS} + ${Qt${QT_MAJOR_VERSION}Designer_INCLUDE_DIRS} + ${Qt${QT_MAJOR_VERSION}UiTools_INCLUDE_DIRS} + ${libpyside_SOURCE_DIR} + ${plugins_SOURCE_DIR} + ${QtCore_GEN_DIR} + ${QtGui_GEN_DIR} + ${QtWidgets_GEN_DIR}) + +set(QtUiTools_libraries pyside6 + uiplugin + ${Qt${QT_MAJOR_VERSION}UiTools_LIBRARIES}) + +set(QtUiTools_deps QtWidgets) + +configure_file("${QtUiTools_SOURCE_DIR}/QtUiTools_global.pre.h.in" + "${QtUiTools_BINARY_DIR}/QtUiTools_global.pre.h" @ONLY) + +create_pyside_module(NAME QtUiTools + INCLUDE_DIRS QtUiTools_include_dirs + LIBRARIES QtUiTools_libraries + DEPS QtUiTools_deps + TYPESYSTEM_PATH QtUiTools_SOURCE_DIR + SOURCES QtUiTools_SRC + GLUE_SOURCES QtUiTools_glue_sources) diff --git a/sources/pyside6/PySide6/QtUiTools/QtUiTools_global.pre.h.in b/sources/pyside6/PySide6/QtUiTools/QtUiTools_global.pre.h.in new file mode 100644 index 000000000..addfe080f --- /dev/null +++ b/sources/pyside6/PySide6/QtUiTools/QtUiTools_global.pre.h.in @@ -0,0 +1,7 @@ +// Those classes are only forward-declared in QtUiLoader + +#include <QtWidgets/QLayout> +#include <QtWidgets/QWidget> +#include <QtGui/QAction> +#include <QtGui/QActionGroup> +#include <QtCore/QDir> diff --git a/sources/pyside6/PySide6/QtUiTools/glue/plugins.h b/sources/pyside6/PySide6/QtUiTools/glue/plugins.h new file mode 100644 index 000000000..04ec149ff --- /dev/null +++ b/sources/pyside6/PySide6/QtUiTools/glue/plugins.h @@ -0,0 +1,31 @@ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef _PLUGIN_H_ +#define _PLUGIN_H_ + +#include "customwidgets.h" + +#include <QtCore/qpluginloader.h> + +static inline PyCustomWidgets *findPlugin() +{ + const auto &instances = QPluginLoader::staticInstances(); + for (QObject *o : instances) { + if (auto plugin = qobject_cast<PyCustomWidgets *>(o)) + return plugin; + } + return nullptr; +} + +static void registerCustomWidget(PyObject *obj) +{ + static PyCustomWidgets *const plugin = findPlugin(); + + if (plugin) + plugin->registerWidgetType(obj); + else + qWarning("Qt for Python: Failed to find the static QUiLoader plugin."); +} + +#endif diff --git a/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml b/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml new file mode 100644 index 000000000..9cfa176c8 --- /dev/null +++ b/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +--> + +<typesystem package="PySide6.QtUiTools" + namespace-begin="QT_BEGIN_NAMESPACE" namespace-end="QT_END_NAMESPACE"> + <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/> + + <object-type name="QUiLoader"> + <extra-includes> + <include file-name="glue/plugins.h" location="local"/> + </extra-includes> + <inject-code class="native" position="beginning" file="../glue/qtuitools.cpp" snippet="uitools-loadui"/> + <inject-code file="../glue/qtuitools.cpp" snippet="quiloader"/> + <add-function signature="registerCustomWidget(PyObject*@customWidgetType@)" return-type="void"> + <inject-documentation format="target" mode="append" file="../doc/qtuitools.rst" + snippet="quiloader-registercustomwidget"/> + <inject-code class="target" position="beginning" file="../glue/qtuitools.cpp" + snippet="quiloader-registercustomwidget"/> + </add-function> + <modify-function signature="createAction(QObject*,const QString&)"> + <modify-argument index="return"> + <parent index="1" action="add"/> + <define-ownership class="native" owner="c++"/> + <define-ownership class="target" owner="default"/> + </modify-argument> + </modify-function> + + <modify-function signature="createActionGroup(QObject*,const QString&)"> + <modify-argument index="return"> + <parent index="1" action="add"/> + <define-ownership class="native" owner="c++"/> + <define-ownership class="target" owner="default"/> + </modify-argument> + </modify-function> + + <modify-function signature="createLayout(const QString&,QObject*,const QString&)"> + <modify-argument index="return"> + <parent index="2" action="add"/> + <define-ownership class="native" owner="c++"/> + <define-ownership class="target" owner="default"/> + </modify-argument> + </modify-function> + + <modify-function signature="createWidget(const QString&,QWidget*,const QString&)"> + <modify-argument index="return"> + <parent index="2" action="add"/> + <define-ownership class="native" owner="c++"/> + <define-ownership class="target" owner="default"/> + </modify-argument> + </modify-function> + + <modify-function signature="load(QIODevice*,QWidget*)"> + <modify-argument index="2"> + <replace-default-expression with="0"/> + <rename to="parentWidget"/> + </modify-argument> + <modify-argument index="return"> + <define-ownership class="target" owner="target"/> + </modify-argument> + <inject-code file="../glue/qtuitools.cpp" snippet="quiloader-load-1"/> + </modify-function> + + <!-- Syntax sugar --> + <add-function signature="load(PyPathLike,QWidget*@parentWidget@=nullptr)" return-type="QWidget*"> + <modify-argument index="return"> + <define-ownership class="target" owner="target"/> + </modify-argument> + <inject-code file="../glue/qtuitools.cpp" snippet="quiloader-load-2"/> + </add-function> + </object-type> + + <!-- + After the removal of the 'pysideuic' Python module, many users were unable to generate and + load UI classes dynamically. + This function was created to provide an equivalent solution to the 'loadUiType' function from + Riverbank's PyQt. + --> + <add-function signature="loadUiType(const QString& @uifile@)" return-type="PyObject*"> + <inject-code file="../glue/qtuitools.cpp" snippet="loaduitype"/> + <inject-documentation format="target" mode="append" file="../doc/qtuitools.rst" + snippet="loaduitype"/> + </add-function> + + +</typesystem> |