c++ - Qt Qvariantlist转换成javascript数组不成功

标签 c++ qt qml qtscript

我目前在 Meego 中大部分使用 QML 和 JS 创建应用程序。现在我偶然发现了一个问题。

我想从 javascript 调用一个 C++ 函数来读取文本文件,解析它,然后返回一个解析结果数组。 所以我创建了一个名为 parse() 的 Q_INVOKABLE 函数并通过 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++ 解析函数成功解析了文件。它可以读取它并将它保存到 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 使用 QVariant::fromValue(T) 所以广泛使用它。

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

关于c++ - Qt Qvariantlist转换成javascript数组不成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7834188/

相关文章:

android - QML导入错误

c++ - 在 Qt 中更改标签图像

c++ - 如何在for循环中使用指针来统计字符?

c++ - 从文件中读取的数字查找平均值和标准偏差

qt - 在 Qt 中,什么时候应该使用 RESOURCES、DISTFILES 和 OTHER_FILES

python - 从 QML 访问 Python QObject 无法在第二次调用时转换

qt - QML 中的 Double 现在完全等于 Real 吗?

qt - QML MouseArea onEntered hideEnabled 不起作用

c++ - 解包类范围?

c++ - 使用 ranges-v3 实现 DFS