summaryrefslogtreecommitdiffstats
path: root/src/tools/uic/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/uic/shared')
-rw-r--r--src/tools/uic/shared/language.cpp51
-rw-r--r--src/tools/uic/shared/language.h8
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);