使用 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);

这里使用事件循环等待回复完成,然后读取可用字节并获取字符串。