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

Discussion :

QWebView : requête multiple

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut QWebView : requête multiple
    Bonjour,

    En m'inspirant de la FAQ de Developpez.com (http://qt.developpez.com/faq/?page=m...ource-page-web), j'ai produit le code suivant afin de récupérer le contenu de plusieurs pages internet, dont les adresses successives sont stockées dans un tableau :
    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
     
    QWebview *view;
    QVector<QUrl>tableauUrl;
     
    [...remplissage du tableau...]
     
    for (int i(0); i < tableauUrl.size(); ++i)
        {
            const QUrl url = QUrl("tableauUrl[i]");
     
            view = new QWebView;
            view->load(url);
     
            connect(view, SIGNAL(loadFinished(bool)), this, SLOT(ResultatPageWeb(bool)));
        }
     
    void ResultatPageWeb(bool)
    {
        QWebPage *page = view->page();
        QWebFrame *frame = page->currentFrame();
        QString plainText = frame->toPlainText();
    }
    Si mon tableau est de taille 1, pas de souci, ça fonctionne, mais en cas de bouclage sur un tableau de taille x (> 1), seule la dernière adresse url est prise en compte (produisant x plainText identiques ).

    J'ai essayé d'installer des pauses (::Sleep(1000)), mais cela ne change rien... Une idée ?

    Bonne journée à tous

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonsoir,

    C'est en fait normal, parce que vous ne stockez qu'une seule WebView dans le pointeur view, que vous écrasez à chaque fois. Vous ne garderez ainsi que la dernière WebView créée dans ce pointeur. Pour palier à ce problème, je vous propose d'utiliser sender(), qui est une méthode retournant le QObject* qui a émis le signal ayant mené à l'appel du slot où sender() est appelé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void MyClass::ResultatPageWeb(bool)
    {
        QWebView *v = qobject_cast<QWebView *>(sender());
     
        if (v)
        {
            QWebPage *page = v->page();
            QWebFrame *frame = page->currentFrame();
            QString plainText = frame->toPlainText();
        }
    }
    Cela dit, je vous conseillerais plutôt la méthode proposée dans la FAQ utilisant QNetworkAccessManager, à moins que vous n'ayez besoin de stocker des cookies ou autre, car elle est bien plus light en terme de performances.

    Bonne soirée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    C'est beau d'avoir comme ça une compréhension en profondeur des processus et de déceler immédiatement l'erreur de conception ! Je vous envie... Ça marche bien sûr nickel; j'avais donné pour l'exemple une version simplifiée et aller ainsi à l'essentiel, mais je passe effectivement par QNetworkAccessManager pour gérer notamment un proxy.

    Un grand merci pour ces explications et bon week-end

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    À noter que ta ligne 9 const QUrl url = QUrl("tableauUrl[i]"); devrait plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const QUrl url = tableauUrl[i];
    Avec les guillemets tu utilises la chaine brute "tableauUrl[i]" même et non les éléments du tableau.

  5. #5
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Oui, oui bien sûr, c'était un mauvais copier-coller dans le texte de la discussion

  6. #6
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Citation Envoyé par Amnell Voir le message

    Cela dit, je vous conseillerais plutôt la méthode proposée dans la FAQ utilisant QNetworkAccessManager, à moins que vous n'ayez besoin de stocker des cookies ou autre, car elle est bien plus light en terme de performances.
    Pour être tout à fait complet et clore le sujet, il est préférable de rajouter une boucle pour attendre la fin de la réponse, sinon à moins d'avoir la fibre, le téléchargement de certaines pages risque d'être incomplet...

    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
    QNetworkAccessManager *manager = new QNetworkAccessManager;
    [...]
            const QUrl url = QUrl(tableauUrl[i]);
            const QNetworkRequest requete(url);
    
            QNetworkReply *reponse;
            reponse = manager->get(requete);
    
            QEventLoop loop;
            connect(reponse, SIGNAL(finished()), &loop, SLOT(quit()));
            loop.exec();
    
            view = new QWebView;
            view->load(reponse->url());
    
            connect(view, SIGNAL(loadFinished(bool)), this, SLOT(ResultatPageWeb(bool)));

  7. #7
    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
    Il n'est pas préférable d'ajouter une boucle pour ça . L'attente active te fait consommer du processeur tant que la condition n'est pas remplie (donc le processeur chauffe, consomme le peu d'énergie qui reste sur la batterie, le fil d'exécution courant est incapable de réagir à un autre stimulus externe comme une demande de fermeture de la fenêtre, j'en passe). Il vaut mieux utiliser les signaux et slots : tu connectes le signal finished() au traitement des données.

    Tu ne fais pas exactement de l'attente active, c'est un peu plus intelligent, mais ça continue à avoir des problèmes, par exemple décrits dans https://qt-project.org/forums/viewthread/20508.

    (Oh, juste en passant… Je ne suis même pas sûr qu'avoir la fibre optique soit utile dans ce cas : il me semble que, sans cette attente, tu récupères les données du premier paquet TCP, qui ne contient que le début du paquet HTTP, dont la taille est contrôlée par le serveur. À vérifier, toutefois.)
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Mysql] Requêtes multiples simultanées
    Par bitardo dans le forum JDBC
    Réponses: 6
    Dernier message: 02/07/2007, 10h46
  2. [MySQL] mysql requête multiple
    Par Hayabusa dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/05/2007, 16h20
  3. [AJAX] Requêtes multiples
    Par sbk.no.gaara dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/08/2006, 16h43
  4. [AJAX] Ajax requêtes multiples
    Par Teufboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/08/2006, 18h23
  5. [requête] multiple count
    Par mandrake_of_mandregas dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/01/2006, 19h05

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