Неудачное преобразование Qt Qvariantlist в массив javascript - PullRequest
1 голос
/ 20 октября 2011

В настоящее время я создаю приложения в 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 ++, успешно анализирующая файл. он может прочитать его и сохранить в QVariantList. но после этого вернуть результат в javascript myArray еще [undefined]. что-то не так с преобразованием?

Ответы [ 2 ]

2 голосов
/ 28 марта 2013

Просто упростите сторону 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 является ссылкой, а не указателем.

0 голосов
/ 20 октября 2011

Сам этого не делал, так что я просто размышляю вслух. Но я отмечаю, что вы возвращаете указатель на QVariantList ... который выглядит подозрительно. (Также: если вы new, то кто будет делать delete?)

Вы пытались вернуть его по значению?

...