diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-05-03 12:53:33 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-05-06 04:54:51 +0000 |
commit | 4eb0c8147baefb3691308ba5d707c97b7512c75b (patch) | |
tree | fe68d76d9d33c765491d8bf9f3092181f238f4c9 /sources/pyside6 | |
parent | a6e0b44ea509bb542ac7db8d9c61987ced944e59 (diff) |
shiboken: Introduce a function to get the type name of a polymorphic class
Helps for hierarchies that do not have virtual destructors where the
default typeid(t).name() does not work (QStyleOption).
Fixes: PYSIDE-1909
Change-Id: I9ce3769a8c3550d011023597eede0ae6f8c9ad68
Reviewed-by: Christian Tismer <tismer@stackless.com>
(cherry picked from commit de5f162a70dda9d74cfce2337a9f90ddcb4ca75f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'sources/pyside6')
4 files changed, 130 insertions, 1 deletions
diff --git a/sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml b/sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml index 667eb0f07..917e3eebf 100644 --- a/sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml +++ b/sources/pyside6/PySide6/QtWidgets/typesystem_widgets_common.xml @@ -88,7 +88,10 @@ <function signature="qDrawPlainRect(QPainter*,int,int,int,int,const QColor&,int,const QBrush*)"/> <function signature="qDrawPlainRect(QPainter*,const QRect&,const QColor&,int,const QBrush*)"/> - <object-type name="QStyleOption" polymorphic-id-expression="%1->type == QStyleOption::SO_Default"> + <object-type name="QStyleOption" polymorphic-id-expression="%1->type == QStyleOption::SO_Default" + polymorphic-name-function="styleOptionType"> + <inject-code class="native" position="beginning" file="../glue/qtwidgets.cpp" + snippet="qstyleoption-typename"/> <enum-type name="OptionType"/> <enum-type name="StyleOptionType"/> <enum-type name="StyleOptionVersion"/> diff --git a/sources/pyside6/PySide6/glue/qtwidgets.cpp b/sources/pyside6/PySide6/glue/qtwidgets.cpp index 7511e89cc..b355f41cb 100644 --- a/sources/pyside6/PySide6/glue/qtwidgets.cpp +++ b/sources/pyside6/PySide6/glue/qtwidgets.cpp @@ -719,6 +719,63 @@ QAction *cppResult = %CPPSELF.exec(%1, %2, %3, %4); %PYARG_0 = %CONVERTTOPYTHON[QAction*](cppResult); // @snippet qmenu-exec-3 +// @snippet qstyleoption-typename +const char *styleOptionType(const QStyleOption *o) +{ + switch (o->type) { + case QStyleOption::SO_Default: + break; + case QStyleOption::SO_FocusRect: + return "StyleOptionFocusRect"; + case QStyleOption::SO_Button: + return "StyleOptionButton"; + case QStyleOption::SO_Tab: + return "StyleOptionTab"; + case QStyleOption::SO_MenuItem: + return "StyleOptionMenuItem"; + case QStyleOption::SO_Frame: + return "StyleOptionFrame"; + case QStyleOption::SO_ProgressBar: + return "StyleOptionProgressBar"; + case QStyleOption::SO_ToolBox: + return "StyleOptionToolBox"; + case QStyleOption::SO_Header: + return "StyleOptionHeader"; + case QStyleOption::SO_DockWidget: + return "StyleOptionDockWidget"; + case QStyleOption::SO_ViewItem: + return "StyleOptionViewItem"; + case QStyleOption::SO_TabWidgetFrame: + return "StyleOptionTabWidgetFrame"; + case QStyleOption::SO_TabBarBase: + return "StyleOptionTabBarBase"; + case QStyleOption::SO_RubberBand: + return "StyleOptionRubberBand"; + case QStyleOption::SO_ToolBar: + return "StyleOptionToolBar"; + case QStyleOption::SO_GraphicsItem: + return "StyleOptionGraphicsItem"; + case QStyleOption::SO_Slider: + return "StyleOptionSlider"; + case QStyleOption::SO_SpinBox: + return "StyleOptionSpinBox"; + case QStyleOption::SO_ToolButton: + return "StyleOptionToolButton"; + case QStyleOption::SO_ComboBox: + return "StyleOptionComboBox"; + case QStyleOption::SO_TitleBar: + return "StyleOptionTitleBar"; + case QStyleOption::SO_GroupBox: + return "StyleOptionGroupBox"; + case QStyleOption::SO_SizeGrip: + return "StyleOptionSizeGrip"; + default: + break; + } + return "QStyleOption"; +} +// @snippet qstyleoption-typename + /********************************************************************* * CONVERSIONS ********************************************************************/ diff --git a/sources/pyside6/tests/QtWidgets/CMakeLists.txt b/sources/pyside6/tests/QtWidgets/CMakeLists.txt index 8978df9a4..5989c0625 100644 --- a/sources/pyside6/tests/QtWidgets/CMakeLists.txt +++ b/sources/pyside6/tests/QtWidgets/CMakeLists.txt @@ -106,6 +106,7 @@ PYSIDE_TEST(qpicture_test.py) PYSIDE_TEST(qpushbutton_test.py) PYSIDE_TEST(qsplitter_test.py) PYSIDE_TEST(qstyle_test.py) +PYSIDE_TEST(qstyleoption_test.py) PYSIDE_TEST(qtableview_test.py) PYSIDE_TEST(qtabwidget_test.py) PYSIDE_TEST(qtabwidgetclear_test.py) diff --git a/sources/pyside6/tests/QtWidgets/qstyleoption_test.py b/sources/pyside6/tests/QtWidgets/qstyleoption_test.py new file mode 100644 index 000000000..2cbdfcfbd --- /dev/null +++ b/sources/pyside6/tests/QtWidgets/qstyleoption_test.py @@ -0,0 +1,68 @@ +############################################################################# +## +## Copyright (C) 2022 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the test suite of Qt for Python. +## +## $QT_BEGIN_LICENSE:GPL-EXCEPT$ +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see https://www.qt.io/terms-conditions. For further +## information use the contact form at https://www.qt.io/contact-us. +## +## GNU General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 3 as published by the Free Software +## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +## included in the packaging of this file. Please review the following +## information to ensure the GNU General Public License requirements will +## be met: https://www.gnu.org/licenses/gpl-3.0.html. +## +## $QT_END_LICENSE$ +## +############################################################################# + +import sys +import os +import unittest + +from pathlib import Path +sys.path.append(os.fspath(Path(__file__).resolve().parents[1])) +from init_paths import init_test_paths +init_test_paths(False) + +from helper.usesqapplication import UsesQApplication + +from PySide6.QtWidgets import (QApplication, QCommonStyle, QPushButton) + + +text = '' + + +class Style(QCommonStyle): + + def drawControl(self, element, option, painter, widget=None): + # This should be a QStyleOptionButton with a "text" field + global text + text = option.text + + +class StyleOptionTest(UsesQApplication): + '''PYSIDE-1909: Test cast to derived style option classes.''' + + def testStyle(self): + global text + button = QPushButton("Hello World") + button.setStyle(Style()) + button.show() + while not text: + QApplication.processEvents() + self.assertEqual(text, button.text()) + + +if __name__ == '__main__': + unittest.main() |