Qt C++下载XML文件并在textEdit中显示



我在从服务器下载XML文件时遇到问题。有一些代码:

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

并回复完成插槽:

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

我的问题是:当我第一次单击按钮时,xml文件没有显示在textEdit中,但是当我第二次单击按钮时,xml文件正常显示。我该如何解决这个问题?我认为我必须在程序中等待下载的数据,但我不知道该怎么做。

对不起我的英语

问题是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();
}

最新更新