summaryrefslogtreecommitdiffstats
path: root/src/tools/uic/cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-04-19 11:23:55 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-05-04 08:12:33 +0200
commitda3cb1deb6c752f8e4c05434e3451432e5d787ba (patch)
treec2f7992eeee39617102cb864f798ebd7c06ec5f0 /src/tools/uic/cpp
parent8231614661e1eecaabcf33d1e332809556e86089 (diff)
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 <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/tools/uic/cpp')
-rw-r--r--src/tools/uic/cpp/cppwriteincludes.cpp3
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.cpp33
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.h6
3 files changed, 39 insertions, 3 deletions
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 <qstack.h>
#include <qtextstream.h>
+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;