IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Le contenu de Qt4 > QNetwork
        Comment télécharger une page web avec QHttp ?
        Comment retrouver l'IP d'un domaine et vice versa ?



Comment télécharger une page web avec QHttp ?
auteur : François Jaffré
Qt a encapsulé le protocole HTTP au sein de la classe QHttp. Celle-ci possède notamment les méthodes suivantes :

  • int post(const QString & path, QIODevice * data, QIODevice * to = 0) -> Permet l'envoie de données
  • int get(const QString & path, QIODevice * to = 0) -> Permet de réceptionner des données
  • int close() -> Ferme la connexion
Téléchargement d'une page web

#include <QApplication>
#include <QPushButton>
#include <QGridLayout>
#include <QProgressBar>
#include <QLabel>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QHBoxLayout>
#include <QHttp>
#include <QFile>
#include <QUrl>
#include <QMessageBox>
#include <QFileDialog>
 
class FAQHttp : public QWidget
{
    Q_OBJECT
    QPushButton     *m_Bouton_Dowload;//Bouton "Download"
    QProgressBar    *m_ProgressBar;//Sert a afficher la progression du telechargement
    QLineEdit       *m_Edit;//Chemin de l'URL de telechargment
    QLabel          *m_Label;
    QHttp           *m_http;//Permet la gestion du telechargement via HTTP
    QFile           *m_file;//Fichier de fin du telechargement
    int             m_httpId;//Contient l'ID de notre requette HTTP
public :
    FAQHttp()
    {
        //Creation des contrôles de types boutons, Edit, Label, ProgressBar
        this->m_Bouton_Dowload = new QPushButton("Télécharger",this);
        this->m_ProgressBar = new QProgressBar(this);
        this->m_Edit = new QLineEdit(this);
        this->m_Label = new QLabel("URL:", this);
        m_Label->setBuddy(m_Edit);
         
        //Gestion du layout pour le placement des boutons
        QHBoxLayout *firstLayout = new QHBoxLayout;
        firstLayout->addWidget(m_Label);
        firstLayout->addWidget(m_Edit);
        
        QHBoxLayout *Layout = new QHBoxLayout;
        Layout->addLayout(firstLayout);
        Layout->addWidget(m_Bouton_Dowload);
        
        QVBoxLayout *secondeLayout = new QVBoxLayout();
        secondeLayout->addLayout(Layout);
        secondeLayout->addWidget(m_ProgressBar);
        setLayout(secondeLayout);
         
        //On connecte les differents signaux et slots pour les boutons
        connect(this->m_Bouton_Dowload, SIGNAL(clicked(bool)), this, SLOT(click_Download(bool)));
        resize(400, 150);//Gestion de la taille de la fenêtre
    }
 
private slots: 
 
    void DownloadFile(QString source , QString fichier)
    {
        QUrl adresse(source);
        this->m_http = new QHttp(adresse.host(),80,this);
        m_file = new QFile(fichier);
        if(!m_file->open(QIODevice::WriteOnly))//On vérifie qu'il n'y a pas de problème lors de l'ouverture du fichier
        {
            QMessageBox::information(this, "HTTP Problemes"," Probleme lors du telechargement");
            //On fait le ménage en memoire
            delete this->m_http;
            delete this->m_file;
            return;
        }
        //On fait la requette et on en récupère l'Id
        m_httpId = m_http->get(adresse.toString(), m_file);
 
        //On connecte les signaux slots pour avoir l'état d'avancement du telechargement
        connect(m_http,SIGNAL(requestFinished(int, bool)),this,SLOT(finish_dowload(int ,bool)));
        connect(m_http,SIGNAL(dataSendProgress(int,int)),this,SLOT(progress_dowload(int, int)));  
        this->m_ProgressBar->reset();
        this->m_ProgressBar->setMinimum(0);
    }
    
    void finish_dowload(int httpId, bool error)//Est déclanché à la fin du telechargement
    {
        if (this->m_httpId != httpId)
        {
            return;
        }
        else
        {
            if(error)
                QMessageBox::information(this, "HTTP Problemes"," Probleme lors du telechargement");
            else
                QMessageBox::information(this, "HTTP"," Le telechargement a réussi");
        
            this->m_file->close();//On ferme le fichier une fois le telechargement terminé
            //On fait le ménage au niveau memoire
            delete this->m_http;
            delete this->m_file;
        }

    }
 
    void click_Download(bool valid)//Bouton "Start" "Stop"
    {
        QString saveFile = QFileDialog::getSaveFileName(this,"Download Files","C:\\", "All Files (*.*)");
        if(!saveFile.isEmpty())
            DownloadFile(this->m_Edit->text(),saveFile);
    }
    
