使用 Qt 获取页面内容
Getting a page content with Qt
我正在尝试使用 Qt 和 C++ 将 HTTP 请求的内容放入 QString 变量中
QNetworkAccessManager networkManager;
QUrl url("https://someurl.test.com/this-actually-exists");
QNetworkRequest request;
request.setUrl(url);
QNetworkReply* currentReply = networkManager.get(request); // GET
QString reply = QTextCodec::codecForMib(1015)->toUnicode(currentReply->readAll());
不过,变量 reply
似乎仍为空。显然,我误解了文档。我如何让它执行?
我需要假设您是 运行 具有事件循环的应用程序?如果没有,那就有点难了...
如果是这样,请替换构建回复 QString 的最后一行:
connect(currentReply, SIGNAL(finished()), this, SLOT(gotAReply()));
然后你必须在你的 class 中定义另一个方法作为一个槽,一旦回复被填充就被触发:
void gotAReply()
{
QNetworkReply *reply = qobject_cast<QNetworkReply*>(QObject::sender());
if (reply)
{
if (reply->error() == QNetworkReply::NoError)
{
QString replyText( reply->readAll() );
}
reply->deleteLater();
}
}
不要忘记:要使信号和槽工作,您的 class 声明必须包含 Q_OBJECT 宏。
您可以使用两种不同的方式,甚至是同步方式或异步方式来做到这一点。异步方式是:
connect (&networkManager , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*)));
networkManager.get(request);
并且您应该通过以下方式从连接到 finished
信号的插槽中读取返回的回复内容:
void net::done(QNetworkReply * reply)
{
if (reply->error() == QNetworkReply::NoError)
{
data = QString(reply->readAll ());
}
else
{
data = QString(reply->errorString ());
}
}
同步方式如:
QNetworkReply *reply = networkManager.get(request);
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()));
loop.exec();
QByteArray bts = reply->readAll();
QString str(bts);
这里使用事件循环等待回复完成,然后读取可用字节并获取字符串。
我正在尝试使用 Qt 和 C++ 将 HTTP 请求的内容放入 QString 变量中
QNetworkAccessManager networkManager;
QUrl url("https://someurl.test.com/this-actually-exists");
QNetworkRequest request;
request.setUrl(url);
QNetworkReply* currentReply = networkManager.get(request); // GET
QString reply = QTextCodec::codecForMib(1015)->toUnicode(currentReply->readAll());
不过,变量 reply
似乎仍为空。显然,我误解了文档。我如何让它执行?
我需要假设您是 运行 具有事件循环的应用程序?如果没有,那就有点难了...
如果是这样,请替换构建回复 QString 的最后一行:
connect(currentReply, SIGNAL(finished()), this, SLOT(gotAReply()));
然后你必须在你的 class 中定义另一个方法作为一个槽,一旦回复被填充就被触发:
void gotAReply()
{
QNetworkReply *reply = qobject_cast<QNetworkReply*>(QObject::sender());
if (reply)
{
if (reply->error() == QNetworkReply::NoError)
{
QString replyText( reply->readAll() );
}
reply->deleteLater();
}
}
不要忘记:要使信号和槽工作,您的 class 声明必须包含 Q_OBJECT 宏。
您可以使用两种不同的方式,甚至是同步方式或异步方式来做到这一点。异步方式是:
connect (&networkManager , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*)));
networkManager.get(request);
并且您应该通过以下方式从连接到 finished
信号的插槽中读取返回的回复内容:
void net::done(QNetworkReply * reply)
{
if (reply->error() == QNetworkReply::NoError)
{
data = QString(reply->readAll ());
}
else
{
data = QString(reply->errorString ());
}
}
同步方式如:
QNetworkReply *reply = networkManager.get(request);
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()));
loop.exec();
QByteArray bts = reply->readAll();
QString str(bts);
这里使用事件循环等待回复完成,然后读取可用字节并获取字符串。