2015-01-07 3 views
2

Qt를 사용하여 웹 페이지를 가져와 화면에 인쇄하려고합니다. 문제는 항상 ""입니다. 그것은 완료 SLOT에 그것을 만들지 않습니다. connect()에 문제가 있는지 알 수 없습니다. 코드는 오류없이 컴파일됩니다. 아직 이벤트 루프를 사용하지 않으려 고합니다. 여기 Qt QNetworkAccessManager를 사용하여 웹 페이지를 가져올 때 항상 ""을 반환합니다.

코드입니다 :

net.h

#ifndef NET_H 
 
#define NET_H 
 

 
#include <QObject> 
 
#include <QtNetwork> 
 
#include <QString> 
 
#include <QDebug> 
 

 
class net : public QObject 
 
{ 
 
    Q_OBJECT 
 
public: 
 
    explicit net(QObject *parent = 0); 
 
    void get_site(QString url); 
 
    QString data; 
 

 
signals: 
 

 
public slots: 
 
    void err(QNetworkReply *); 
 
    void done(QNetworkReply *); 
 

 
private: 
 

 
}; 
 

 
#endif // NET_H

net.cpp :

#include "net.h" 
 

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

 
void net::get_site(QString url) { 
 
    QNetworkAccessManager man; 
 
    QNetworkRequest request; 
 

 
    request.setUrl (QUrl(url)); 
 

 
    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*))); 
 
    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(err(QNetworkReply *))); 
 

 
    man.get (QNetworkRequest(QUrl(url))); 
 
} 
 

 
void net::done(QNetworkReply * reply) { 
 
    data = QString(reply->readAll()); 
 
} 
 

 
void net::err(QNetworkReply * reply) { 
 
    data = QString(reply->errorString()); 
 
}

그리고 main.cp p는 :

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

 

 
int main(int argc, char *argv[]) 
 
{ 
 
    QCoreApplication a(argc, argv); 
 

 
    net netobj; 
 
    netobj.get_site("http://stackoverflow.com"); 
 
    qDebug() << netobj.data; 
 
    return a.exec(); 
 
}

+0

을 글쎄, 네 문제가있어. 이벤트 루프가 그 일을하게하지 않고는 이것이 작동 할 방법이 없습니다. 슬롯에 중단 점을 넣고 무슨 일이 일어나는 지 봅니다. – MrEricSir

+0

그러나 그것을 사용하지 않은 소스가 있습니다. 사용하는 앱을 사용하는 것 같습니다. 확실하지 않습니다. Qt를 처음 사용합니다. – Nve

답변

0

귀하의 QNetworkAccessManager 인스턴스는 get_site 함수의 끝에서 범위를 벗어나. Qt 문서에 따르면 QNetworkAccessManager 하나만 있으면 전체 Qt 애플리케이션에 충분합니다. 객체는 해당 함수의 범위를 벗어나서 지속되어야합니다. 응답이 수신하는 데 시간이 오래 걸릴 가능성이 있기 때문입니다. QNetworkAccessManager를 get_site에 대한 자동 변수 대신 net 클래스의 구성원으로 만드십시오.

delete을 사용하지 않고 deleteLater()을 사용하여 QNetworkReply 개체의 수명을 관리해야합니다. 그렇지 않으면 메모리가 누수 될 수 있습니다.

+0

감사합니다. 문제는 여전히 남아 있습니다. 응답을 받기 위해 기다릴 수있는 방법이 있습니까? 나는 그것이 회신이 끝나기 전에 왜 슬롯으로 점프하는지 모른다. 회신이 내용을 얻기 전에 왜 끝나는가! – Nve

+0

오류 코드와 Qt가 반환하는 오류 문자열을 찾아보고 보면이를 알려야합니다. 방법을 보여주기 위해 게시물을 편집 하겠지만 Nejat은 어떻게 새로운 결과를 작성했는지 보여줍니다. 오류를 게시 할 수 있습니까? – orfdorf

+0

답변 됨 Nejat. errors.It 이벤트 루프를 사용하여 잘 작동합니다. 그래서 문제는 단지 응답을 얻기 위해 기다리지 않는다는 것입니다. 그러나 나는 왜 그런지 정확하게 모른다. – Nve

1

코드에 몇 가지 주요 문제점이 있습니다. 먼저 .H 파일의 클래스의 구성원으로 QNetworkAccessManager이 있어야합니다

class net : public QObject 
{ 
    ... 
private: 
    QNetworkAccessManager nam; 
}; 

은 또한 두 개의 다른 슬롯에 finished 신호를 연결하지 않아야합니다. 귀하의 get_site 기능은 같아야합니다

void net::get_site(QString url) { 

    QNetworkRequest request; 
    request.setUrl (QUrl(url)); 

    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*))); 

    man.get (QNetworkRequest(QUrl(url))); 
} 

그리고 당신은 다음과 같은 방법으로 반환 된 응답을 관리해야한다 ". 아직 이벤트 루프를 사용하지 않는 시도"

void net::done(QNetworkReply * reply) { 


    if (reply->error() == QNetworkReply::NoError) 
    { 
     data = QString(reply->readAll()); 
    } 
    else 
    { 
     data = QString(reply->errorString()); 
    } 
} 
+0

고맙습니다.하지만 여전히 같은 문제가 있습니다. 이벤트 루프를 사용하여 응답 할 때까지 기다려야하는 것 같습니다. 다른 방법을 찾아 낼 수 없었습니다. – Nve

+0

나는 그것이 회신이 끝나기 전에 슬롯으로 점프하는 이유를 모른다. 또는 회신이 내용을 얻기 전에 왜 끝나는가! – Nve

+0

'finished'가 출력되면 오류를 반환합니까? 즉,'data = QString (reply-> errorString());'행이 실행됩니까? – Nejat

관련 문제