IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

QHttp et la methode GET


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Par défaut QHttp et la methode GET
    Bonjour,
    je me suis lancé dans Qt et voudrais recupere le code source d'une page web et l'afficher dans un "label" de ma fenetre j'arrive a la mettre dans un fichier mais j'ai un probleme pour afficher le code sans qu'il soit dans un fichier

    Mon probleme est la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    http->get(adresse.toString(), source);
    resultat->setText(source);
     
    //rien ne s'affiche :(
    Donc voila si quelqu'un peut m'aider....

    Merci d'avance

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    salut,

    Ton problème vient probablement du fait que la fonction QHttp::get(...) fonctionne de manière asynchrone.

    Citation Envoyé par QtDoc
    The function does not block; instead, it returns immediately. The request is scheduled, and its execution is performed asynchronously.
    En d'autres termes, quand dans ton code la ligne 'get(...)' a fini d'être exécutée, ce n'est pas pour autant que la réponse a été reçue. C'est simplement que la requête a bien été envoyée vers la cible et donc que tu recevras la réponse (le code source de la page) un peu plus tard (probablement dans quelques dizaines de ms, mais ça peut très bien être dans 10 secondes ou bien encore dans 3 minutes).

    Pour savoir quand la réponse sera effectivement disponible, il faut stocker l'entier (un identifiant unique) retourné par la fonction QHttp::get(...) et connecter un slot au signal QHttp:requestFinished(int id, bool error).

    Lorsque ce slot est appelé avec pour id la valeur stockée auparavant, tu peux seulement faire ton resultat->setText(source);

  3. #3
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Je comprends pas bien peut tu préciser ce qu'est ta variable source (le type) ?
    Je pense que tu devrais passer par un QBuffer et après réussir a le transformer en QString pour pouvoir afficher le texte. Il y peut être une meilleur solution mais comme ca j'ai pas plus d'idée. Sinon pour un exemple avec d'utilisation de QHttp et de get() tu as la FAQ.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Par défaut
    ok merci je vais essayer de faire comme ce que m'a dit nouknouk
    mais comme je suis depuis peu sous qt
    tu peut me montrer en gros comment on fait


    merci beaucoup

  5. #5
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Entre le tutoriel sur les signaux/slots et la Doc Qt de QHttp, tu t'en sortiras tout seul comme un grand j'en suis persuadé

    Un petit indice au passage: QHttp écrit uniquement dans un QIODevice et setText n'accepte quant à lui qu'un QString. Or:
    - QBuffer est un QIODevice
    - que sa fonction QBuffer::buffer() te retourne un QByteArray
    - qu'un des constructeurs de QString accepte en paramètre un QByteArray

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Par défaut
    Voila mon code source complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include <QtGui>
    #include <QtCore>
    #include <QtDebug>
    #include <QtNetwork>
    #include "mainwindow.h"
     
    //
    MainWindowImpl::MainWindowImpl( QWidget * parent, Qt::WFlags f) 
    	: QMainWindow(parent, f)
    {   
     
        http = new QHttp(this);
    	setupUi(this);
     
         connect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(httpRequestFinished(int, bool)));
         //connect(http, SIGNAL(dataReadProgress(int, int)),this, SLOT(updateDataReadProgress(int, int)));
         connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),this, SLOT(readResponseHeader(const QHttpResponseHeader &)));											
    	 connect(btsend, SIGNAL(clicked()),this, SLOT(downloadFile()));
     
    }
     
    	void MainWindowImpl::downloadFile()
     	{
     
         QUrl url(host->text());  
         http->setHost(url.host(), url.port() != -1 ? url.port() : 80);   
         http->setUser(url.userName(), url.password());
         source = http->get(url.path());
         httpRequestAborted = false;     
         //httpGetId = http->get(url.path(), file);
     
     
        }
     
     
         void MainWindowImpl::httpRequestFinished(int requestId, bool error)
         {
     
             if (error) {
                    resultat->setText("error");		
             } else {
     
    		resultat->setText(source);
     
             }
     
          }
     
         void MainWindowImpl::readResponseHeader(const QHttpResponseHeader &responseHeader)
         {
             if (responseHeader.statusCode() != 200) {
                 resultat->setText("error");
                 httpRequestAborted = true;
                 http->abort();
                 return;
             }
         }
    j'ai essayer de faire ce que tu m'a dit --> httpRequestFinished mais ca ne marche tjr pas

  7. #7
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    tu utilises la mauvaise version de QHttp:get(), celle avec un seul argument (ie. le second argument est celui par défaut, soit QIODevice* = '0'). Cette 'version' n'est pas celle que je t'ai décrite. Si tu veux l'utiliser, elle est à employer de pair avec les fonction 'read' ou 'readAll'.

    Citation Envoyé par DocQt
    If the IO device to is 0 the readyRead() signal is emitted every time new content data is available to read.

    If the IO device to is not 0, the content data of the response is written directly to the device. Make sure that the to pointer is valid for the duration of the operation (it is safe to delete it when the requestFinished() signal is emitted).
    Dans le deuxième cas (celui que j'ai évoqué ci-dessus), spécifie un QIODevice qui va bien (cf. mes indices) pour que le résultat de ta requête soit stocké dans ce QIODevice, résultat que tu récupèreras ensuite pour le convertir en QString et enfin le passer à setText().

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/09/2005, 12h17
  2. prob tres simple, form, method get
    Par killy-kun dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 25/08/2005, 10h29
  3. Faire Choix du fichier destination methode GET grace a JS
    Par ahage4x4 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 14/06/2005, 15h26
  4. la méthode get du Net::telnet
    Par BENCHEKROUN dans le forum Modules
    Réponses: 4
    Dernier message: 25/05/2005, 12h31
  5. probleme avec methode get
    Par Tr@nkill dans le forum ASP
    Réponses: 2
    Dernier message: 12/05/2005, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo