diff options
Diffstat (limited to 'src/tools/uic/shared')
-rw-r--r-- | src/tools/uic/shared/language.cpp | 51 | ||||
-rw-r--r-- | src/tools/uic/shared/language.h | 8 |
2 files changed, 55 insertions, 4 deletions
diff --git a/src/tools/uic/shared/language.cpp b/src/tools/uic/shared/language.cpp index 987d51e30c..a42e7b8461 100644 --- a/src/tools/uic/shared/language.cpp +++ b/src/tools/uic/shared/language.cpp @@ -387,12 +387,57 @@ void _formatStackVariable(QTextStream &str, const char *className, QStringView v } } -void formatConnection(QTextStream &str, const SignalSlot &sender, const SignalSlot &receiver) +// Format a member function for a signal slot connection +static void formatMemberFnPtr(QTextStream &str, const SignalSlot &s, + bool useQOverload = false) +{ + const int parenPos = s.signature.indexOf(QLatin1Char('(')); + Q_ASSERT(parenPos >= 0); + if (useQOverload) { + const auto parameters = s.signature.midRef(parenPos + 1, + s.signature.size() - parenPos - 2); + str << "qOverload<" << parameters << ">("; + } + + const auto functionName = s.signature.leftRef(parenPos); + str << '&' << s.className << "::" << functionName; + + if (useQOverload) + str << ')'; +} + +static void formatMemberFnPtrConnection(QTextStream &str, + const SignalSlot &sender, + const SignalSlot &receiver) +{ + str << "QObject::connect(" << sender.name << ", "; + formatMemberFnPtr(str, sender); + str << ", " << receiver.name << ", "; + formatMemberFnPtr(str, receiver); + str << ')'; +} + +static void formatStringBasedConnection(QTextStream &str, + const SignalSlot &sender, + const SignalSlot &receiver) +{ + str << "QObject::connect(" << sender.name << ", SIGNAL("<< sender.signature + << "), " << receiver.name << ", SLOT(" << receiver.signature << "))"; +} + +void formatConnection(QTextStream &str, const SignalSlot &sender, const SignalSlot &receiver, + ConnectionSyntax connectionSyntax) { switch (language()) { case Language::Cpp: - str << "QObject::connect(" << sender.name << ", SIGNAL("<< sender.signature - << "), " << receiver.name << ", SLOT("<< receiver.signature << "))"; + switch (connectionSyntax) { + case ConnectionSyntax::MemberFunctionPtr: + formatMemberFnPtrConnection(str, sender, receiver); + break; + case ConnectionSyntax::StringBased: + formatStringBasedConnection(str, sender, receiver); + break; + } break; case Language::Python: str << sender.name << '.' diff --git a/src/tools/uic/shared/language.h b/src/tools/uic/shared/language.h index 7b019ec8fc..fcc2d5d258 100644 --- a/src/tools/uic/shared/language.h +++ b/src/tools/uic/shared/language.h @@ -37,11 +37,16 @@ QT_FORWARD_DECLARE_CLASS(QTextStream) enum class Language { Cpp, Python }; +enum class ConnectionSyntax { StringBased, MemberFunctionPtr }; + namespace language { Language language(); void setLanguage(Language); +ConnectionSyntax connectionSyntax(); +void setConnectionSyntax(ConnectionSyntax cs); + extern QString derefPointer; extern QString nullPtr; extern QString operatorNew; @@ -198,7 +203,8 @@ struct SignalSlot QString className; }; -void formatConnection(QTextStream &str, const SignalSlot &sender, const SignalSlot &receiver); +void formatConnection(QTextStream &str, const SignalSlot &sender, const SignalSlot &receiver, + ConnectionSyntax connectionSyntax); QString boolValue(bool v); |