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 :

Séparer l'interface et les différents événements


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 Séparer l'interface et les différents événements
    Bonjour à tous,

    Je tente de faire quelque chose de propre pour plus de lisibilité, pour le test, j'ai donc créer une UI avec Qt Creator et convertit en .py. Ça fonctionne bien, le problème vient des events qui ne se lance pas.

    Voici mon UI :

    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
     
    from PySide import QtGui, QtCore
     
     
    class MainWindowUI(object):
     
        def __init__(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            MainWindow.setMinimumSize(QtCore.QSize(800, 600))
            MainWindow.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates))
            self.centralWidget = QtGui.QWidget(MainWindow)
            self.centralWidget.setObjectName("centralWidget")
            self.gridLayout = QtGui.QGridLayout(self.centralWidget)
            self.gridLayout.setObjectName("gridLayout")
            self.verticalLayout = QtGui.QVBoxLayout()
            self.verticalLayout.setObjectName("verticalLayout")
            self.listView = QtGui.QListView(self.centralWidget)
            self.listView.setObjectName("listView")
            self.verticalLayout.addWidget(self.listView)
            self.horizontalLayout_2 = QtGui.QHBoxLayout()
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
            self.horizontalLayout_2.addItem(spacerItem)
            self.btnRemoveSelection = QtGui.QPushButton(self.centralWidget)
            self.btnRemoveSelection.setObjectName("btnRemoveSelection")
            self.horizontalLayout_2.addWidget(self.btnRemoveSelection)
            self.verticalLayout.addLayout(self.horizontalLayout_2)
            self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
            self.horizontalLayout = QtGui.QHBoxLayout()
            self.horizontalLayout.setObjectName("horizontalLayout")
            self.lbl_output = QtGui.QLabel(self.centralWidget)
            self.lbl_output.setObjectName("lbl_output")
            self.horizontalLayout.addWidget(self.lbl_output)
            self.txtOutput = QtGui.QLineEdit(self.centralWidget)
            self.txtOutput.setEnabled(False)
            self.txtOutput.setReadOnly(False)
            self.txtOutput.setObjectName("txtOutput")
            self.horizontalLayout.addWidget(self.txtOutput)
            self.btnBrowse = QtGui.QPushButton(self.centralWidget)
            self.btnBrowse.setObjectName("btnBrowse")
            self.horizontalLayout.addWidget(self.btnBrowse)
            self.btnSsave = QtGui.QPushButton(self.centralWidget)
            self.btnSsave.setEnabled(False)
            self.btnSsave.setCheckable(False)
            self.btnSsave.setChecked(False)
            self.btnSsave.setAutoDefault(False)
            self.btnSsave.setDefault(False)
            self.btnSsave.setObjectName("btnSsave")
            self.horizontalLayout.addWidget(self.btnSsave)
            self.gridLayout.addLayout(self.horizontalLayout, 2, 0, 1, 1)
            spacerItem1 = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
            self.gridLayout.addItem(spacerItem1, 1, 0, 1, 1)
            MainWindow.setCentralWidget(self.centralWidget)
            self.menuBar = QtGui.QMenuBar(MainWindow)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menuBar.setObjectName("menuBar")
            self.menu_File = QtGui.QMenu(self.menuBar)
            self.menu_File.setObjectName("menu_File")
            MainWindow.setMenuBar(self.menuBar)
            self.action_Quit = QtGui.QAction(MainWindow)
            self.action_Quit.setObjectName("action_Quit")
            self.menu_File.addAction(self.action_Quit)
            self.menuBar.addAction(self.menu_File.menuAction())
     
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
            #self.btnBrowse.clicked.connect(self.test)
     
        # def test(self):
        #     print("test")
     
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Crawler", None, QtGui.QApplication.UnicodeUTF8))
            self.btnRemoveSelection.setText(QtGui.QApplication.translate("MainWindow", "Remove selection", None, QtGui.QApplication.UnicodeUTF8))
            self.lbl_output.setText(QtGui.QApplication.translate("MainWindow", "Output", None, QtGui.QApplication.UnicodeUTF8))
            self.btnBrowse.setText(QtGui.QApplication.translate("MainWindow", "...", None, QtGui.QApplication.UnicodeUTF8))
            self.btnSsave.setText(QtGui.QApplication.translate("MainWindow", "Save", None, QtGui.QApplication.UnicodeUTF8))
            self.menu_File.setTitle(QtGui.QApplication.translate("MainWindow", "&File", None, QtGui.QApplication.UnicodeUTF8))
            self.action_Quit.setText(QtGui.QApplication.translate("MainWindow", "&Quit", None, QtGui.QApplication.UnicodeUTF8))
            self.action_Quit.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+Q", None, QtGui.QApplication.UnicodeUTF8))
    Si je décommente le signal self.btnBrowse.clicked.connect(self.test) et la méthode qui va avec ça fonctionne bien, le soucis c'est que je veux le signal dans mon autre classe qui hérite de l'UI, voici donc le code :

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from PySide import QtGui, QtCore
    from main_window_ui import MainWindowUI
     
     
    class MainWindow(MainWindowUI):
     
        def __init__(self):
            super(MainWindow, self).__init__()
     
            self.btnBrowse.clicked.connect(self.test)
     
        def test(self):
            print('test')
     
     
    def main():
     
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = MainWindowUI(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
     
     
    if __name__ == '__main__':
        main()
    Et là ça ne fonctionne pas quand je clic sur le bouton concerné :/. Vous avez une idée du problème ?

    D'ailleurs pour vous quel est le meilleur moyen de séparer l'UI du code de l'application ?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En espérant que ça marche de la même façon en PySide et en PyQt4, voilà comment je fais.

    J'ai ajouté closeEvent (qui s'exécute à la demande de fermeture de la fenêtre) pour montrer que de cette façon, il est facile de surcharger les méthodes de QMainWindows, y compris celles qui reçoivent des évènements.

    Ce n'est pas aussi simple dans ton code puisque l'ancêtre de ta classe MainWindow est MainWindowUIest qui a elle-même pour ancêtre: object de Python et non un objet de Qt4.


    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import sys
     
    from PyQt4 import QtCore, QtGui
    from programme_ui import Ui_MainWindow
     
    #############################################################################
    class Fenetre(QtGui.QMainWindow):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
     
            # => les objets de Qt4 peuvent être manipulés, précédés de self.ui
     
        def closeEvent(self, event):
            reponse = QtGui.QMessageBox.question(self,
                "Message",
                "Etes-vous sûr(e) de vouloir quitter?",
                QtGui.QMessageBox.Yes,
                QtGui.QMessageBox.No)
     
            if reponse == QtGui.QMessageBox.Yes:
                event.accept() # on accepte la fermeture de la fenêtre
            else:
                event.ignore()# on refuse la fermeture de la fenêtre
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  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
    Oui, en effet, je me suis aperçu que je ne faisait pas appel à ma class parente. Pour ça que ça ne fonctionnait pas.

    Je me bataille maintenant avec les QXView . D'ailleurs on peut utiliser des colonnes sur un QListView, pour le coup j'ai trouvé que pour QTreeview, mais c'est pas approprié à mon besoin. Et le QTableView non plus, sachant que c'est plus une représentation d'une base de donnée pour moi au niveau du design du composant. Le QListView avec colonne serait parfait . C'est possible ?

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Rtransat Voir le message
    Je me bataille maintenant avec les QXView . D'ailleurs on peut utiliser des colonnes sur un QListView, pour le coup j'ai trouvé que pour QTreeview, mais c'est pas approprié à mon besoin. Et le QTableView non plus, sachant que c'est plus une représentation d'une base de donnée pour moi au niveau du design du composant. Le QListView avec colonne serait parfait . C'est possible ?
    Je n'en sais pas assez sur ce que tu veux faire avec pour te donner mon avis.

    A noter que QTableView, comme d'ailleurs les autres ...View, a besoin d'un "model", mais les données peuvent être une simple liste.

    Et comme c'est une nouvelle question, commence un nouveau fil en expliquant ce que tu veux faire: tu auras plus de chance d'avoir des réponses.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

Discussions similaires

  1. [Google Adsense] Séparer les différents sites
    Par Janitrix dans le forum Publicité
    Réponses: 2
    Dernier message: 01/11/2007, 23h06
  2. Réponses: 10
    Dernier message: 08/07/2007, 17h15
  3. Séparer les différents chiffres d'un nombre
    Par Sandro Munda dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/10/2006, 18h48
  4. [PEAR][HTML_QuickForm] Comment séparer les différents champs ?
    Par mohican13 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 17/02/2006, 08h21
  5. [SWING] Mise a jour de l'interface dans les événements
    Par woods dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 23/11/2005, 15h46

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