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 :

QProcess multiple / QTreeWiew dans onglets


Sujet :

Qt

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut QProcess multiple / QTreeWiew dans onglets
    Bonjour,

    J'ai une fenêtre contenant un nombre variable d'onglets (= nombre de serveurs décrits dans un fichier ini). Chaque onglet contient un QTreeView. La vue doit être peuplée avec une liste de projets récupérée sur le serveur attribué à l'onglet, grâce à un utilitaire. Ce dernier est lancé et la liste récupérée par QProcess.
    Voici comment je procède :

    Dans le constructeur de la fenêtre

    (...)
    Je déclare le QtabWidget
    Je boucle sur la liste des serveurs,
    _Je crée un widget dans lequel je place les éléments nécessaires dont le QTreeWidget
    _J'ajoute le widget au QtabWidget
    (...)
    Je boucle sur la liste des serveurs,
    _Pour chaque serveur j'appelle l'utilitaire via QProcess
    (...)
    Je connecte le signal readyReadStandardOutput() de l'objet QProcess à la fonction suivante :
    _Lecture et formatage de readAllStandardOutput() -> liste
    _Association à la vue d'une fonction prenant la liste en paramètre et renvoyant un modèle

    J'ai bien les onglets mais dans le meilleur des cas une seul vue fonctionne.

    Mon besoin soulève plusieurs problèmes :
    Comment relier une lecture de la sortie de l'utilitaire au bon "serveur/onglet" ?
    Comment déclarer et gérer le nombre adéquate de QProcess ?
    Comment connecter le signal readyReadStandardOutput de chacun des QProcess au bon slot ?
    Comment relier le modèle à la bonne vue ?

    Après de nombreux modifications et essais je me tourne vers vous.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    J'ai un peu de mal à cerner ton problème. Ta démarche me semble plutôt correcte pour répondre à ton besoin.

    Si tu veux garder une référence sur tous tes objets, tu peux les mettre dans des QList. Quand ton slot connecté au signal readAllStandardOutput est appelé, tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QProcessù currentProc = (QProcess*)sender();
    Ensuite tu récupère l'index de ton processActuel dans la liste, et tu associes la sortie de ton utilitaire au tab du même index que ton process (puisque tu as un process par QTreeWidget).

    Mais je pense qu'il y a un moyen de faire ça sans forcément gardé de référence.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  3. #3
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    Si j'ai bien compris, chaque widget "onglet" à le même fonctionnement : il communique avec une autre appli (via QProcess) et récupère des infos qu'il affiche dans un QTreeView.

    Si c'est bien le cas, je te suggère de créer une classe (Onglet, par exemple) qui factorise ce fonctionnement similaire. Cette classe possèdera son propre QProcess et ses connections pour établir un modèle et bâtir sa vue autour.

    Comment relier une lecture de la sortie de l'utilitaire au bon "serveur/onglet" ?
    => Le QProcess qui est maintenant interne à ta classe est relié directement à tes Slots persos.

    Comment déclarer et gérer le nombre adéquate de QProcess ?
    => Ce n'est plus cette donnée que tu comptes, mais le nombre d'instance de ta nouvelle classe, en fonction du nombre de projets existants.

    Comment connecter le signal readyReadStandardOutput de chacun des QProcess au bon slot ?
    => Plus qu'un seul QProcess par classe, et un seul Slot correspondant.

    Comment relier le modèle à la bonne vue ?
    => le modèle est interne à ta nouvelle classe, qui hérite de QWidget, représentant de ta vue.


    Ce n'est qu'une idée, ton travail semble assez complexe, j'espère que ça pourra t'aider.
    Un clavier Azerty en vaut deux.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    @Ryo2468 :
    C'est une excellente façon d'aborder le problème, très "objet", je pense mettre en œuvre ta solution.

    @Gulish :
    Je ne connaissais pas la méthode sender.
    Tu suggères donc de mettre dans la fonction SLOT connectée au SIGNAL readyReadStandardOutput le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QProcess* currentProc = (QProcess*)sender();
    currentProc me donne le pointeur du QProcess appelant, que je recherche dans ma QList et je place le résultat dans l'onglet de même index.
    C'est bien ça ?

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    currentProc me donne le pointeur du QProcess appelant, que je recherche dans ma QList et je place le résultat dans l'onglet de même index.
    C'est bien ça ?
    En effet. Ca correspond à ce que tu voulais faire non ? (si j'ai bien compris ton problème)

    La solution de Ryo sera sans doute plus claire si ton code est amené à être repris ou consulté par un tiers.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  6. #6
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    La méthode sender() appelable dans un SLOT permet de connaitre l'objet qui à émit le signal connecté à ce SLOT.

    Si tu es sûr de toi (et donc de ton cast), tu peux procéder comme écrit. Je te conseille quand même de protéger ton code (pour éviter les crashs violent de ton appli) :

    Dans le slot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //On cast le sender en QProcess* (pour ton exemple)
    QProcess * process = qobject_cast<QProcess*>(sender()); 
     
    // On teste la réussite du cast, si ce slot est connecté à d'autres objets que des QProcess*, tu aura un crash
    if(process)
    {
       //Ton traitement
    }
    Un clavier Azerty en vaut deux.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    C'est codé et après correction des bugs traditionnels ça marche.
    Merci !

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

Discussions similaires

  1. Image dans onglet
    Par xtiand4 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 24
    Dernier message: 22/11/2011, 12h24
  2. Onglet dans Onglet
    Par lito74 dans le forum Access
    Réponses: 9
    Dernier message: 26/10/2006, 16h27
  3. Réponses: 7
    Dernier message: 20/09/2006, 11h04
  4. Réponses: 41
    Dernier message: 17/05/2006, 17h01
  5. [VB.NET] Image dans onglet
    Par olbi dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/05/2006, 17h02

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