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

PyQt Python Discussion :

ListView et modèle associé


Sujet :

PyQt Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    Par défaut ListView et modèle associé
    Bonjour,

    J'utlise PyQt/PySide et les modules unittest/doctest/HTMLTestRunner pour lancer des suites de tests avec un rendu HTML dans une IHM (pattern MVC imposé).

    J'ai un peu de mal pour cerner quel type de vue choisir pour ma liste de test à afficher mais on m'impose différentes actions :
    - Pouvoir rajouter/supprimer/modifer un test dans la liste
    - Afficher un icone en fonction de l'état du test

    Les test ne sont rien d'autres que des fichier (doctest) mais je dois pouvoir afficher une page html correspondant au test choisis dans ma liste ( vous me suivez ?)

    Bref, si quelqu'un pouvait m'aiguïé un peu plus sur la bonne démarche à adopter et surtout quel vue choisir pour ce type d'IHM?

    Merci !

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Ces rendus Html s'ouvrent normalement dans un navigateur web ?

    Et est-ce ce résultat que tu dois obtenir ?

    Regardes du coté de QtWebKit. Afficher une page web ne demande que quelques lignes de code.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Ces rendus Html s'ouvrent normalement dans un navigateur web ?

    Et est-ce ce résultat que tu dois obtenir ?

    Regardes du coté de QtWebKit. Afficher une page web ne demande que quelques lignes de code.
    Salut,

    En faite la webview est déja intégré c'est pour la ListView que je ne sait pas.

    Est-ce qu'une listeview est adapté dans mon cas?

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Heu oui, ça me parait même simple, donc je ne saisis peut-être pas tout.

    Admettons que tu as une liste de test

    testlist = ["test1", "test2", "test3", "test4"]

    et trois icônes,

    "notTested.png" pas encore testé
    "passed.png" test réussit
    "failed.png" test échoué

    Tu construis ton QListWidget

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    myList = QtGui.QListWidget(parent) # parent = le widget où tu places ta listWidget
    ...
    mylist.itemClicked.connect(item_selected)
    Ta fonction 'item_selected sera appelée à chaque fois qu'un élément de la liste sera cliqué.

    Ensuite tu places tes test dans la listWidget

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for test in testList:
        obj = QtGui.QListWidgetItem(myList)
        obj.setIcon(QtGui.QIcon("notTested.png"))
        obj.setText(test)
        obj.setTextAlignment(QtCore.Qt.AlignHCenter)
        obj.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
    Quand un test sera accomplit, tu changeras l'icône avec son index dans la liste

    par exemple le "test3" est réussit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    item = myList.item(2)
    item.setIcon("passed.png")
    Il faudra bien sur un peu plus de code que cela pour faire quelque chose de propre, mais le principe est là.

    QListWidget

    http://www.riverbankcomputing.co.uk/...istwidget.html

    Regardes les signaux il y en a qui conviennent peut-être mieux que clicked pour ton usage

    Et surtout QListWidget hérite de QListView

    http://www.riverbankcomputing.co.uk/...qlistview.html

    Dont tu auras besoin de certaines méthodes je pense entre autre à 'setFlow'
    qui permet un listage à l'horizontale (comme les navigateur de fichiers) ou à la verticale (comme heu .. la liste des courses).

    En Googlant tu devrais trouver plein d'exemples de QListWidget

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    salut,

    Merci pour ton exemple, j'étais parti sur la même idée mais avec un ListModel (au cas ou).

    Voila mon code actuel (qui ne marche et retourne un seul item de ma list testname) :

    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
    class TestListModel(QAbstractListModel):
        def __init__(self, parent=None):
            QAbstractListModel.__init__(self, parent)
            self.testnames = []
     
        def load_docfiles(self):
            cfg = Config()
            for filename in glob.glob(os.path.join(cfg.test_path, 'test_*.rst')):
                self.testnames = os.path.basename(filename)[5:-4]
                filepath = os.path.abspath(filename)
                print "load docfile", str(self.testnames)
            return str(self.testnames)
     
        def rowCount(self, index):
            return len(self.testnames)
     
        def data(self, index, role): 
            if role == Qt.DisplayRole:
                cfg = Config()
                for filename in glob.glob(os.path.join(cfg.test_path, 'test_*.rst')):
                    self.testnames = os.path.basename(filename)[:-4]
                    filepath = os.path.abspath(filename)
            return self.testnames
     
        def columnCount(self, index):
            pass
    Comment pourrais je faire pour remplir ma list view avec les test contenu dans mon test path ??

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    A vue d'oeil, je pense que tu n'as pas de bonnes lectures.

    Avant de parler de Qt parlons de python.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
            self.testnames = []
     
        def load_docfiles(self):
            cfg = Config()
            for filename in glob.glob(os.path.join(cfg.test_path, 'test_*.rst')):
                self.testnames = os.path.basename(filename)[5:-4]
                filepath = os.path.abspath(filename)
                print "load docfile", str(self.testnames)
            return str(self.testnames)
    Je suppose que ceci sert à te retourner la liste de tes fichiers de test.

    Est-ce le rôle d'une liste sous-classée de partir elle-même à la recherche de son contenu ? voilà qui se discute, toujours est-il que la méthode n'y est pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                self.testnames = os.path.basename(filename)[5:-4]
    self.testnames qui était censée être une liste devient maintenant une chaîne extraite d'un chemin complet, plus exactement ce qui se situe entre 'chemin/test_' et son extension

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                filepath = os.path.abspath(filename)
    Te donne le chemin mais dont tu ne semble pas avoir l'usage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            return str(self.testnames)
    Te retourne le fameux extrait du nom de fichier.

    Nous sommes bien d'accord qu'il n'y a plus de liste, là.

    Ceci aurait été beaucoup plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.testnames = glob.glob(os.path.join(cfg.test_path, 'test_*.rst'))
    Je suppose que dans ta listeWidget tu ne veux voir apparaître que le nom spécifique du test.

    Selon ma méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            for test in self.testnames:
                obj = QtGui.QListWidgetItem(myList)
                obj.setIcon(QtGui.QIcon("notTested.png"))
                obj.setText(self.set_text(test))
                obj.setTextAlignment(QtCore.Qt.AlignHCenter)
                obj.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
     
        def set_text(self, path):
            return = os.path.basename(path)[5:-4]
    Ensuite pour ta liste, utilise QListWidget et surtout pas QAbstractListModel qui n'a rien à voir avec tes besoins.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par VinsS Voir le message

    Je suppose que dans ta listeWidget tu ne veux voir apparaître que le nom spécifique du test.

    Selon ma méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            for test in self.testnames:
                obj = QtGui.QListWidgetItem(myList)
                obj.setIcon(QtGui.QIcon("notTested.png"))
                obj.setText(self.set_text(test))
                obj.setTextAlignment(QtCore.Qt.AlignHCenter)
                obj.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
     
        def set_text(self, path):
            return = os.path.basename(path)[5:-4]
    Ensuite pour ta liste, utilise QListWidget et surtout pas QAbstractListModel qui n'a rien à voir avec tes besoins.
    Mais est-ce que je ne serais pas limité en utilisant un ListWidget plutôt qu'un ListModel, dans quel cas utilisé l'un ou l'autre?

    euh je crois qu'il y a une erreur dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return = os.path.basename(path)[5:-4]
    Merci pour votre aide!

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/05/2013, 06h55
  2. Vue non compatible avec le code du modèle associé
    Par wassimha dans le forum Débuter
    Réponses: 0
    Dernier message: 26/08/2011, 12h36
  3. demande de conseil sur le modèle entité/association
    Par amandiiiiiine dans le forum Access
    Réponses: 3
    Dernier message: 02/01/2007, 00h34
  4. [VB.NET] Associer nouveaux items a une ListView
    Par size_one_1 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/12/2006, 14h32
  5. Outils pour la conception d'un modèle Entités-Association
    Par heddicmi dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 05/04/2005, 10h04

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