【发布时间】:2020-09-23 19:32:13
【问题描述】:
我花了一些时间,但最终我设法将 JavaScript/QML POJO 转换为不是从 QObject 派生的自定义对象。
我认为通过一个工作示例更容易理解我的问题。所以让我们从这个开始:
struct SomeType { /* Just a plain struct that does not derive from QObject! */ };
SomeType FooFactory::convertQMLToSomeType(const QJSValue& val) {
SomeType result = /*... some kind of conversion takes place here ... */
return result;
}
void FooFactory::registerTypes(QQmlEngine& engine) {
QMetaType::registerConverter<QJSValue, SomeType>(FooFactory::convertQMLToSomeType);
}
它的作用是注册一个转换器,用于将QSValue 转换为SomeType。所以现在,每当我在 QML 中做这样的事情时
my_prop = { "foo": "some plain javascript object" };
假设 my_prop 在相应的 C++ 类中是这样暴露的:
Q_PROPERTY(SomeType my_prop MEMBER _myProp);
SomeType _myProp;
// Somewhere else outside the class, this is needed for registering the converter
Q_DECLARE_METATYPE(SomeType);
字符串被隐式转换为SomeType,无需手动操作。
..
太棒了!
但是转换的相反方向呢?我需要 QML 来处理字符串,而不是 QVariant(SomeType) 对象(在处理元系统时,QT 总是在内部使用 QVariant 包装器来存储用户定义的类型)。
我已经尝试过像这样注册一个逆变器:
QMetaType::registerConverter<SomeType, QJSValue>(FooFactory::convertBackToQML);
或者这个
QMetaType::registerConverter<QVariant(SomeType), QJSValue>(FooFactory::convertBackToQML);
但是这些方法都不起作用。我相信第二行很有希望,但由于注册静态元类型的问题,我什至无法编译那行。
那么,我将如何解决这个问题?简短提醒一下,我无法从 QObject 导出 SomeType,是的,我知道这是做这类事情的最常见方法。
有人有想法吗?还是我在叫错树?非常感谢!
【问题讨论】:
-
你的结构可以是 Q_GADGET 而不是 QObject 吗?
-
很遗憾没有。该结构是从与 QT 没有任何联系的封装库中使用的,因此我无法在其中添加这些声明。