summaryrefslogtreecommitdiffstats
path: root/src/tools/uic/shared
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/shared
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/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);