diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2020-03-27 18:36:11 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2020-04-08 11:26:39 +0200 |
commit | 5422fb79486a1818d6355d75f019fe63120a43d0 (patch) | |
tree | a4b95a12034097d2941983cb216dff64081321f5 /src/tools/moc | |
parent | 0bfbe10ff20f271cff0c0af6ca1fb1894bb48d60 (diff) |
Allow declaring QProperty<> based Q_PROPERTYies with a notify signal
This requires mostly making moc a bit more permissive, which has the
advantage that it also simplifies the code a little bit.
The newly added test case demonstrates how to connect such a property
with a change signal.
One test case needed to be changed regarding the callback as the
publicProperty member now has a (permanent) observer and therefore
re-assigning the binding will re-evaluate it as the value might have
changed.
Change-Id: Ia7edcec432de830bdd4e07d943c5d4550c175ca4
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'src/tools/moc')
-rw-r--r-- | src/tools/moc/moc.cpp | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 56db54b457..9825e2244f 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -1266,16 +1266,6 @@ void Moc::createPropertyDef(PropertyDef &propDef) next(); propDef.name = lexem(); - // Could be Q_PROPERTY(type field) and later QProperty<int> field; -- to be resolved later. - if (lookup() == RPAREN) { - propDef.isQProperty = true; - propDef.designable = propDef.scriptable = propDef.stored = "true"; - propDef.user = "false"; - propDef.read = propDef.name + ".value"; - propDef.write = propDef.name + ".setValue"; - return; - } - while (test(IDENTIFIER)) { const QByteArray l = lexem(); if (l[0] == 'C' && l == "CONSTANT") { @@ -1806,31 +1796,32 @@ void Moc::checkProperties(ClassDef *cdef) QSet<QByteArray> definedProperties; for (int i = 0; i < cdef->propertyList.count(); ++i) { PropertyDef &p = cdef->propertyList[i]; - if (p.read.isEmpty() && p.member.isEmpty()) - continue; if (definedProperties.contains(p.name)) { QByteArray msg = "The property '" + p.name + "' is defined multiple times in class " + cdef->classname + "."; warning(msg.constData()); } definedProperties.insert(p.name); - const auto skipProperty = [&](const QByteArray &msg) { - const int rewind = index; - if (p.location >= 0) - index = p.location; - warning(msg.constData()); - index = rewind; - cdef->propertyList.removeAt(i); - --i; - }; - - if (p.isQProperty) { + if (p.read.isEmpty() && p.member.isEmpty()) { if (!cdef->qPropertyMembers.contains(p.name)) { + const int rewind = index; + if (p.location >= 0) + index = p.location; QByteArray msg = "Property declaration " + p.name + " has neither an associated QProperty<> member" - ", nor a READ accessor function nor an associated MEMBER variable. The property will be invalid."; - skipProperty(msg); - break; + ", nor a READ accessor function nor an associated MEMBER variable. The property will be invalid."; + warning(msg.constData()); + index = rewind; + if (p.write.isEmpty()) { + cdef->propertyList.removeAt(i); + --i; + } + continue; } + p.read = p.name + ".value"; + p.write = p.name + ".setValue"; + p.isQProperty = true; + p.designable = p.scriptable = p.stored = "true"; + p.user = "false"; } for (int j = 0; j < cdef->publicList.count(); ++j) { |