1

私は xml ファイルから読み込んでおり、データを double に解析しようとしています。データを読み取り、アプリケーションの出力に適切な文字列を表示しますが、文字列から double に変換しません。これは、変換を行うコードのセクションです。

if ( !(imgDur = QString ( xmlReader->readElementText() ).toDouble()) ){
        imgDur = 10;
}

これは数値 0 を返します。エラーはゼロで、コードはコンパイルされます。なぜこれがうまくいかないのですか?ありがとうございました。

XML ファイルを読み取るループ全体

//Parse the XML until we reach end of it
    while(!xmlReader->atEnd() && !xmlReader->hasError()) {
            // Read next element
            QXmlStreamReader::TokenType token = xmlReader->readNext();
            //If token is just StartDocument - go to next
            if(token == QXmlStreamReader::StartDocument) {
                    continue;
            }
            //If token is StartElement - read it
            if(token == QXmlStreamReader::StartElement) {

                    if(xmlReader->name() == "time_delay") {
                        qWarning() << xmlReader->readElementText(); // OUTPUTS 15

                        if ( !(imgDur = QString (xmlReader->readElementText()).toDouble()  ) ){
                            qWarning() << "AS AN DOUBLE" << imgDur;  // OUTPUTS 0
                            imgDur = 10;
                        }

                    }

                    if(xmlReader->name() == "value") {
                        qWarning() << xmlReader->readElementText(); // OUTPUTS 8
                    }

            }
    }
4

3 に答える 3

3

コードの主な問題はこのqWarning() << xmlReader->readElementText(); // OUTPUTS 15行でした。QXmlReader::readElementText()xmlReaderポインタをテキストノードの最後に移動するため、トークンの代わりにreadNext()が返されます。したがって、基本的にはそのようなことを行います(実際の実装では、デフォルトの動作をチェックし、QXmlStreamReaderの内部データ/ステータス/トークンなどを設定するため、はるかに複雑であることに注意してください):EndElementAQXmlStreamReader::CharactersreadElementText

QString retval;
if(xmlReader->readNext() == QXmlStreamReader::Characters)
{
    retval = xmlReader->text().toString();
    xmlReader->readNext();
}
return retval;

xmlReader->readElementText();したがって、現在のトークンはQXmlStreamReader::StartElementもうないため、基本的にsecondは常に空のQStringを返します。

于 2012-09-13T08:54:50.087 に答える
2

まず、imgDurがフロートであると仮定します。次に、ifステートメントを次のように変更します

QString tempText = xmlReader->readElementText();

if (imgDur != tempText.toDouble()) {

2つの問題がありました。条件が真理値であり、QStringをQStringに冗長に変換しました。

于 2012-09-13T01:25:19.170 に答える
1

質問のコメントで、変換しようとしている文字列に含まれる数値が 15 であると述べています。常に 15 になりますか? その場合は、QString::toInt代わりに、その関数の戻り値を格納する整数型と共に使用する必要があります。

より動的な場合はbool*、toDouble のパラメーターを利用して、コードを次のように変更することをお勧めします。

bool ok = false;
imgDur = xmlReader->readElementText().toDouble(&ok);
if (!ok) {
    imgDur = xmlReader->readElementText().toInt(&ok);
    if (!ok) {
        imgDur = 10.0;
    }
}
于 2012-09-13T01:44:54.843 に答える