2011-10-20 15 views
1

我目前在Meego中使用QML和JS在大部分部分中創建應用程序。現在我偶然發現了一個問題。Qt將Qvariantlist轉換爲javascript數組失敗

從javascript我想調用一個C++函數來讀取文本文件,解析它,然後返回一個解析結果的數組。 所以我創建)稱爲解析(一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仍[未定義]。 轉換有問題嗎?

回答

0

自己沒有這樣做,所以我只是在大聲思考。但我注意到你正在返回一個指向QVariantList的指針......這看起來很可疑。 (另外:如果你new,那麼誰會去做delete?)

你有沒有試過按價值回報它?

+0

如果我通過值返回它,則返回NULL;在某些條件分支上不能完成 – Fugogugo

+0

那麼,如何區分返回null和undefined呢?正如我所說的,我並沒有真正使用過QtScript,但我認爲不是從這些函數返回C++ NULL等,而是應該使用像http://doc.qt.nokia.com/latest/qscriptvalue .html ...取決於Q_INVOKABLE的功能,但如果它符合您的想法,我會感到驚訝。 – HostileFork

+0

我會說,返回一個QVariant。如果遇到錯誤,可以爲空,如果成功,也可以包含QVariantList(按值)。 JS部分應該適當地處理IIRC的轉換。 – Steffen

2

只是簡化了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

哦和BTW一個QVariant是參考不指針。