2016-09-28 225 views
0

我看了一下link,除了信号间谍和调试,我至少试了一切。我以this site为例。我现在还没有设置调试器。QT连接QNetworkReply SIGNAL finished()not firing

我的问题是,我想开一个自定义的插槽,什么都没有发生。 我试过qmake并重建项目,但结果是一样的。 我正在使用QTCreator和QT 5.7 msvc2015_64作为Windows10机器上的工具包。 我没有得到应该用于测试功能的任何未引用的警告(*回复未使用)。什么可能是这个问题的根源?
我完成的信号有问题吗?

从程序流程我假设它是以下内容:
我创建了一个新指针,指向名为manager的类QNetworkAccessManager的实例。 然后我将管理器对象的信号finished连接到来自对象管理器的定制插槽test(QNetworkReply*)。 现在每次发射来自对象管理器的信号finished时,应该执行来自对象管理器的功能test
从文档QNetworReply *QNetworkAccessManager::get(QNetworkRequest(QUrl))我假设当这个函数被调用时,一个新的QNetworkReply*对象被返回,并且当这个对象完成处理时,finished信号被命中。我必须以另一种方式连接我的信号和插槽吗?

我试图声明QNetworkReply reply* = manager->get....connect(reply, SIGNAL(finished()),this,SLOT(test()));但在这里我的应用程序崩溃。

当我设置wireshark和过滤器:http包含“http://www.theuselessweb.com”没有弹出。

switchwebpanel.h

#ifndef SWITCHWEBPANEL_H 
#define SWITCHWEBPANEL_H 
#include <QNetworkAccessManager> 
#include <QObject> 
#include <QUrl> 
#include <QNetworkReply> 
#include <QFile> 
#include <QDateTime> 
#include <QNetworkRequest> 
#include <QDebug> 

class switch_panel : public QObject 
{ 
Q_OBJECT 

public: 
    switch_panel(QObject *parent = 0); 
    void doDownload(); 

signals: 

public slots: 
    void replyFinished(QNetworkReply *reply); 
    void test(QNetworkReply * reply); 

private: 
    QNetworkAccessManager *manager; 

}; 

#endif // SWITCHWEBPANEL_H 

switchwebpanel.cpp

#include <switchwebpanel.h> 


switch_panel::switch_panel(QObject *parent): 
QObject(parent) 
{} 


void switch_panel::doDownload(){ 
    qDebug()<<"Downloader gestartet"; 
    manager = new QNetworkAccessManager (this); 
    qDebug()<<"connect..."; 

    // Here i want to call the test(QNetworkReply*) function 

    connect(manager, SIGNAL(finished(QNetworkReply*)), 
     this, SLOT(test(QNetworkReply*))); 
    qDebug()<<"get"; 
    manager->get(QNetworkRequest(QUrl("http://www.theuselessweb.com"))); 
    qDebug()<<"manager gegeted"; 
} 

void switch_panel::replyFinished(QNetworkReply *reply){ 
    qDebug()<<"Async starten"; 
    if(reply->error()){ 
    qDebug()<<"error"; 
    qDebug()<<reply->errorString(); 
    } 
    else { 
    qDebug()<<reply->header(QNetworkRequest::ContentTypeHeader).toString(); 
    qDebug()<<reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toString(); 
    qDebug()<<reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); 
    qDebug()<<"File"; 
    QFile *file = new QFile("./htmlpanel.txt"); 
    if(file->open(QFile::Append)){ 
     file->write(reply->readAll()); 
     file->flush(); 
     file->close(); 
    } 
    //delete file; 
    } 
    reply->deleteLater(); 
    qDebug()<<"Async fertig"; 
} 
void switch_panel::test(QNetworkReply *reply){ 
    qDebug()<<"test"; 
} 

我得到以下输出:

Download 
Downloader gestartet 
connect... 
get 
manager gegeted 

我Main.cpp的呼吁:switch_panel panel; panel.doDownload();

+0

我Main.cpp的呼吁: switch_panel面板; panel.doDownload(); – Eggi

回答

0

的Qt网络管理员需要运行一个事件循环来处理异步网络访问。最简单的方法是在你的主创建一个QCoreApplication对象,并调用其exec()方法:

#include <QCoreApplication> 
#include "switchwebpanel.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    switch_panel p; 
    p.doDownload(); 
    return a.exec(); 
} 
+0

好吧,我采取了你的建议,并实施了一个事件循环,但以另一种方式: reply = manager-> get(QNetworkRequest(QUrl(“http://www.theuselessweb.com”))); qDebug()<<“connect”; QEventLoop循环; connect(reply,SIGNAL(finished()),&loop,SLOT(quit())); loop.exec(); – Eggi

+0

Qt 5.5会在运行时发出'QEventLoop'不能使用'QApplication'的警告。它可能有效,但你应该在main中创建一个实例。不过,您可以使用本地事件循环来获取请求。 –

+0

还要注意,调用'loop.exec()'永远不会返回!您可能希望在您的'switch_panel'类中创建'QEventLoop *',并在完成请求时调用'quit()',以恢复执行'loop.exec()'返回执行 –