From da3cb1deb6c752f8e4c05434e3451432e5d787ba Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Sun, 19 Apr 2020 11:23:55 +0200 Subject: uic: Generate Qt 5 connection syntax Add a enum and formatting for member function pointer based connections. Now preferably use member function pointer for Qt classes or parameterless connections. This should not require qOverload() within Qt classes after the Signal/Slot disambiguation. Add command line option to force either syntax for all connections. Task-number: QTBUG-76375 Change-Id: Icdb4051e1173172a71cd536bdbc7d1ab1edf267d Reviewed-by: Volker Hilsheimer --- src/tools/uic/cpp/cppwriteincludes.cpp | 3 +++ src/tools/uic/cpp/cppwriteinitialization.cpp | 33 +++++++++++++++++++++++++--- src/tools/uic/cpp/cppwriteinitialization.h | 6 +++++ 3 files changed, 39 insertions(+), 3 deletions(-) (limited to 'src/tools/uic/cpp') diff --git a/src/tools/uic/cpp/cppwriteincludes.cpp b/src/tools/uic/cpp/cppwriteincludes.cpp index f2e69553c6..b9190b8295 100644 --- a/src/tools/uic/cpp/cppwriteincludes.cpp +++ b/src/tools/uic/cpp/cppwriteincludes.cpp @@ -229,6 +229,9 @@ void WriteIncludes::add(const QString &className, bool determineHeader, const QS return; } + if (cwi->extends(className, QLatin1String("QDialogButtonBox"))) + add(QLatin1String("QAbstractButton")); // for signal "clicked(QAbstractButton*)" + if (determineHeader) insertIncludeForClass(className, header, global); } diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index 2a9efaac95..585313f5de 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.cpp +++ b/src/tools/uic/cpp/cppwriteinitialization.cpp @@ -2568,6 +2568,31 @@ WriteInitialization::Declaration WriteInitialization::findDeclaration(const QStr return {}; } +bool WriteInitialization::isCustomWidget(const QString &className) const +{ + return m_uic->customWidgetsInfo()->customWidget(className) != nullptr; +} + +ConnectionSyntax WriteInitialization::connectionSyntax(const QString &senderSignature, + const QString &senderClassName, + const QString &receiverClassName) const +{ + if (m_option.forceMemberFnPtrConnectionSyntax) + return ConnectionSyntax::MemberFunctionPtr; + if (m_option.forceStringConnectionSyntax) + return ConnectionSyntax::StringBased; + // Auto mode: Use Qt 5 connection syntax for Qt classes and parameterless + // connections. QAxWidget is special though since it has a fake Meta object. + static const QStringList requiresStringSyntax{QStringLiteral("QAxWidget")}; + if (requiresStringSyntax.contains(senderClassName) + || requiresStringSyntax.contains(receiverClassName)) { + return ConnectionSyntax::StringBased; + } + return senderSignature.endsWith(QLatin1String("()")) + || (!isCustomWidget(senderClassName) && !isCustomWidget(receiverClassName)) + ? ConnectionSyntax::MemberFunctionPtr : ConnectionSyntax::StringBased; +} + void WriteInitialization::acceptConnection(DomConnection *connection) { const QString senderName = connection->elementSender(); @@ -2584,14 +2609,16 @@ void WriteInitialization::acceptConnection(DomConnection *connection) fprintf(stderr, "%s\n", qPrintable(message)); return; } - - language::SignalSlot theSignal{senderDecl.name, connection->elementSignal(), + const QString senderSignature = connection->elementSignal(); + language::SignalSlot theSignal{senderDecl.name, senderSignature, senderDecl.className}; language::SignalSlot theSlot{receiverDecl.name, connection->elementSlot(), receiverDecl.className}; m_output << m_indent; - language::formatConnection(m_output, theSignal, theSlot); + language::formatConnection(m_output, theSignal, theSlot, + connectionSyntax(senderSignature, senderDecl.className, + receiverDecl.className)); m_output << language::eol; } diff --git a/src/tools/uic/cpp/cppwriteinitialization.h b/src/tools/uic/cpp/cppwriteinitialization.h index 0a6ddbb3c8..df06358077 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.h +++ b/src/tools/uic/cpp/cppwriteinitialization.h @@ -37,6 +37,8 @@ #include #include +enum class ConnectionSyntax; + QT_BEGIN_NAMESPACE class Driver; @@ -238,6 +240,10 @@ private: QString writeBrushInitialization(const DomBrush *brush); void addButtonGroup(const DomWidget *node, const QString &varName); void addWizardPage(const QString &pageVarName, const DomWidget *page, const QString &parentWidget); + bool isCustomWidget(const QString &className) const; + ConnectionSyntax connectionSyntax(const QString &senderSignature, + const QString &senderClassName, + const QString &receiverClassName) const; const Uic *m_uic; Driver *m_driver; -- cgit v1.2.3