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 :

Utiliser une classe pour chaque composant ?


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut Utiliser une classe pour chaque composant ?
    Bonjour à tous,

    Je tente de me mettre à PySide et dans les exemples que je trouve, tout est fait pour que ça soit compréhensible (ce qui est logique). Hors je voudrais séparer les classes pour chaque QObject que j'utilise.


    Voici un exemple de ce que j'ai fait. Ce que je voudrais, c'est lorsque j'ouvre mon QFileDialog, récupérer le nom du fichier et l'ajouter dans ListModel qui hérite de QStandardItemModel.

    D'ailleurs mon code n'a pas de logique pour le coup. J'ai la méthode openFile dans la class MainWindow, il serait plus logique de l'avoir dans la class OpenFileDialog mais l'appel de openAction.triggered.connect(OpenFileDialog().openFile) (en ayant une méthode openFile dans ma class bien entendu) ne fonctionne pas. Même mon menu n'est pas dans une classe séparé (je n'y arrive pas :/)

    Si vous pouvez m'indiquer des infos pour refactorer tout ça je suis preneur.

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    import sys
    from PySide import QtGui, QtCore
     
     
    class MainWindow(QtGui.QMainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
     
            self.init_ui()
     
        def init_ui(self):
     
            openAction = QtGui.QAction(QtGui.QIcon('exit.png'), "&Open file", self)
            openAction.setShortcut('Ctrl+O')
            openAction.triggered.connect(self.openFile)
     
            exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), "&Quit", self)
            exitAction.setShortcut('Ctrl+Q')
            exitAction.triggered.connect(self.close)
     
            menubar = self.menuBar()
            file_menu = menubar.addMenu("&File")
            file_menu.addAction(openAction)
            file_menu.addAction(exitAction)
     
     
            self.list_view = ListView(self)
            self.setCentralWidget(self.list_view)
     
            self.setGeometry(300, 300, 300, 200)
            self.setWindowTitle("My title")
            self.show()
     
        def openFile(self):
            file = OpenFileDialog(self)
     
    class ListView(QtGui.QListView):
     
        def __init__(self, parent):
            super(ListView, self).__init__(parent)
            self.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
            self.layout = QtGui.QVBoxLayout(self)
     
     
            self.liste_model = ListModel(self)
            self.setModel(self.liste_model)
     
     
    class ListModel(QtGui.QStandardItemModel):
     
        def __init__(self, parent):
            super(ListModel, self).__init__(parent)
     
            foods = [
                'Cookie dough', # Must be store-bought
                'Hummus', # Must be homemade
                'Spaghetti', # Must be saucy
                'Dal makhani', # Must be spicy
                'Chocolate whipped cream' # Must be plentiful
            ]
     
            for food in foods:
                item = QtGui.QStandardItem(food)
                item.setCheckable(True)
     
                # Checked by default
                item.setCheckState(QtCore.Qt.Checked)
                self.appendRow(item)
     
    class OpenFileDialog(QtGui.QFileDialog):
        def __init__(self, parent):
            super(OpenFileDialog, self).__init__(parent)
     
            fname, _ = self.getOpenFileName(self, 'Open file')
            f = open(fname, 'r')
     
            with f:
                data = f.read()
                print(data)
     
    def main():
        app = QtGui.QApplication(sys.argv)
        ex = MainWindow()
        sys.exit(app.exec_())
     
     
    if __name__ == '__main__':
        main()
    Merci d'avance.

  2. #2
    Expert éminent

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

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

    D'abord ton fichier de données.

    Garde référence des données et récupère-les ensuite
    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
     
        def openFile(self):
            fd = OpenFileDialog(self)
            self.update_listview(fd.data)
     
    class OpenFileDialog(QtGui.QFileDialog):
        def __init__(self, parent):
            super(OpenFileDialog, self).__init__(parent)
     
            #fname, _ = self.getOpenFileName(self, 'Open file') Erreur avec PyQt4
            fname = self.getOpenFileName(self, 'Open file')
            f = open(fname, 'r')
            with f:
                self.data = f.read()
     
    class ListView(QtGui.QListView):
     
        def __init__(self, parent):
            super(ListView, self).__init__(parent)
            ...
     
        def update_listview(self, data):
            #... mise à jour du listView
    On ne sait pas réimplémenter un menuBar en l'instanciant de cette façon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            menubar = self.menuBar()
    Il faut en créer une nouvelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        def init_ui(self):
            ...
            menubar = MenuBar(self)
            self.setMenu(menubar)
            menubar.openAction.triggered.connect(self.openFile)
            menubar.exitAction.triggered.connect(self.close)
            ...
     
    class MenuBar(QtGui.QMenu):
        def __init__(self, parent):
            super(MenuBar, self).__init__(parent)
            openAction = QtGui.QAction(QtGui.QIcon('exit.png'), "&Open file", self)
            openAction.set .....

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse.

    Par contre je n'ai pas accès à update_listview :

    self.update_listview(file.data)
    AttributeError: 'MainWindow' object has no attribute 'update_listview'

    Sachant que self correspond à mon QMainWindow.

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    C'est moi qui ai été un peu vite, il fallait faire self.list_view.update_listview(file.data) bien sur.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    En effet ça fonctionne mieux . Par contre que mettre dans update_listview ? J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def update_listview(self, data):
        item = QtGui.QStandardItem(data)
        self.liste_model.appendRow(item)
    QStandardItem, car j'ai pris l'exemple de la liste foods qui les ajoute via cette méthode.

    Mais j'ai une erreur : (data étant le retour de QFileDialog, le path du fichier + son nom)

    item = QtGui.QStandardItem(data)
    TypeError: 'PySide.QtGui.QStandardItem' called with wrong argument types:
    PySide.QtGui.QStandardItem(OpenFileDialog)
    Supported signatures:
    PySide.QtGui.QStandardItem()
    PySide.QtGui.QStandardItem(PySide.QtGui.QIcon, unicode)
    PySide.QtGui.QStandardItem(PySide.QtGui.QStandardItem)
    PySide.QtGui.QStandardItem(unicode)
    PySide.QtGui.QStandardItem(int, int = 1)


    Par la même occasion, connaîtrais-tu un livre sur PySide/PyQt qui est récent ? (français ou anglais). Ou bien même des sites avec screencasts pour débutant ?

  6. #6
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Les data sont les données lues dans le fichier.

    Pour rappel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            fname = self.getOpenFileName(self, 'Open file')
            f = open(fname, 'r')
            with f:
                self.data = f.read()
    Comme tu utilises read() c'est le texte entier, tu ne peux donc pas le passer directement au QStandardItem.

    Et il n'y a que toi qui connais le contenu du fichier, comment les données y sont représentées.

    Voir aussi le bouquin de Mark Summerfield
    http://www.cs.washington.edu/researc.../pyqt-book.pdf

Discussions similaires

  1. [Oracle] Instancier une classe pour chaque résultat avec OCI_
    Par H.ile dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/01/2012, 13h52
  2. utiliser une classe pour gerer les signaux
    Par TrueBeliever dans le forum Qt
    Réponses: 2
    Dernier message: 21/12/2006, 17h57
  3. Utilisation de classes pour gérer une table
    Par mathias dans le forum Access
    Réponses: 11
    Dernier message: 30/08/2006, 16h57
  4. Réponses: 2
    Dernier message: 30/05/2006, 15h26
  5. [Composants] TRichEdit: Une police pour chaque ligne
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/03/2003, 15h59

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