From a9e5e09f156b09c7f65e0b57fe191d71f9c1aa3e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 17 Aug 2016 11:09:12 +0200 Subject: Qt Designer: Adapt warning about mismatched class names Move the exclusion check to a static function and suppress the warning for the fake QWebEngineView class, too. Task-number: QTBUG-53984 Change-Id: I445bcf37b92e5677342e18698fd4b0b07fa4ca10 Reviewed-by: Kai Koehne --- src/designer/src/lib/shared/widgetfactory.cpp | 34 ++++++++++++++++++--------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/designer/src/lib/shared/widgetfactory.cpp b/src/designer/src/lib/shared/widgetfactory.cpp index 1478f45e6..0357104fe 100644 --- a/src/designer/src/lib/shared/widgetfactory.cpp +++ b/src/designer/src/lib/shared/widgetfactory.cpp @@ -242,6 +242,25 @@ QObject* WidgetFactory::createObject(const QString &className, QObject* parent) return 0; } +// Check for mismatched class names in plugins, which is hard to track. +static bool classNameMatches(const QObject *created, const QString &className) +{ +#ifdef Q_OS_WIN + // Perform literal comparison first for QAxWidget, for which a meta object hack is in effect. + if (isAxWidget(created)) + return true; +#endif + const char *createdClassNameC = created->metaObject()->className(); + const QByteArray classNameB = className.toUtf8(); + const char *classNameC = classNameB.constData(); + if (qstrcmp(createdClassNameC, classNameC) == 0 || created->inherits(classNameC)) + return true; + // QTBUG-53984: QWebEngineView property dummy + if (classNameB == "QWebEngineView" && qstrcmp(createdClassNameC, "fake::QWebEngineView") == 0) + return true; + return false; +} + QWidget* WidgetFactory::createCustomWidget(const QString &className, QWidget *parentWidget, bool *creationError) const { *creationError = false; @@ -287,19 +306,12 @@ QWidget* WidgetFactory::createCustomWidget(const QString &className, QWidget *p if (lang) return rc; -#ifdef Q_OS_WIN - if (isAxWidget(rc)) - return rc; -#endif // Check for mismatched class names which is hard to track. - // Perform literal comparison first for QAxWidget, for which a meta object hack is in effect. - const char *createdClassNameC = rc->metaObject()->className(); - const QByteArray classNameB = className.toUtf8(); - const char *classNameC = classNameB.constData(); - - if (qstrcmp(createdClassNameC, classNameC) && !rc->inherits(classNameC)) + if (!classNameMatches(rc, className)) { designerWarning(tr("A class name mismatch occurred when creating a widget using the custom widget factory registered for widgets of class %1." - " It returned a widget of class %2.").arg(className).arg(QString::fromUtf8(createdClassNameC))); + " It returned a widget of class %2.") + .arg(className, QString::fromUtf8(rc->metaObject()->className()))); + } return rc; } -- cgit v1.2.3