2011-10-20 19 views
1

私は現在、ほとんどの部分でQMLとJSを使用してMeegoでアプリケーションを作成しています。今問題に遭遇しました。Qt QvariantlistをJavaScript配列に変換できません

javascriptから私は、テキストファイルを読み込んで解析し、解析結果の配列を返すC++関数を呼び出す必要があります。 ので、私は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; 
} 

で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]) 
    } 
} 

、ここを通してそれを呼び出します。 私はそれを実行しようとすると、それはこの

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に返されます[未定義]。 変換に何か問題がありますか?

答えて

0

私自身はこれをやっていないので、大声で考えています。しかし、私はQVariantListへのポインタを返すことに注意しています...疑わしいと思われる。 (もし:あなたがnewなら、誰がdeleteをやるでしょうか)

値で返そうとしましたか?

+0

私が値で返した場合、NULLを返します。いくつかの条件分岐では実行できません – Fugogugo

+0

さて、nullと未定義を返す方法を区別するにはどうすればよいですか?私が言うように、QtScriptは実際に使用していませんが、これらの関数からC++のNULLなどを返すのではなく、http://doc.qt.nokia.com/latest/qscriptvalue .html ... Q_INVOKABLEが何をするかによって異なりますが、あなたが考えるものがあれば驚くでしょう。 – HostileFork

+0

QVariantを返します。エラーが発生した場合はnullになり、成功した場合は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はQListがその内にラップされている場合でも、QVariantを見なければならない、覚えて、とQtはとても広く、それを使用QVariant::fromValue(T)を使用してQVariantにそのベースタイプのほとんどを変換することができます。

OhおよびBTW a QVariantは、ポインタではない参照です。

関連する問題