나는이 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();
나의하여 Main.cpp 호출 : 가장 쉬운 방법은 기본에
QCoreApplication
객체를 생성하고exec()
메서드를 호출하는 것입니다 switch_panel 패널; panel.doDownload(); – Eggi