2017-04-13 9 views
0

サーバーからXMLファイルをダウンロードする際に問題があります。いくつかのコードがあります:XMLファイルをダウンロードしてテキストエディットに表示するQt C++

QByteArray data; 
... 
void DownloadXML::on_pushButton_clicked() 
{ 
    QUrl address = "abc.com/file.xml" 

    QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
    connect(manager, SIGNAL(finished(QNetworkReply*)), 
    this, SLOT(replyFinished(QNetworkReply*))); 

    QNetworkRequest request; 
    request.setUrl(address); 
    manager->get(request); 

    ui->textEdit->insertPlainText(QString::fromAscii(data)); 
} 

とスロットをreplyFinished:私はボタンを初めてクリックすると、XMLファイルはテキストエディットに表示されませんが、私はボタンもう一度クリックすると:

void DownloadXML::replyFinished(QNetworkReply *reply){ 
    reply->deleteLater(); 
    data = reply->readAll(); 
} 

私の問題はあります、xmlファイルが正常に表示されます。どのように私はそれを修正することができます?私はプログラムでダウンロードしたデータを待たなければならないと思いますが、どうやってそれを行うのか分かりません。

Btw。私の英語には申し訳ありません

答えて

0

問題は、マネージャの完了信号が送信される前にui->textEdit->insertPlainText(QString::fromAscii(data));が呼び出されることです。これにその行と

変更あなたのスロットを削除します。

void DownloadXML::replyFinished(QNetworkReply *reply){ 
    reply->deleteLater(); 
    data = reply->readAll(); 
    ui->textEdit->insertPlainText(QString::fromAscii(data)); 
} 

また、あなたは信号が呼び出されるまで待機するQEventLoopを使用することができます。

void DownloadXML::on_pushButton_clicked() 
{ 
    QUrl address = "abc.com/file.xml" 

    QNetworkAccessManager *manager = new QNetworkAccessManager(this); 

    QNetworkRequest request; 
    request.setUrl(address); 
    QNetworkReply *reply = manager->get(request); 

    QEventLoop loop; 
    connect(manager, SIGNAL(finished()), &loop, SLOT(quit())); 
    loop.exec(); 

    if(reply->error() == QNetworkReply::NoError) 
    { 
     //No Error 
     reply->deleteLater(); 
     data = reply->readAll(); 
     ui->textEdit->insertPlainText(QString::fromAscii(data)); 
    } 
    loop.quit(); 
} 
+0

'on_pushButton_clicked()'でこれを行う方法はありますか?私はこのXMLファイルで何かしたいです。 – Seba

+0

@Seba確かに、私の編集を参照してください。スロットは不要です。私は私のプロジェクトの多くでこの正確な設定を使用します。 – mrg95

+1

ああそうだ。ご助力ありがとうございます! – Seba

関連する問題