2016-09-28 3 views
0

나는이 link을보고 신호 스파이와 디버깅을 제외하고 적어도 모든 것을 시도했다. 나는 그 예를 this site에서 가져 갔다. 지금은 디버거를 설정하지 않았습니다.QT Connect QNetworkReply SIGNAL finished() firing하지 않음

내 문제는 내가 맞춤 슬롯을 발사하고 아무 것도 일어나지 않는다는 것입니다. qmake를 시도하고 프로젝트를 다시 작성했지만 결과는 동일합니다. QFTreator를 QT 5.7 msvc2015_64와 함께 Windows10 컴퓨터의 키트로 사용하고 있습니다. 테스트 기능 (* reply not used)에 대한 참조되지 않은 경고가 표시되지 않습니다. 이 문제의 원인은 무엇일까요?
완성 된 신호에 문제가 있습니까?

프로그램의 흐름에서 다음과 같다고 가정합니다.
QNetworkAccessManager manager라는 이름의 인스턴스에 대한 새 포인터를 만듭니다. 그런 다음 관리자 개체의 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 호출 : 가장 쉬운 방법은 기본에 QCoreApplication 객체를 생성하고 exec() 메서드를 호출하는 것입니다 switch_panel 패널; panel.doDownload(); – Eggi

답변

0

Qt는을 의 네트워크 관리자는 비동기 네트워크 액세스를 처리하기 위해 이벤트 루프를 실행해야합니다.

#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는 런타임에'QApplication'없이'QEventLoop'을 사용할 수 없다는 경고를합니다. 작동하지만 메인에 인스턴스를 만들어야합니다. 그럼에도 불구하고 요청에 로컬 이벤트 루프를 사용할 수 있습니다. –

+0

또한 'loop.exec()'에 대한 호출은 절대로 반환되지 않습니다!'switch_panel' 클래스에'QEventLoop *'을 만들고 요청이 끝나면'quit()'을 호출하여 실행을 재개 할 수 있습니다. –