根据Qt 4.7.1,OS X 10.6.8 (必须使用此 - 更高版本 Qt和/或OS X的引入严重 我的用户不兼容)
以下作品。有时。然后有时不会。 如果它不起作用,它将返回“未知错误”
hst在所有情况下都很好,qDebug返回相同的正确值 每次都是hst的数据。
这个想法是,使用 - >来获取CGI URL; CGI 返回一些数据,在这种情况下我可以忽略。 然后我就完成了。
hst是一个格式正确的网址,
http://yadda.com/cgi-bin/whatever.py
QString hst;
QNetworkReply *qnr;
QNetworkAccessManager *qqnap = NULL;
qqnap = new(std::nothrow) QNetworkAccessManager(tmw);
if (qqnap != NULL)
{
hst = loaduphst(); // get qstring to send
qnr = qqnap->get(QNetworkRequest(QUrl(hst))); // report in and fetch update info
if (qnr->waitForReadyRead(3000) == FALSE)
{
qDebug() << "waitForReadyRead() returned FALSE -- error or timeout:" << qnr->errorString();
}
}
else
{
qDebug() << "qqnap is NULL";
}
yadda.com上涨;目标脚本很简单 并且每次都可以在浏览器或cmd行中正常工作。
这是在上下文中运行的 MainWindow :: closeEvent(QCloseEvent * ce) 在我发出ce-&gt;之前接受()GUI仍在运行, 等
提示?提示?滥用?谢谢!
答案 0 :(得分:2)
waitForReadyRead
未在QNetworkReply
中实施。 default implementation无效:
bool QIODevice::waitForReadyRead(int msecs)
{
Q_UNUSED(msecs);
return false;
}
使用readyRead
信号找出何时可以读取数据。
答案 1 :(得分:1)
在主GUI循环的上下文中,或多或少同步使用异步网络是非常有问题的。不会出现的信号(已完成或已准备好阅读),有时会发送但有时不会发送的网址......当然,正如上面所说的那样,未实现的功能。斑马!
但是,我们可以做的是自己启动事件循环和计时器,这将以一种或多或少的友好方式同步。
也许一些可怜的灵魂需要像我一样捅一个网站CGI;这是代码。有用。至少在Qt 4.7.1下它确实如此!
所以无论如何,这里是:
QNetworkReply *qnr;
QNetworkAccessManager *qqnap;
QNetworkRequest qnwr;
QEventLoop w;
QTimer arf;
if ((qqnap = new(std::nothrow) QNetworkAccessManager(this)))
{
qnwr.setUrl(myUrl()); // Build web goodness
qnwr.setRawHeader("User-Agent", myUserAgent());
arf.setSingleShot(true);
if (connect(&arf, SIGNAL(timeout()), // timer firing blows...
&w, SLOT(quit()) // ...out event loop
) == FALSE)
{ return(BAD_CONNECT_TOUT); }
if (connect(qqnap, SIGNAL(finished(QNetworkReply*)), // notify we finished...
this, SLOT(qqnapReplyQ(QNetworkReply*)) // ...cuz I need to know
) == FALSE)
{ return(BAD_CONNECT_FINISHED_NOTIFY); }
if (connect(qqnap, SIGNAL(finished(QNetworkReply*)), // finishing blows out...
&w, SLOT(quit()) // ...event loop
) == FALSE)
{ return(BAD_CONNECT_FINISHED_ELOOP); }
if ((qnr = qqnap->get(qnwr))) // Go if qnr is good
{
arf.start(6000); // timeout in ms // Watchdog timer on
w.exec(); // handle all that
if (arf.isActive()) { arf.stop(); } // kill timer if needed
}
else { return(BAD_WWWGET); } // FAIL
}
else
{
return(BAD_NWAM); // FAIL
}
return(ZEN_NETWORKING);