[Qt C++]QTcpSocket - sczytanie strony internetowej


(Mazix2) #1

QTcpSocket i bazujac na tym, co znalazlem w dokmuentacji, napisalem cos takiego: (kod ponizej - maksymalnie prosty, bo na razie chce tylko zrozumiec zasade dzialania QTcpSocket) Jednak nie dziala chyba w cale, nie wiem, gdzie jest problem... Nic mi nie wyswietla ten qDebug, wiec nie wiem nawet, czy prawidlowo obsluzeylem polaczenie. Bylbym ogromnie wdzieczny za pomoc

KLASA.H

#ifndef KLASA_H

#define KLASA_H


#include 

#include 

#include 


class moja : public QWidget{

    Q_OBJECT

public:

    moja();

private:

    QTcpSocket* socket;

    QString strona;

protected slots:

    void onReadyRead();

};


#endif // KLASA_H

KLASA.CPP

#include "klasa.h"

#include 

#include 

#include 


moja::moja(){

    socket = new QTcpSocket();

    QUrl url("http://www.onet.pl");

    socket->connectToHost(url.host(), 80);

    connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()) );

}


void moja::onReadyRead() {

  QByteArray temp=socket->readAll();

  QString nowy(temp);

  strona=nowy;

  qDebug()<
}

MAIN.CPP

#include "klasa.h"

#include 


int main(int a, char**b){

    QApplication app(a,b);

    moja m;

    m.show();

    return app.exec();

}

-- Dodane 30.12.2009 (Śr) 13:19 -- Ok, troche pogrzebalem i mam - ale dalej nie dziala mi poprawnie- teraz wyswietla mi, ze strona nie istenieje, a istnieje napewno ... KLASA.H

#ifndef KLASA_H

#define KLASA_H

#include 

#include 

#include 


///Dialog showing a website

class GofunHelp : public QDialog

{

        Q_OBJECT


        public:

        GofunHelp();


        public slots:

        void httpData(int,bool);


        private:

        QTextBrowser* textbrowser;

        QHttp* http;

};

#endif // KLASA_H

KLASA.CPP

#include 

#include 

#include "klasa.h"

#include 


GofunHelp::GofunHelp()

{

        QGridLayout* gl = new QGridLayout(this);

        textbrowser = new QTextBrowser(this);

        gl->addWidget(textbrowser,0,0);


        http = new QHttp();


        connect(http,SIGNAL(requestFinished(int,bool)),this,SLOT(httpData(int,bool)));


        http->setHost("www.lastfm.pl",80);

        http->get("http://www.lastfm.pl/music/Placebo/Without+You+I'm+Nothing");

}


void GofunHelp::httpData(int id, bool error)

{

        if(error)

        {

                qDebug()<errorString();

                return;

        }


        QString str = http->readAll();


        textbrowser->setText(str);

}

MAIN.CPP

#include "klasa.h"

#include 


int main(int a, char**b){

    QApplication app(a,b);

    GofunHelp m;

    m.show();

    return app.exec();

}

(B Brachaczek) #2

To w końcu chcesz zrozumieć działanie QTcpSocket czy QHttp? Jeśli tego pierwszego, to wybrałeś sobie kiepski przykład, a jeśli tego drugiego, to przecież w Qt Examples jest fajny przykład wykorzystania QHttp. Jeśli używasz Qt Creatora (polecam), to możesz sobie to tam wygodnie przejrzeć. Jeśli przeczytasz ten przykład i nadal będziesz miał pytania, dopiero wtedy je zadaj. Zwróć też uwagę na to, że w obecnie (Qt 4.6.0) nie zaleca się pisania nowego kodu z użyciem QHttp. W przykładzie sugerują użycie QNetworkAccessManager (nie znam tej klasy).

