diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2023-08-11 10:45:51 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2024-01-26 14:51:35 +0100 |
commit | ac001bef798b79f4932d7ca8f4fb812159ba75ca (patch) | |
tree | 1cf783aa9235c4cf72e64d3775957ee6d621870c /tests/auto/corelib/kernel/qmetaproperty | |
parent | 941afac108aded21ea50caeec0b72291fcad7d59 (diff) |
moc/QMetaProperty: Remove limitation on non-own-class notify signals
The moc generated code does a sanity check that NOTIFY signals actually
exist in the parent class when they cannot be found in the class moc
currently runs on.
The logic there was however too simplistic, and couldn't deal with
signals taking a parameter.
Fix this, and take the opportunity to use a proper static_assert instead
of generating a "normal" compile error.
We do not do any checks for the presence of QPrivateSignal, as the whole
point of QPrivateSignal is that it should be private (and not e.g.
protected).
Moreover, we adjust QMetaProperty::notifySignalIndex to take
single-argument notify methods into consideration as well when
encontering an unresolved notify index.
Fixes: QTBUG-115989
Pick-to: 6.7
Change-Id: I8a056a15777f3132691e207b4b9ab6c2c9b2126d
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tests/auto/corelib/kernel/qmetaproperty')
-rw-r--r-- | tests/auto/corelib/kernel/qmetaproperty/tst_qmetaproperty.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/tests/auto/corelib/kernel/qmetaproperty/tst_qmetaproperty.cpp b/tests/auto/corelib/kernel/qmetaproperty/tst_qmetaproperty.cpp index f459068bef..64f946f430 100644 --- a/tests/auto/corelib/kernel/qmetaproperty/tst_qmetaproperty.cpp +++ b/tests/auto/corelib/kernel/qmetaproperty/tst_qmetaproperty.cpp @@ -22,7 +22,14 @@ struct CustomType Q_DECLARE_METATYPE(CustomType) -class tst_QMetaProperty : public QObject +class Base : public QObject +{ + Q_OBJECT +signals: + void baseSignal(int); +}; + +class tst_QMetaProperty : public Base { Q_OBJECT Q_PROPERTY(EnumType value WRITE setValue READ getValue) @@ -33,6 +40,7 @@ class tst_QMetaProperty : public QObject Q_PROPERTY(int value10 READ value10 FINAL) Q_PROPERTY(QMap<int, int> map MEMBER map) Q_PROPERTY(CustomType custom MEMBER custom) + Q_PROPERTY(int propWithInheritedSig READ propWithInheritedSig NOTIFY baseSignal) private slots: void hasStdCppSet(); @@ -43,6 +51,7 @@ private slots: void mapProperty(); void conversion(); void enumsFlags(); + void notifySignalIndex(); public: enum EnumType { EnumType1 }; @@ -57,6 +66,8 @@ public: int value9() const { return 1; } int value10() const { return 1; } + int propWithInheritedSig() const { return 0; } + QString value7; QMap<int, int> map; CustomType custom; @@ -274,5 +285,20 @@ void tst_QMetaProperty::enumsFlags() QCOMPARE(t.flagProperty(), EnumFlagsTester::flag2); } + +void tst_QMetaProperty::notifySignalIndex() +{ + auto mo = this->metaObject(); + auto propIndex = mo->indexOfProperty("propWithInheritedSig"); + auto propWithInheritedSig = mo->property(propIndex); + QVERIFY(propWithInheritedSig.isValid()); + QVERIFY(propWithInheritedSig.hasNotifySignal()); + QVERIFY(propWithInheritedSig.notifySignalIndex() != -1); + QMetaMethod notifySignal = propWithInheritedSig.notifySignal(); + QVERIFY(notifySignal.isValid()); + QCOMPARE(notifySignal.name(), "baseSignal"); + QCOMPARE(notifySignal.parameterCount(), 1); +} + QTEST_MAIN(tst_QMetaProperty) #include "tst_qmetaproperty.moc" |