diff options
-rw-r--r-- | src/tools/moc/moc.cpp | 43 | ||||
-rw-r--r-- | tests/auto/tools/moc/tst_moc.cpp | 12 |
2 files changed, 26 insertions, 29 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) { diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index b701aa05a3..08dae7f6ca 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -4106,19 +4106,23 @@ void tst_Moc::requiredProperties() class ClassWithQPropertyMembers : public QObject { Q_OBJECT - Q_PROPERTY(int publicProperty) + Q_PROPERTY(int publicProperty NOTIFY publicPropertyChanged) Q_PROPERTY(int privateExposedProperty) public: QProperty<int> publicProperty; QProperty<int> notExposed; +signals: + void publicPropertyChanged(); + protected: QProperty<int> protectedProperty; private: QProperty<int> privateProperty; QProperty<int> privateExposedProperty; + QPropertyMemberChangeHandler<&ClassWithQPropertyMembers::publicProperty, &ClassWithQPropertyMembers::publicPropertyChanged> connector{this}; }; void tst_Moc::qpropertyMembers() @@ -4139,12 +4143,15 @@ void tst_Moc::qpropertyMembers() prop.write(&instance, 42); QCOMPARE(instance.publicProperty.value(), 42); + QSignalSpy publicPropertySpy(&instance, SIGNAL(publicPropertyChanged())); + instance.publicProperty.setValue(100); QCOMPARE(prop.read(&instance).toInt(), 100); + QCOMPARE(publicPropertySpy.count(), 1); QCOMPARE(prop.metaType(), QMetaType(QMetaType::Int)); - QVERIFY(!prop.notifySignal().isValid()); + QVERIFY(prop.notifySignal().isValid()); } @@ -4195,7 +4202,6 @@ void tst_Moc::setQPRopertyBinding() void *argv[] = { &binding }; instance.qt_metacall(QMetaObject::SetQPropertyBinding, prop.propertyIndex(), argv); } - QVERIFY(!bindingCalled); // not yet! QCOMPARE(instance.publicProperty.value(), 42); QVERIFY(bindingCalled); // but now it should've been called :) |