1
 QFile msnLogFile(item->data(Qt::UserRole).toString());
 QDataStream logDataStream;
    if(msnLogFile.exists()){
        msnLogFile.open(QIODevice::ReadOnly);
        logDataStream.setDevice(&msnLogFile);
        QByteArray logBlock;
        logDataStream >> logBlock;
    }

このコードは機能しません。結果の QByte は空です。char* を使用しても同じです。奇妙なことに、同じコードが別のプログラムで機能します。両方の違いを見つけようとしています。これは、int、uint、quint8などを使用すると機能します

4

2 に答える 2

3

msnLogFileが以前にQDataStreamを使用して作成されていなかったとすると(作成された場合は、この回答を完全に無視します)、>>演算子は使用しません。

その理由は、QDataStreamが文字列を書き込んでいるときに、出力バイトの前に文字列の長さを追加するためです。これにより、別のQDataStreamが正しい長さでそれを読み戻し、同じ結果を得ることができます。したがって、int、qint8などが正しく機能するのはなぜですか。付加されたサイズはなく、生データです。

msnLogFileの内容が厳密にテキストである場合、QIODevice::Textフラグを渡してQIODevice::readLine() またはQIODevice :: readAll()を開いて使用する必要がありますが、バイナリデータの場合はQDataStreamを使用する必要があります。 :readRawData()を実行し、正しいサイズで正しい順序でデータを読み取ります。

于 2010-04-22T20:28:33.207 に答える
1

プロトコルのバージョンを指定していないためだと思います。setVersion()異なるバージョンの Qt を使用している可能性のある複数のマシンがすべて同じプロトコル バージョンを使用していることを確認するために呼び出す必要があります。

于 2010-04-22T19:54:58.847 に答える