'QT/Network'에 해당되는 글 1건

  1. 2015.04.08 http에 연결을 해보자

말 그래도 http에 연결을 해서  받은 데이터를 화면에 뿌려 보는거다.

쉽게 말하자면  인터넷을 키고  원하는 사이트를 입력하면 그 사이트가 뜨는걸 볼 수 있다.

그 사이트를 보는걸 해보겟다는거다. 당연히 사용되는건 Qt 4.6 버젼이다.

-----------------------------------
http 연결에 쓰는 클래스..

QNetworkAccessManager          이 클래스는 연결하고 request 를 보내거나 하는 클래스이다.
QNetworkReply                         이 클래스는 request를 보냈을때 서버에서 보낸 걸 받는 클래스이다. 

위에 있는 클래스들은 api에 가면 자세하게 설명이 되어있기때문에.. api를 참조.. 
------------------------------------

소스 닫기

소스를 보면 더 쉽게 이해 될 수 있을것이다.

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QSslError>

class htmlRead : public QWidget
{
    Q_OBJECT

public:
    htmlRead(QWidget *parent = 0);
    ~htmlRead();

public slots:
    //이 슬롯은 QNetworkReply에서 readyRead()라는 시그널이 발생할때 처리하는 메소드이다.
    void slotReadyRead();
    //이 슬롯은  QNetworkReply에서   error라는 시그널이 발생했을때 처리하는 메소드이다.      
    void slotError(QNetworkReply::NetworkError err);
    
    //이 슬롯은  QNetworkReply에서 ssl 에러 처리를 하는 메소드이다.
    void slotSslErrors(QList<QSslError> err);
    // 이 슬롯은 데이터가 다 전송되면 NetworkAccessManager에서 발생하는 시그널인 finished를 처리하는 메소드이다.
    void replyFinished(QNetworkReply* reply);

private:
    //ui에는 textBrowser를 적당하게 배치해놧다.
    Ui::htmlReadClass ui;

    QNetworkReply *reply;
    QByteArray data ;
};


/////////////////////////////////////////////////
// htmlread.cpp

#include "htmlread.h"

htmlRead::htmlRead(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

     QNetworkAccessManager *manager = new QNetworkAccessManager(this);
     connect(manager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(replyFinished(QNetworkReply*)));
     
    //여기서 주의 할 점은 다른곳에서 get 메소드를 사용하면 readyRead() 시그널이 바로 발생하지 않는다.
    // 고로 사용할 때 주의를 해야한다. 즉 get()을 불러온 그 함수가 끝나야 readyRead()가 발생한다.

     reply =  manager->get(QNetworkRequest(QUrl("http://www.naver.com")));
     connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
     connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
             this, SLOT(slotError(QNetworkReply::NetworkError)));
     connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
             this, SLOT(slotSslErrors(QList<QSslError>)));

}

htmlRead::~htmlRead()
{

}

void htmlRead::replyFinished(QNetworkReply* reply)
{
    QString string(data);

    ui.textBrowser->setHtml(string);

}
#include <qdebug.h>

void htmlRead::slotReadyRead()
{
    //reply객체에서 데이터를 읽어오는 메소드이다. 
    //readAll()의 경우는 모든 데이터를 한번에 뽑아오는 메소드이다. 
    // 그것 말고 도 많이 있다. read()도 있고 readLine()도 있다. 더 자세한것은 
    // QIODevice를 참조..
    data = reply->readAll();

}

void htmlRead::slotError(QNetworkReply::NetworkError err )
{

}

void htmlRead::slotSslErrors(QList<QSslError> err)
{

}


소스 닫기


실행결과 :




위에 소스를 보면 알 수 있다.



근데 문제는 해보면 제대로 안뜨는걸 볼 수 있다.

그건 어쩔 수 없다. 일반적인 사이트들은 html만 사용된게 아니라 그림에 자바스크립트,  플래시 기타등등이 사용되었기 때문에 이상하게 나와도 어떻게 할 방도가 없다. 제대로 나오게 하고 싶다면 webkit을 사용하는 수 밖에... 아니면 직접만들던가.

Posted by 모래반지빵냐빵냐
,