PropertCache: Don't pass Q_GADGET value types as integers

We need to check for the IsGadget flag there.

Fixes: QTBUG-73734
Change-Id: Ic4afd4215e6ed346bc40794d85397f0f262715e2
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
Ulf Hermann 2019-02-12 15:22:19 +01:00
parent dbc811e164
commit 9343fbc478
3 changed files with 53 additions and 2 deletions

View File

@ -929,8 +929,8 @@ static bool passTypeAsInt(int type)
if (type < int(QMetaType::User)) if (type < int(QMetaType::User))
return false; return false;
// Pointers to QObjects and QGadgets can be handled as they are. // Pointers to QObjects and QGadgets, and QGadgets themselves can be handled as they are.
if (flags & (QMetaType::PointerToQObject | QMetaType::PointerToGadget)) if (flags & (QMetaType::PointerToQObject | QMetaType::PointerToGadget | QMetaType::IsGadget))
return false; return false;
// If it wasn't declared as metatype, better don't touch it. // If it wasn't declared as metatype, better don't touch it.

View File

@ -0,0 +1,12 @@
import QtQml 2.2
QtObject {
property var result;
property Connections connections: Connections {
target: emitter
onEmitGadget: function(gadget) {
result = gadget.someProperty;
}
}
}

View File

@ -50,6 +50,7 @@ private slots:
void signalHandlers(); void signalHandlers();
void signalHandlersDerived(); void signalHandlersDerived();
void passForeignEnums(); void passForeignEnums();
void passQGadget();
void metaObjectSize_data(); void metaObjectSize_data();
void metaObjectSize(); void metaObjectSize();
void metaObjectChecksum(); void metaObjectChecksum();
@ -338,6 +339,44 @@ void tst_qqmlpropertycache::passForeignEnums()
Q_DECLARE_METATYPE(MyEnum::Option1) Q_DECLARE_METATYPE(MyEnum::Option1)
QT_BEGIN_NAMESPACE
class SimpleGadget
{
Q_GADGET
Q_PROPERTY(bool someProperty READ someProperty)
public:
bool someProperty() const { return true; }
};
// Avoids NeedsCreation and NeedsDestruction flags
Q_DECLARE_TYPEINFO(SimpleGadget, Q_PRIMITIVE_TYPE);
QT_END_NAMESPACE
class GadgetEmitter : public QObject
{
Q_OBJECT
signals:
void emitGadget(SimpleGadget);
};
void tst_qqmlpropertycache::passQGadget()
{
qRegisterMetaType<SimpleGadget>();
GadgetEmitter emitter;
engine.rootContext()->setContextProperty("emitter", &emitter);
QQmlComponent component(&engine, testFile("passQGadget.qml"));
QVERIFY(component.isReady());
QScopedPointer<QObject> obj(component.create(engine.rootContext()));
QVariant before = obj->property("result");
QVERIFY(before.isNull());
emit emitter.emitGadget(SimpleGadget());
QVariant after = obj->property("result");
QCOMPARE(QMetaType::Type(after.type()), QMetaType::Bool);
QVERIFY(after.toBool());
}
class TestClass : public QObject class TestClass : public QObject
{ {
Q_OBJECT Q_OBJECT