A teraz kilka uwag odnośnie Twojego kodu (w tej drugiej wersji):

  1. Może się czepiam, ale argumenty dla main() raczej się nazywa argc i argv - taka jest konwencja.

  2. Dlaczego includujesz zamiast w klasa.h?

  3. Dlaczego niepotrzebnie includujesz w klasa.cpp?

  4. Konstruktor klasy GofunHelp jak każdy widget powinien mieć argument QWidget *parent = 0. To dobry nawyk.

  5. Na liście inicjalizacyjnej konstruktora GofunHelp powinieneś skonstruować obiekt klasy podstawowej.

  6. Dlaczego GofunHelp to QDialog (który tak naprawdę nie jest QDialogiem; patrz pkt 5), w którego jakimiś dziwnymi sposobami (layoutów używa się, kiedy mamy więcej niż jeden widget do rozmieszczenia) wsadzasz QTextBrowser? O wiele lepiej by było, gdyby klasa GofunHelp sama dziedziczyła z QTextBrowser, bo przecież GofunHelp jest właśnie przeglądarką (hiper-) tekstu. QDialog tak w ogóle to służy do budowania okien dialogowych.

  7. W GofunHelp::httpData() niepotrzebnie tworzysz zmienną str. Mogłeś przecież od razu do setText przekazać http->readAll().


(Mazix2) #3

Pięknie dziękuję za odpowiedź :slight_smile: Chciałem zrobić to przy pomocy QTcpSocket, ale nie wychodziło, mi, więc znalazłem klasę QHttp i z nią zacząłem próbować. Jednak jeśli mówisz, że nie powinno już się jej używać, spróbuję z QNetworkAccessManager. Piszę pewien większy program, gdzie z plik, który pobiorę ze okr. strony, najchętniej zapisałbym do QStringa i przy pomocy QRegExp wyszukał w nim potrzebne mi informacje. Poczytam o QNetworkAccessManager, zastosuję się do Twoich wskazówek i dam znać co mi wyszło :wink: Pozdrawiam !

-- Dodane 08.01.2010 (Pt) 11:50 --

Korzystajac z Twojego przykladu, udalo mi sie pobrac plik ze strony. Jednak kiedy dam qDebug()<< str; jest cos takiego, ze jakby strona nie miescila sie w QStringu, bo nie wyswietla sie jej cala zawartosc :frowning: (pisze w QtCreatorze) Masz moze pomysl, co zrobilem zle ?

#include

class QPushButton;

class QHttp;

class QFile;

class QLabel;

class QDoubleSpinBox;

class QTextBrowser;



class GofunHelp : public QWidget{

    Q_OBJECT

    public:

        GofunHelp(QWidget* parent=0);

    private:

        QPushButton* button;

         QTextBrowser* textbrowser;

        QHttp* http;

        QFile* plik;

    private slots:

        void download();

        void httpData();

};

#include "klasa.h"

#include

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include 


GofunHelp::GofunHelp(QWidget* parent):QWidget(parent){

    QGridLayout* m = new QGridLayout;


    plik = NULL;

    textbrowser = new QTextBrowser(this);

    button = new QPushButton("pobierz");


    connect(button,SIGNAL(clicked()),this,SLOT(download()));


    http = new QHttp(this);


    connect(http,SIGNAL(requestFinished(int,bool)),this,SLOT(httpData()));


    m->addWidget(button,0,4);

    m->addWidget(textbrowser,1,1);


    setLayout(m);

}


void GofunHelp::download(){

    QUrl url("http://www.lastfm.pl/music/interpol/antics");


    QFileInfo fileInfo(url.path());

    QString fileName = fileInfo.fileName();


    plik = new QFile(fileName);

    if(!plik->open(QFile::WriteOnly)){

        qDebug()<<"Nie można utworzyć pliku"+fileName;

        return;

    }


    http->setHost(url.host());

    http->get(url.path(),plik);

}

void GofunHelp::httpData(){

    if(plik){

        plik->close();


    }

    QString str;

    if(plik->open(QFile::ReadOnly)){

        QTextStream in(plik);

        str = in.readAll();

        plik->close();

       //plik->remove(plik->fileName().toAscii());

    }

   qDebug()<
    }