i在C 类中具有Q_INVOKABLE
方法,我希望此方法在同一方法中返回QML,而无需使用信号。
我的mehtod被声明为:
Q_INVOKABLE void select_company(int index,QString *out);
定义为:
void Companies::select_company(int index,QString *out) {
out->clear();
out->append("out string");
}
当我从qml中的JavaScript函数中调用它:
var out_str;
data_model.select_company(index,out_str);
console.log(out_str);
我在控制台上获得此输出:
qrc:/CompaniesList.qml:56: Error: Unknown method parameter type: QString*
是否可以将(JavaScript)变量从QML传递到C 方法,并且具有C 来修改此变量?如果无法通过通过指针或参考来做到这一点,那么(最简单的)其他方法是什么?
到目前为止,我发现的唯一方法是传递QJSValue
并将属性设置为这样,例如:
声明:
Q_INVOKABLE void select_company(int index,QJSValue out);
定义:
void Companies::select_company(int index,QJSValue out) {
out.setProperty("company_name","Acme, Inc.");
out.setProperty("identity_id",29673);
}
qml:
var retval={};
data_model.select_company(index,retval);
console.log(retval.company_name);
console.log(retval.identity_id);
找出调用C 方法并立即返回一些数据的所有可能方法很有趣。
如果要"通过参考"并在C 侧编辑JavaScript对象,则QJSValue
是要走的方法。开箱即用的C 类型没有直接的支持,特定类型有一些转换。
通过指针传递仅适用于QObject
派生对象。
请记住,QJSValue
只有在Object
(也许也是数组)时才能起作用。它将对其他类型不起作用,因为将复制对象,并且将在副本上进行更改,并且不会在原始对象上反映。
不是我介意的,而是什么阻止您宣布类似的内容:
Q_INVOKABLE QString getSomeValueFromCPP(int index) {
...
return value;
}
,然后在qml中:
var val = getSomeValueFromCPP(index);
对于更复杂的结构,如果您需要返回某些副词,我建议您看看q_gadget方法,这很棒。
P.S。由于有很多评论,因此我决定在这里而不是在评论中进行小型更新。
首先,我想对所有DDRIVER评论都有信用,因为它们都是完全正确的。
绝对要做的第一件事是查看设计,因为任何QML/C 交互都没有真正考虑到最初问题中提到的方法。其次是,区分基于Qobject的类别的所有权和通过价值实例的所有权非常重要。如果您将使用基于QObject的分类(无论QML或C 所有权),则应清楚地决定谁将成为这些对象的创建者。还要注意,在没有明确父母的C 代码中创建的任何QoBjects并将其传递到QML引擎的某个时候,垃圾收集器将被销毁。多数民众赞成在非常灵活且强大的方法允许创建非常有效的数据结构,例如基于QObject的模型,具有完整的属性支持等。
为了避免并发症,QT提供了另一种处理结构化数据的方式,以防您只需要将值传递到C 中的QML(我了解一个问题,这是您要实现的目标)。那是q_gadgets。多数民众赞成在将元数据附加到结构上的Q_Object类似的方法,使它们具有Q_properties,完整的Metatype信息(因此Qobject_cast将有效,例如任何Qvariant转换),但不包括插槽/信号。
主要区别在于,您被允许进行逐个传递调用,在那里您不应该(某种程度上)关于所有权和现场周期。如果Q_GADGET返回类型QML的简单单词将获得初始对象的副本并将其销毁,然后不需要。
正如Ddriver回答中提到的那样,可以模拟参考参数,然后从QML调用C 方法,但是我有疑问是从我的角度看不到的,这是正确的方法。
。在您的问题中,您询问某些技术,但要点 - 正确的答案是查看设计,因为您试图做的不是应该如何工作。同样,正如Ddriver所述,您应该以某种方式提供" Core"的C 部分,它可以是基于QObject的模型/独立对象或基于q_gadget的基于值的实例,而QML零件是"表示"逻辑,IT是"表示"。不应用于创建/持有C 要修改的东西,尤其是通过参考。
ragaring nulik注释 - 典型的用例是返回 q_gadget的类,从C 到QML。您不应该尝试通过参考来传递这些值,以进行C 代码中的修改。