summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-11-26 08:44:29 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2021-12-07 14:01:58 +0100
commit49a8ab50badb5034ece7670498eb3d06b5155133 (patch)
tree0c602e5f1a0b67251b795317b93ba5ba223b5186
parentc001216eedb66fa68917deacb5ff7ffa096aae07 (diff)
uic: Generate parameters for ambiguous signals
Fixes: PYSIDE-1720 Pick-to: 6.2 Change-Id: I71b77db73471bdec7826bf69c7df521d7686537e Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.cpp9
-rw-r--r--src/tools/uic/customwidgetsinfo.cpp15
-rw-r--r--src/tools/uic/customwidgetsinfo.h3
-rw-r--r--src/tools/uic/shared/language.cpp18
-rw-r--r--src/tools/uic/shared/language.h8
5 files changed, 47 insertions, 6 deletions
diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp
index 4c073987dc..7f5776b5c6 100644
--- a/src/tools/uic/cpp/cppwriteinitialization.cpp
+++ b/src/tools/uic/cpp/cppwriteinitialization.cpp
@@ -27,6 +27,7 @@
****************************************************************************/
#include "cppwriteinitialization.h"
+#include "customwidgetsinfo.h"
#include "driver.h"
#include "ui4.h"
#include "utils.h"
@@ -2640,10 +2641,14 @@ void WriteInitialization::acceptConnection(DomConnection *connection)
return;
}
const QString senderSignature = connection->elementSignal();
+ language::SignalSlotOptions signalOptions;
+ if (m_uic->customWidgetsInfo()->isAmbiguousSignal(senderDecl.className, senderSignature))
+ signalOptions.setFlag(language::SignalSlotOption::Ambiguous);
+
language::SignalSlot theSignal{senderDecl.name, senderSignature,
- senderDecl.className};
+ senderDecl.className, signalOptions};
language::SignalSlot theSlot{receiverDecl.name, connection->elementSlot(),
- receiverDecl.className};
+ receiverDecl.className, {}};
m_output << m_indent;
language::formatConnection(m_output, theSignal, theSlot,
diff --git a/src/tools/uic/customwidgetsinfo.cpp b/src/tools/uic/customwidgetsinfo.cpp
index 347c647acb..4facd2bd74 100644
--- a/src/tools/uic/customwidgetsinfo.cpp
+++ b/src/tools/uic/customwidgetsinfo.cpp
@@ -101,6 +101,21 @@ bool CustomWidgetsInfo::isCustomWidgetContainer(const QString &className) const
return false;
}
+// Is it ambiguous, resulting in different signals for Python
+// "QAbstractButton::clicked(checked=false)"
+bool CustomWidgetsInfo::isAmbiguousSignal(const QString &className,
+ const QString &signalSignature) const
+{
+ if (signalSignature.startsWith(u"triggered") && extends(className, "QAction"))
+ return true;
+ if (signalSignature.startsWith(u"clicked(")
+ && extendsOneOf(className, {u"QCommandLinkButton"_qs, u"QCheckBox"_qs,
+ u"QPushButton"_qs, u"QRadioButton"_qs, u"QToolButton"_qs})) {
+ return true;
+ }
+ return false;
+}
+
QString CustomWidgetsInfo::realClassName(const QString &className) const
{
if (className == QLatin1String("Line"))
diff --git a/src/tools/uic/customwidgetsinfo.h b/src/tools/uic/customwidgetsinfo.h
index 82b9882bef..23e5bdd14a 100644
--- a/src/tools/uic/customwidgetsinfo.h
+++ b/src/tools/uic/customwidgetsinfo.h
@@ -61,6 +61,9 @@ public:
bool isCustomWidgetContainer(const QString &className) const;
+ bool isAmbiguousSignal(const QString &className,
+ const QString &signalSignature) const;
+
private:
using NameCustomWidgetMap = QMap<QString, DomCustomWidget*>;
NameCustomWidgetMap m_customWidgets;
diff --git a/src/tools/uic/shared/language.cpp b/src/tools/uic/shared/language.cpp
index 2f2ae3ebc6..fc1395d403 100644
--- a/src/tools/uic/shared/language.cpp
+++ b/src/tools/uic/shared/language.cpp
@@ -456,12 +456,22 @@ void formatConnection(QTextStream &str, const SignalSlot &sender, const SignalSl
break;
}
break;
- case Language::Python:
- str << sender.name << '.'
- << QStringView{sender.signature}.left(sender.signature.indexOf(QLatin1Char('(')))
- << ".connect(" << receiver.name << '.'
+ case Language::Python: {
+ const auto paren = sender.signature.indexOf(u'(');
+ auto senderSignature = QStringView{sender.signature};
+ str << sender.name << '.' << senderSignature.left(paren);
+ // Signals like "QAbstractButton::clicked(checked=false)" require
+ // the parameter if it is used.
+ if (sender.options.testFlag(SignalSlotOption::Ambiguous)) {
+ const QStringView parameters =
+ senderSignature.mid(paren + 1, senderSignature.size() - paren - 2);
+ if (!parameters.isEmpty() && !parameters.contains(u','))
+ str << "[\"" << parameters << "\"]";
+ }
+ str << ".connect(" << receiver.name << '.'
<< QStringView{receiver.signature}.left(receiver.signature.indexOf(QLatin1Char('(')))
<< ')';
+ }
break;
}
}
diff --git a/src/tools/uic/shared/language.h b/src/tools/uic/shared/language.h
index 918f25e46a..93fd0c63be 100644
--- a/src/tools/uic/shared/language.h
+++ b/src/tools/uic/shared/language.h
@@ -198,11 +198,19 @@ inline QTextStream &operator<<(QTextStream &str, const _stackVariable<withInitPa
using stackVariable = _stackVariable<false>;
using stackVariableWithInitParameters = _stackVariable<true>;
+enum class SignalSlotOption
+{
+ Ambiguous = 0x1
+};
+
+Q_DECLARE_FLAGS(SignalSlotOptions, SignalSlotOption)
+
struct SignalSlot
{
QString name;
QString signature;
QString className;
+ SignalSlotOptions options;
};
void formatConnection(QTextStream &str, const SignalSlot &sender, const SignalSlot &receiver,