    void progress_dowload(int done , int total)//Permet de suivre l'avancé du telechargement
    {
        this->m_ProgressBar->setMaximum(total);
        this->m_ProgressBar->setValue(done);//On incremente la progress bar en fonction des données telechargées
    }
 
};
 
#include "main.moc"
 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    FAQHttp w;
    w.show();
    return a.exec();
}
Remarque : Cette classe possède de nombreux signaux qui permettrent de suivre l'état de la connexion avec le serveur. Référez-vous à la doc pour plus d'information.
Remarque: Depuis Qt 4.4, QHttp est déprécié au profit des classes QNetworkAccessManager et QNetworkReply qui offrent plus de souplesse que QHttp.

lien : en QHttp

Comment retrouver l'IP d'un domaine et vice versa ?
auteur : François Jaffré
Qt fournit dans son module réseau la classe QHostInfo qui permet de retrouver l'adresse ip correspondant à un nom de domaine mais aussi, si possible, de retrouver le domaine correspondant à l'ip. Dans ce but QHostInfo possède les méthodes static suivantes :

  • int QHostInfo::lookupHost (const QString & name, QObject * receiver, const char * member) -> Permet retrouver le nom de domaine à partir d'une IP ou vice versa de manière asynchrone (non bloquante).
  • QHostInfo QHostInfo::fromName (const QString & name) -> Permet de retrouver l'ip appartenant au domaine et vice versa de manière synchrone (bloquante).
Exemple

#include <QApplication>
#include <Qlabel>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
 
class ResolveDNS : public QWidget
{
    Q_OBJECT
    QLabel* m_Label_Domain;
    QLabel* m_Label_Ip;
    QLineEdit* m_Line_Domain;
    QLineEdit* m_Line_Ip;
    QPushButton* m_Button_Ip;
    QPushButton* m_Button_Domain;
 
public :
    ResolveDNS()//Constructeur
    { 
        //Création des differents contôles
        m_Label_Domain = new QLabel("&Domain :", this);
        m_Label_Ip = new QLabel("&Ip :", this);
        m_Line_Domain = new QLineEdit(this);
        m_Line_Ip = new QLineEdit(this);
         
        m_Label_Domain->setBuddy(m_Line_Domain);
        m_Label_Ip->setBuddy(m_Line_Ip);
        m_Button_Ip = new QPushButton("Resolve IP",this);
        m_Button_Domain = new QPushButton("Resolve Domaine",this);
         
        //Gestion du layout
        QHBoxLayout* Layout = new QHBoxLayout();
        Layout->addWidget(m_Label_Domain);
        Layout->addWidget(m_Line_Domain);
        Layout->addWidget(m_Label_Ip);
        Layout->addWidget(m_Line_Ip); 
        Layout->addWidget(m_Button_Domain);
        Layout->addWidget(m_Button_Ip);
        setLayout(Layout);
        
        //Connexions des differents signaux slot pour la gestions des boutons
        connect(this->m_Button_Ip, SIGNAL(clicked(bool)), this, SLOT(resolveIp(bool)));
        connect(this->m_Button_Domain, SIGNAL(clicked(bool)), this, SLOT(resolveDomain(bool)));
    }
private slots :
    void resolveDomain(bool valid)//Click sur "Resolve Domaine"
    {
        //Résolution domaine -> IP (mode synchrone)
        QHostInfo infoAdresse = QHostInfo::fromName(m_Line_Domain->text());
        QList<QHostAddress> result_adresses = infoAdresse.addresses();
        QString Ip;
        //Si plusieurs adresses correspondent à un même domaine
        for(int i=0; i < result_adresses.size(); i++)
        { 
            //On crée une chaine qui contient toutes les adresses ip
            Ip = Ip + result_adresses.at(i).toString() +"; ";
        }
        //Affichage dans l'édit
        m_Line_Ip->setText(Ip);   
    }
    
    //Click sur "Resolve IP"
    void resolveIp(bool valid)
    {
        //Résolution IP -> domaine si possible de manière asynchrone
        QHostInfo::lookupHost(m_Line_Ip->text(),this, SLOT(resolveIpFinish(QHostInfo)));
    }
    
    //Slot appellé à la fin de la resolution IP -> domaine (mode asynchrone)
    void resolveIpFinish(const QHostInfo& infoAdresse)
    {
        //Affichage dans l'édit
        m_Line_Domain->setText(infoAdresse.hostName());
    } 
};
 
#include "main.moc"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ResolveDNS w;
    w.show();
    return a.exec();
}
lien : en QHostInfo


Consultez les autres F.A.Q's


Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.