Qt Qvariantlist转换为javascript数组失败

Qt Qvariantlist conversion into javascript array unsuccessful

本文关键字:数组 失败 javascript Qvariantlist 转换 Qt      更新时间:2023-10-16

我目前在Meego使用QML和JS的大部分部分创建一个应用程序。现在我遇到了一个问题。

从javascript我想调用一个c++函数来读取文本文件,解析它,然后返回解析结果的数组。所以我创建了Q_INVOKABLE函数parse()并通过javascript

进行调用
function parse() {
    var myArray = new Array();
    myArray = parser.parse("/home/user/MyDocs/angklungtext.txt")
    if(myArray === undefined){
        console.log("null found");
    }
    for(var i = 0; i < myArray.length; i++){
        console.log(myArray[i][0] + "," + myArray[i][1])
    }
}

这是c++中的解析函数

QVariantList* QMLParser::parse(QString filename)
{
    qDebug() << "start debugging";
    qDebug() << filename;
    qDebug() << QDir::currentPath();
    QDir dir;
    qDebug()<< dir.absoluteFilePath(filename);
    QFile file(filename);
    if(!file.exists())
    {
        qDebug() << "File: " << file.fileName() << "tidak ditemukan";
        return NULL;
    }
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << "Tidak dapat membuka file" << file.fileName() << "untuk ditulis";
        return NULL;
    }
    QTextStream stream(&file);
    QVariantList* myList = new QList<QVariant>;
    while(!stream.atEnd())
    {
        QString line = stream.readLine();
        qDebug() << line.trimmed();
        QStringList lineList = line.split(":");
        myList->append(lineList);
    }
    file.close();
    return myList;
}

可悲。当我试着运行它时,它会给出如下结果

start debugging 
"/home/user/MyDocs/angklungtext.txt" 
"/home/developer" 
"/home/user/MyDocs/angklungtext.txt" 
"1:1000" 
"4:2000" 
"5:3000" 
"2:4000"
null found
file:///opt/memoryreader/qml/memoryreader/myjs.js:8: TypeError: Result of expression 'myArray' [undefined] is not an object.

看起来像c++的parse函数成功解析了文件。它可以读取它并将它保存到QVariantList中。但在它返回结果到javascript myArray仍然[undefined]。转换有什么问题吗?

就像这样简化c++代码:

QVariant QMLParser::parse(QString filename)
{
    QStringList myList;
    qDebug() << "start debugging";
    qDebug() << filename;
    qDebug() << QDir::currentPath();
    QDir dir;
    qDebug() << dir.absoluteFilePath(filename);
    QFile file(filename);
    if(!file.exists()) {
        qDebug() << "File: " << file.fileName() << "tidak ditemukan";
        return NULL;
    }
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Tidak dapat membuka file" << file.fileName() << "untuk ditulis";
        return NULL;
    }
    QTextStream stream(&file);
    while(!stream.atEnd()) {
        QString line = stream.readLine();
        qDebug() << line.trimmed();
        myList << line.trimmed().split(":");
    }
    file.close();
    return QVariant::fromValue(myList);
}

它应该可以工作!

请记住,QML必须看到QVariant,即使QList被包装在它里面,Qt能够使用QVariant::fromValue(T)将其大多数基本类型转换为QVariant,所以广泛使用它。

哦,顺便说一下,QVariant是引用而不是指针。

我自己没有做过,所以我只是在大声思考。但是我注意到你正在返回一个指向QVariantList的指针…这看起来很可疑。(还有:如果你做new,那么谁来做delete呢?)

你试过按值返回它吗?