Android 将带有Javascript数组的对象附加到QML ListModel会导致SEGFAULT

Android 将带有Javascript数组的对象附加到QML ListModel会导致SEGFAULT,android,qt,qml,qt5,qtquick2,Android,Qt,Qml,Qt5,Qtquick2,我正在Android上使用QtQuick 我正在尝试将一个带有数组属性的Javascript对象附加到ListModel 我使用LocalStorage存储此数据 我从数据库中找到的对象具有此数组属性,当我尝试将该对象附加到ListModel时,我得到一个SEGFAULT。如果我的对象中没有包含数组,或者实际上数组是空的,那么它将成功地附加到ListModel,并且不会出错 当我从数据库中具体化对象时,我会执行以下操作: var movie = { id: row.id, tit

我正在Android上使用QtQuick

我正在尝试将一个带有数组属性的Javascript对象附加到
ListModel

我使用
LocalStorage
存储此数据

我从数据库中找到的对象具有此数组属性,当我尝试将该对象附加到
ListModel
时,我得到一个SEGFAULT。如果我的对象中没有包含数组,或者实际上数组是空的,那么它将成功地附加到
ListModel
,并且不会出错

当我从数据库中具体化对象时,我会执行以下操作:

var movie = {
    id: row.id,
    title: row.title,
    genres: ['a', 'b', 'c']
}
我正在创建一个Javascript对象,并从
LocalStorage
结果集对象“行”复制属性。为了解决这个问题,我只是硬编码了数组,正如您在上面看到的那样。将此对象附加到
ListModel
时,它会发生故障

如果我完全删除了“流派”属性,或者甚至像[]中那样将其保留为空,则在追加时它将不会出现分段错误:

var movie = {
    id: row.id,
    title: row.title,
    genres: []
}
以下是堆栈跟踪:

0   ListModel::set(int, QV4::Referenced<QV4::Object>, QV8Engine*)   /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x7542b138  
1   ListModel::append(QV4::Referenced<QV4::Object>, QV8Engine*) /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x7542b40a  
2   ListModel::set(int, QV4::Referenced<QV4::Object>, QV8Engine*)   /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x7542b26c  
3   ListModel::append(QV4::Referenced<QV4::Object>, QV8Engine*) /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x7542b40a  
4   QQmlListModel::append(QQmlV4Function*)  /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x7542d21c  
5   QQmlListModel::qt_metacall(QMetaObject::Call, int, void**)  /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x754347ea  
6   QMetaObject::metacall(QObject*, QMetaObject::Call, int, void**) /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Core.so        0x75054416  
7   QV4::QObjectMethod::callInternal(QV4::CallData*)    /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x753ac7c4  
8   QV4::FunctionObject::call(QV4::CallData*)   /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x7537ed5e  
9   QV4::__qmljs_call_property(QV4::ExecutionContext*, QV4::Referenced<QV4::String>, QV4::CallDataRef)  /home/linux/qt/Qt5.2.1/5.2.1/android_armv7/lib/libQt5Qml.so     0x75380962  
10  ??          0x7727c2e8  
11  ??          0x7727c2e8  

那么为什么会失败呢?

这会失败,因为不支持将非对象值(如文字字符串或整数)存储为数组中的属性值

可以存储数组属性,但前提是数组中的每个项都是对象,而不是基元或字符串文字

这项工作:

var movie = {
    id: row.id,
    title: row.title,
    genres: [{name: 'a'}, {name: 'b'}, {name: 'c'}]
}

你能提供坠机的线索吗?如果你在调试模式下启动应用程序,你应该能够在Qt创建者中看到C++ StActTrace。
} else if (propertyValue->asArrayObject()) {
    a = propertyValue;
    const ListLayout::Role &r = m_layout->getRoleOrCreate(propertyName, ListLayout::Role::List);
    if (r.type == ListLayout::Role::List) {
        ListModel *subModel = new ListModel(r.subLayout, 0, -1);

        int arrayLength = a->arrayLength();
        for (int j=0 ; j < arrayLength ; ++j) {
            o = a->getIndexed(j);
            subModel->append(o, eng); <= This leads to the nested 'set' call above that crashes
        }
var movie = {
    id: row.id,
    title: row.title,
    genres: [{name: 'a'}, {name: 'b'}, {name: 'c'}]
}