말 그래도 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()라는 시그널이 발생할때 처리하는 메소드이다.
#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)
{
}
//이 슬롯은 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을 사용하는 수 밖에... 아니면 직접만들던가.