我正在尝试在下面实现一个简单的版本检查器。 我得到一个零错误代码读取文件,但文件 内容显示空白。您可以通过浏览器访问该文件, 权限还可以。
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() ));
如何为我的任务设置信号/插槽?
答案 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()
,因为“有时会发生错误”。