summaryrefslogtreecommitdiffstats
path: root/src/tools/uic/cpp/cppwriteinitialization.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-05-05 07:56:29 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-05-05 15:35:51 +0200
commitae7e701074be97130aa45f780e2456981850b432 (patch)
tree1b29ce93065c41d235e719c0b254a34844f6d0e8 /src/tools/uic/cpp/cppwriteinitialization.cpp
parentca33e7a7406f2301883e0f6fdc382e8f8aa58b94 (diff)
uic: Generate string-based connections for custom slots
Qt Designer let's you add custom slots and signals to the main form; they should use string-based connection syntax since the class is not known in setupUI(). Amends da3cb1deb6c752f8e4c05434e3451432e5d787ba. Task-number: QTBUG-76375 Change-Id: I5a3a5630f77c812d48db1cdb7a8658a4d2718228 Reviewed-by: Liang Qi <liang.qi@qt.io>
Diffstat (limited to 'src/tools/uic/cpp/cppwriteinitialization.cpp')
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp
index 585313f5de..f4899657c9 100644
--- a/src/tools/uic/cpp/cppwriteinitialization.cpp
+++ b/src/tools/uic/cpp/cppwriteinitialization.cpp
@@ -470,6 +470,11 @@ void WriteInitialization::acceptUI(DomUI *node)
if (node->hasAttributeConnectslotsbyname())
m_connectSlotsByName = node->attributeConnectslotsbyname();
+ if (auto customSlots = node->elementSlots()) {
+ m_customSlots = customSlots->elementSlot();
+ m_customSignals = customSlots->elementSignal();
+ }
+
acceptLayoutDefault(node->elementLayoutDefault());
acceptLayoutFunction(node->elementLayoutFunction());
@@ -2573,9 +2578,8 @@ 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
+ConnectionSyntax WriteInitialization::connectionSyntax(const language::SignalSlot &sender,
+ const language::SignalSlot &receiver) const
{
if (m_option.forceMemberFnPtrConnectionSyntax)
return ConnectionSyntax::MemberFunctionPtr;
@@ -2584,12 +2588,18 @@ ConnectionSyntax WriteInitialization::connectionSyntax(const QString &senderSign
// 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)) {
+ if (requiresStringSyntax.contains(sender.className)
+ || requiresStringSyntax.contains(receiver.className)) {
+ return ConnectionSyntax::StringBased;
+ }
+
+ if ((sender.name == m_mainFormVarName && m_customSignals.contains(sender.signature))
+ || (receiver.name == m_mainFormVarName && m_customSlots.contains(receiver.signature))) {
return ConnectionSyntax::StringBased;
}
- return senderSignature.endsWith(QLatin1String("()"))
- || (!isCustomWidget(senderClassName) && !isCustomWidget(receiverClassName))
+
+ return sender.signature.endsWith(QLatin1String("()"))
+ || (!isCustomWidget(sender.className) && !isCustomWidget(receiver.className))
? ConnectionSyntax::MemberFunctionPtr : ConnectionSyntax::StringBased;
}
@@ -2617,8 +2627,7 @@ void WriteInitialization::acceptConnection(DomConnection *connection)
m_output << m_indent;
language::formatConnection(m_output, theSignal, theSlot,
- connectionSyntax(senderSignature, senderDecl.className,
- receiverDecl.className));
+ connectionSyntax(theSignal, theSlot));
m_output << language::eol;
}