Qt的简单版本检查器

时间:2014-08-25 21:55:54

标签: c++ qt oop signals slot

我正在尝试在下面实现一个简单的版本检查器。 我得到一个零错误代码读取文件,但文件 内容显示空白。您可以通过浏览器访问该文件, 权限还可以。

void check_version()
 {
  QNetworkAccessManager *nam = new QNetworkAccessManager();
  QUrl data_url("http://www.example.com/version.txt");
  QNetworkRequest req(data_url);
  QNetworkReply *reply = nam->get(req);
  QByteArray data = reply->readAll() ;
  QString s1(data);
  int err = reply->error();
  QString s2 = QString::number(err);
  delete reply;
  delete nam;

  QMessageBox::critical(0, "",s1+" "+s2,QMessageBox::Cancel);

}

我收集的问题是我需要等待读取直到get完成,所以我需要一个信号和一个插槽:信号告诉插槽读取数据。

伪代码:

QObject::connect(&rep, SIGNAL( rep is finished ),
QByteArray newver , SLOT(  reply->readAll()  ));

如何为我的任务设置信号/插槽?

1 个答案:

答案 0 :(得分:0)

你是对的,你必须等到get()“完成”才能通过调用readAll()获得整个回复。 按照一个工作示例开始:

// ...
QNetworkAccessManager *nam = new QNetworkAccessManager();
QUrl data_url("http://www.example.com/version.txt");
QNetworkReply* reply = nam->get(QNetworkRequest(data_url));
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
if (reply->error() != QNetworkReply::NoError)
{
    // Something went wrong. Error can be retrieved with: reply->error()
}
else
{
    // Call reply->readAll() and do what you need with the data
}
// ...

此示例将阻止,直到答复准备就绪。如果您需要异步行为,只需将信号finished()连接到自定义slot并检查错误和/或在那里阅读。我不建议将信号finished()直接连接到readAll(),因为“有时会发生错误”。