QNetworkAccessManager 不会启动

Posted

技术标签:

【中文标题】QNetworkAccessManager 不会启动【英文标题】:QNetworkAccessManager won't fire up 【发布时间】:2016-02-20 11:25:29 【问题描述】:

对 Qt 有点陌生,正在尝试向网站发出 HTTP GET 请求。 问题是它不发送任何东西。我已经检查了提琴手。没有动静。没有错误,没有触发信号。

我还检查了我是否有任何其他可能使用的网络接口,所以我禁用了它们,但没有帮助

这里是来源:

linkslooker::linkslooker(QThread *thread)
    this->mainThread = thread;
    Loop();


void linkslooker::Loop()
  //  while(true)
        qDebug() << "Looking for sites. Accessability:" << qnam.networkAccessible(); // Always 1

        mainThread->msleep(1000); //To slow down the loop

        QNetworkRequest req(QUrl("http://www.test.com"));
        reply = qnam.get(req); //Get request to a QNetworkReply

        if(reply->error() != QNetworkReply::NoError)
          qDebug("network error!"); //There are no errors

        connect(reply, SIGNAL(finished()),
                SLOT(httpFinished())); //Finish request signal
        connect(reply, SIGNAL(readyRead()),
                this, SLOT(httpReadyRead())); //Read to start signal
        connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
                this, SLOT(updateDataReadProgress(qint64,qint64))); //Reading Signal
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
                this, SLOT(slotError(QNetworkReply::NetworkError))); //Error Signal
  //  



void linkslooker::httpFinished()
    qDebug() <<  QString::fromUtf8(m_data);


void linkslooker::slotError(QNetworkReply::NetworkError e) 
    qDebug() << "slotError" << e ; //Not fired up

void linkslooker::httpReadyRead()

   m_data.append(reply->readAll());
   qDebug() << "READY TO READ";


void linkslooker::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)

    if (httpRequestAborted)
        qDebug() << "Network request Aborted";
        qDebug() << "Have read " << bytesRead << "Out of " << totalBytes;

这是供参考的标题:

#ifndef LINKSLOOKER_H
#define LINKSLOOKER_H
#include <QCoreApplication>
#include <QQueue>
#include <QtNetwork>
#include <QList>
#include <QNetworkAccessManager>

class linkslooker:public QObject

    Q_OBJECT
public:
    linkslooker(QThread *);
    ~linkslooker();

private:
    void Loop();
    QThread *mainThread;
    QQueue<QString> websites;
    QList<QString> searched;
    QNetworkAccessManager qnam;
    QNetworkReply *reply;
    bool httpRequestAborted;
    QByteArray m_data;
private slots:
      void httpFinished();
      void httpReadyRead();
      void updateDataReadProgress(qint64 bytesRead, qint64 totalBytes);
      void slotError(QNetworkReply::NetworkError);
;

#endif // LINKSLOOKER_H

【问题讨论】:

您的while(true) 循环阻塞了事件循环。这就是没有传递 Qt 信号的原因。 我实际上已经尝试在这篇文章之后删除循环。它只是在一次运行后静止不动。还有其他想法吗? 【参考方案1】:

发现问题:

在调用这个类时,我没有给它一个要保存的变量,所以在它附加了所有信号之后——这个类被销毁了(因为它超出了我假设的范围?)

不得不改变:

int main(int argc, char *argv[])

   QCoreApplication a(argc, argv);
   linkslooker(a.thread());
   return a.exec();

到这里:

int main(int argc, char *argv[])

   QCoreApplication a(argc, argv);
   linkslooker ll(a.thread());
   return a.exec();

【讨论】:

以上是关于QNetworkAccessManager 不会启动的主要内容,如果未能解决你的问题,请参考以下文章

在发布模式下编译时不会发出 QNetworkAccessManager 完成信号(VS 2005)

尝试使用 Qt QNetworkAccessManager 获取网页时,它总是返回“”

PHPWAMP自启异常,服务器重启后Apache等服务不会自动重启的原因分析

错误:没有用于调用“QNetworkAccessManager::QNetworkAccessManager(Networking* const)”的匹配函数

QNetworkAccessManager 问题

使用 QNetworkAccessManager 请求