1

私は現在、ほとんどの部分で QML と JS を使用して Meego でアプリを作成しています。そして今、私は問題に遭遇しました。

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++ parse 関数がファイルを正常に解析しているように見えます。それを読み取ることができ、QVariantList に保存できます。しかし、結果をjavascript myArrayに返した後も[未定義]です。変換に何か問題がありますか?

4

2 に答える 2

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);
}

そしてそれはうまくいくはずです!

QVarianta がその中にラップされていても、QML は a を見る必要がありQList、Qt はその基本型のほとんどをQVariantusingに変換できるQVariant::fromValue(T)ので、広く使用してください。

ああ、ところでQVariantはポインタではなく参照です。

于 2013-03-27T22:06:46.713 に答える
0

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

値で返してみましたか?

于 2011-10-20T10:18:23.657 に答える