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 :

Les fonctions dans les fonctions, comment faire ça proprement ?

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut Les fonctions dans les fonctions, comment faire ça proprement ?
    Bonjour,
    Je suis en train de réaliser une fonction pour récupérer le code source d'une page internet et j'utilise donc la méthode connect() pour s'assurer que la page a fini de charger avant de passer à la suite du code. Ce que j'aimerai faire, c'est écrire du code à la suite de la méthode connect (en gros mettre le code de la méthode connect à la suite) car j'aimerai renvoyer une QVariantList. Sauf que je ne voit pas ce que le slot pourrait renvoyer d'autre que void. Voila, j'espère avoir été assez clair.

    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
    QVariantList TheMovieDB::search(const QString &title)
    {
        api_mode="search/movie";
        api_queries="&fr&query=" + title;
        api_query=api_url+api_mode+api_key+api_queries;
        view->load(QUrl(api_query));
        QObject::connect(view, SIGNAL(loadFinished(bool)), this, SLOT(resultSearch(bool))); // là je peux rien mettre à la suite car il faut attendre que la page ait chargé
    }
     
    void TheMovieDB::resultSearch(bool)
    {
        QString plainText = view->page()->currentFrame()->toPlainText();
        QJsonDocument document = QJsonDocument::fromJson(plainText.toUtf8());
        QJsonObject jsonObj = document.object();
        QJsonArray obj = jsonObj["results"].toArray();
     
        for(int i = 0; i < obj.count(); i++){ //il faudrait que le contenu de cette boucle soit renvoyé par la méthode search
            qDebug()<< obj[i].toObject()["title"].toString();
            qDebug()<< obj[i].toObject()["id"].toInt();
            qDebug()<< obj[i].toObject()["release_date"].toString();
        }
     
    }
    Merci pour votre aide.
    Cordialement

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    J'ai cherché et on ne peut effectivement pas retourner de valeur avec le slot tel que je l'ai fait. Mais alors comment faire?

  3. #3
    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


    Si je comprends bien ton problème, il suffit d'ajouter une nouvelle couche de signaux et slots : quand ton slot a fini son exécution, il émet un nouveau signal avec la valeur à retourner en argument, auquel tu connectes le code à exécuter après.
    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 !

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    C'est pas ça que je voulait dire.
    Telle qu'est présentée la fonction Search, elle contient un connect qui s'occupe de lancer la fonction resultsSearch. Ce connect sert à delayer du code de façon à attendre que la page web ait fini de charger. Or en utilisant connect, je ne peut pas renvoyer le contenu de la page web à la fonction search. Dans mon cas elle contient du code JSon donc je souhaiterais que la fonction search retourne le document JSon.
    J'espère que c'est plus clair.

    EDIT: après réflexion, ça peut correspondre à ce que je veux faire. Mais c'est assez bizarre d'utiliser la méthode connect() uniquement pour ça.

    EDIT 2: en fait non, pas moyen de renvoyer des données avec connect(). Comment ils ont pas pu penser à ça?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Salut,

    Je pense que la classe QEventLoop pourrait répondre à ta demande.

    En gros dans ton cas il fraudait faire quelque chose comme ça:


    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
     
    QVariantList TheMovieDB::search(const QString &title)
    {   
        QEventLoop loop;
        api_mode="search/movie";
        api_queries="&fr&query=" + title;
        api_query=api_url+api_mode+api_key+api_queries;
        view->load(QUrl(api_query));
        QObject::connect(view, SIGNAL(loadFinished(bool)), &loop, SLOT(quit()));
        loop.exec(); A partir de là l'exécution s'arrête et le code qui suit ne sera exécuté qu’à la fin du chargement de la page.
        // suite de ton code ...
        QString plainText = view->page()->currentFrame()->toPlainText();
        QJsonDocument document = QJsonDocument::fromJson(plainText.toUtf8());
        QJsonObject jsonObj = document.object();
        QJsonArray obj = jsonObj["results"].toArray();
     
        for(int i = 0; i < obj.count(); i++){ //il faudrait que le contenu de cette boucle soit renvoyé par la méthode search
            qDebug()<< obj[i].toObject()["title"].toString();
            qDebug()<< obj[i].toObject()["id"].toInt();
            qDebug()<< obj[i].toObject()["release_date"].toString();
        }
    }
    Je travaille sur un projet de gestion de vidéothèque et j'ai une classe presque fini qui exploite TMDB et récupère toutes les infos d'un film. Si ça t'intéresse tu peux me contacter par MP.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    C'est une solution qui marche mais on me l'a déconseillée. La solution consiste à utiliser deux connect():
    -le premier pour s'assurer que le téléchargement est fini
    -on rempli une variable publique avec les valeurs
    -on utilise un connect() pour renvoyer la valeur à la classe qui la demande.

    Cordialement

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/02/2012, 10h02
  2. Réponses: 3
    Dernier message: 06/08/2009, 17h09
  3. Réponses: 4
    Dernier message: 11/09/2006, 16h55
  4. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 11h06

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