From ae7e701074be97130aa45f780e2456981850b432 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 5 May 2020 07:56:29 +0200 Subject: 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 --- src/tools/uic/cpp/cppwriteinitialization.cpp | 27 ++++++++++++++++++--------- src/tools/uic/cpp/cppwriteinitialization.h | 8 +++++--- 2 files changed, 23 insertions(+), 12 deletions(-) (limited to 'src/tools/uic') 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; } diff --git a/src/tools/uic/cpp/cppwriteinitialization.h b/src/tools/uic/cpp/cppwriteinitialization.h index df06358077..ed8f29d15c 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.h +++ b/src/tools/uic/cpp/cppwriteinitialization.h @@ -38,6 +38,7 @@ #include enum class ConnectionSyntax; +namespace language { struct SignalSlot; } QT_BEGIN_NAMESPACE @@ -241,9 +242,8 @@ private: 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; + ConnectionSyntax connectionSyntax(const language::SignalSlot &sender, + const language::SignalSlot &receiver) const; const Uic *m_uic; Driver *m_driver; @@ -305,6 +305,8 @@ private: QString m_generatedClass; QString m_mainFormVarName; + QStringList m_customSlots; + QStringList m_customSignals; bool m_mainFormUsedInRetranslateUi = false; QString m_delayedInitialization; -- cgit v1.2.3