【问题标题】:Getting a page content with Qt使用 Qt 获取页面内容
【发布时间】:2015-02-01 20:27:46
【问题描述】:

我正在尝试使用 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 似乎仍然为空。显然,我误解了文档。如何让它执行?

【问题讨论】:

  • 您必须连接到 QNetworkReply 的信号才能在内容可用时收到通知,然后才能从中读取。
  • 所以我需要创建一个槽,有一个回调函数,并希望一个执行,很像JavaScript中的AJAX请求?
  • 是的,Qt 文档中提供了如何执行此操作的示例。

标签: c++ qt httprequest webpage qnetworkaccessmanager


【解决方案1】:

您可以使用两种不同的方式,甚至是同步或异步方式来执行此操作。异步方式是:

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

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

【讨论】:

    【解决方案2】:

    我需要假设您正在运行一个带有事件循环的应用程序?如果没有,那就有点难了……

    如果是这样,请替换构建回复 QString 的最后一行:

    connect(currentReply, SIGNAL(finished()), this, SLOT(gotAReply()));
    

    然后你必须在你的类中定义另一个方法作为一个槽,一旦回复被填满就会触发:

    void gotAReply()
    {
        QNetworkReply *reply = qobject_cast<QNetworkReply*>(QObject::sender());
    
        if (reply)
        {
            if (reply->error() == QNetworkReply::NoError)
            {
                QString replyText( reply->readAll() );
            }
            reply->deleteLater();
        }
    }
    

    不要忘记:要使 Signals 和 Slot 工作,您的类声明必须包含 Q_OBJECT 宏。

    【讨论】:

    • 错误:'sender'未在此范围内声明 QNetworkReply *reply = qobject_cast(sender()); ^
    • 已修复,抱歉。 static QObject* QObject::sender() 的意思。看看信号和插槽。
    猜你喜欢
    • 2021-08-12
    • 2017-07-26
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多