From c139bf2f990d58e7dce0b75327f156233b1e749d Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 25 Jun 2019 20:27:40 +0200 Subject: [PATCH] not using QMetaObject::newInstance anymore, incompatibilities with Qt >= 12.4 fixed --- README.md | 2 -- src/controls/QskSkin.cpp | 21 +++++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 667d6335..78b587f9 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,6 @@ It might support all versions Qt >= 5.6, but you can rely on: - current long term supported ( LTS ) version of Qt - current version of Qt -( Unfortunately Qt 12.4 and Qt 13.0 are broken - see https://bugreports.qt.io/browse/QTBUG-76663. Until this has been fixed you have to stay with Qt 12.3 ) - If you want to know more about QSkinny - or even like to give it a specific direction - please contact support@qskinny.org. diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index 59405a8c..adbe31c8 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -74,6 +74,22 @@ QSK_QT_PRIVATE_END #include "QskStatusIndicator.h" #include "QskStatusIndicatorSkinlet.h" +static inline QskSkinlet *qskNewSkinlet( const QMetaObject* metaObject, QskSkin* skin ) +{ + const QByteArray signature = metaObject->className() + QByteArrayLiteral( "(QskSkin*)" ); + + QskSkinlet *skinlet = nullptr; + + const int index = metaObject->indexOfConstructor( signature.constData() ); + if ( index >= 0 ) + { + void *param[] = { &skinlet, &skin }; + metaObject->static_metacall( QMetaObject::CreateInstance, index, param ); + } + + return skinlet; +} + namespace { class SkinletData @@ -434,10 +450,7 @@ QskSkinlet* QskSkin::skinlet( const QskSkinnable* skinnable ) auto& entry = it->second; if ( entry.skinlet == nullptr ) - { - entry.skinlet = reinterpret_cast< QskSkinlet* >( - entry.metaObject->newInstance( Q_ARG( QskSkin*, this ) ) ); - } + entry.skinlet = qskNewSkinlet( entry.metaObject, this ); return entry.skinlet; }