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

Réseau Discussion :

[QNetworkReply] Problème avec sender


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut [QNetworkReply] Problème avec sender
    Bonjour,

    je débute avec QT et je voulais faire un petit programme de téléchargement de page web pour commencer. Le programme est en mode console (linux).

    Je me suis inspiré d'exemples que j'ai trouvé sur le net.
    J'ai l'impression d'avoir des problèmes avec les libs QNetwork*.

    La compilation me remonte les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    src/main.cpp:15:61: error: ‘connect’ was not declared in this scope
    src/main.cpp:21:60: error: ‘sender’ was not declared in this scope
    J'avoue ne pas comprendre, les méthodes semblent exister dans la doc de QT. Problèmes de portées, de public/private ? Je ne suis pas encore très à l'aise avec ces notions.

    Voici les sources :

    main.cpp
    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
     
    #include "main.h"
     
    #include <QtNetwork>
    #include <QNetworkReply>
    #include <QNetworkRequest>
    #include <QNetworkAccessManager>
     
    void googleNews::telechargement()
    {
     
        const QUrl url = QUrl("http://www.google.fr"); //On récupére l'URL entrée par l'utilisateur.
        const QNetworkRequest requete(url); //On crée notre requête
        QNetworkAccessManager *m = new QNetworkAccessManager;
        QNetworkReply *r = m->get(requete);
        connect(r, SIGNAL(finished()), this, SLOT(enregistrer()));
        connect(r, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(messageErreur(QNetworkReply::NetworkError)));
    }
     
    void googleNews::messageErreur(QNetworkReply::NetworkError)
    {
        QNetworkReply *r = qobject_cast<QNetworkReply*>(sender());
        //QMessageBox::critical(this, "Erreur", "Erreur lors du chargement. V�rifiez votre connexion internet ou r�essayez plus tard <br /><br /> Code de l'erreur : <br /><em>" + r->errorString() + "</em>");
        close();
    }
     
    void googleNews::enregistrer()
    {
        QNetworkReply *r = qobject_cast<QNetworkReply*>(sender()); //On récupére la réponse du serveur
        QFile f("/tmp/fichier.txt"); //On ouvre le fichier
        f.open(QIODevice::WriteOnly);
        f.write(r->readAll()); ////On lit la réponse du serveur que l'on met dans un fichier
        f.close(); //On ferme le fichier
        r->deleteLater(); //IMPORTANT : on emploie la fonction deleteLater() pour supprimer la réponse du serveur.
        //Si vous ne le faites pas, vous risquez des fuites de mémoire ou autre.
     
    //    QMessageBox::information(this, "Fin de téléchargement", "Téléchargement terminé !"); //On indique que tout s'est bien passé
        close(); //On ferme le programme
    }
     
    int main(int argc, char* argv[])
    {
        googleNews gn;
        gn.telechargement(); 
    }
    Le main.h

    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
     
    #ifndef __MAIN_H__
    #define __MAIN_H__
     
    #include <QtNetwork>
    #include <QNetworkReply>
    #include <QNetworkRequest>
    #include <QNetworkAccessManager>
     
     
     
    class googleNews
    {
        Q_OBJECT
     
     
        public:
     
        private slots:
            void telechargement();
            void enregistrer();
            void messageErreur(QNetworkReply::NetworkError);
     
        private:
     
    };
     
     
    #endif // __MAIN_H__
    Si quelqu'un a une piste, je la prend.

    Merci d'avance.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    J'avoue ne pas comprendre, les méthodes semblent exister dans la doc de QT. Problèmes de portées, de public/private ? Je ne suis pas encore très à l'aise avec ces notions.
    Une méthode private n'est accessible que depuis l'intérieur de la classe, pas les classes en héritant ; protected, à la classe et ses héritières ; public, à tout le monde. Donc ne sont documentées que les protected et public.

    Tu peux jeter un coup d'oeil à ceci : http://tcuvelier.developpez.com/qt/u...elechargement/.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut
    Merci pour ta réponse.
    J'ai modifié un peu la définition de la classe : ajout public QObject et passage des slots de privé à public (pas propre pour l'instant, mais je creuserais ce point par la suite).
    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
     
    #ifndef __MAIN_H__
    #define __MAIN_H__
     
    #include <QtNetwork>
    #include <QNetworkReply>
    #include <QNetworkRequest>
    #include <QNetworkAccessManager>
    #include <QApplication>
     
     
    class googleNews : public QObject
    {
        Q_OBJECT
     
     
        public:
     
        public slots:
            void telechargement();
            void enregistrer();
            void messageErreur(QNetworkReply::NetworkError);
     
        private:
     
    };
     
     
    #endif // __MAIN_H__
    Maintenant, ça compile mais j'ai l'erreur suivante à l'execution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QObject::startTimer: QTimer can only be used with threads started with QThread
    Si je comprend bien ce que je lis, c'est en rapport avec l'attente des signaux finished, etc... mais sur tout les exemples que je vois et qui marchent chez moi, je ne vois jamais rien de plus. Est ce car je n'ai que des exemples avec GUI et que dans ce cas, la gestion des threads est différentes ?

Discussions similaires

  1. Problème de comparaison avec "sender"
    Par vgiant dans le forum VB.NET
    Réponses: 5
    Dernier message: 13/09/2009, 13h10
  2. Réponses: 2
    Dernier message: 02/10/2008, 12h06
  3. Problème avec (Sender as..)
    Par fred7 dans le forum Débuter
    Réponses: 16
    Dernier message: 13/09/2007, 13h25
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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