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/cppwriteinitialization.cpp | 33 +++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'src/tools/uic/cpp/cppwriteinitialization.cpp') diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index 2a9efaac956..585313f5ded 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; } -- cgit v1.2.3