-
Bug
-
Resolution: Out of scope
-
P3: Somewhat important
-
None
-
4.8.2
-
None
-
windows, linux, mac
I know that the issue QTBUG-19741 is marked as fixed in 4.8 but I don't believe this issue has been fixed, at least not in all cases.
I have 4.8.2 and the following setup:
namespace one {
namespace two {
class MyEnum {
Q_GADGET
Q_ENUMS(Type)
public:
enum Type {
Default = 1,
NonDefault = 2
};
private:
MyEnum() {};
~MyEnum(){};
};
class EnumUser : pubic QObject {
Q_OBJECT
public:
Q_INVOKABLE void doStuff(one::two::MyEnum::Type enumValue);
};
QML_DECLARE_TYPE(one::two::EnumUser)
// so that the enum can be stuffed into QVariant
Q_DECLARE_METATYPE(one::two::MyEnum::Type)
// somewhere during initialization types are registered using
// so that the enum can be used with queued connections
qRegisterMetaType<one::two::MyEnum::Type>();
// so that it can be addressed from Qml as "MyEnum."
qmlRegisterUncreatableType<one::two::MyEnum>("one.two", 1, 0, "MyEnum", "Uncreatable type");
qmlRegisterType<one::two::EnumUser>("one.two", 1, 0, "EnumUser);
// then in QML
import one.two;
EnumUser {
onStuffHappened: doStuff(EnumUser.NonDefault);
}
}
}
In this configuration doStuff() always get invoked with 0 as the parameter, no matter what I pass to it. There are no errors or warnings on the command line when this happens.
I know that MyEnum is registered correctly since properties I have properties of this type and they work as expected if I assign values to them or read them. But Q_INVOKABLE methods don't work.
The only work around I found is to add a private method with the same name but with an int parameter in addition to the one with enum parameter: doStuff(int), and cast the int to the enum. Then QML calls this method with an int representing correct enum value.:
// added to the EnumUser class private: Q_INVOKABLE void doStuff(int); void EnumUser::doStuff(int value) { doStuff(static_cast<one::two::MyEnum::Type>(value)); }