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 :

Petite aide avec Qt Designer


Sujet :

PyQt Python

  1. #1
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut Petite aide avec Qt Designer
    Bonjour,

    Je me lance dans PyQt et j'essaye actuellement QtDesigner afin de voir si son utilisation peut m'aider ou non.

    Je commence un comprendre un peu les subtilités du programme, mais j'ai un petit souci au moment de lancer le code .py obtenu dans le cas suivant:

    Dans QtDesigner, j'ai affecté un slot personnalisé à un bouton.
    1°) J'aimerai savoir si ce slot est programmable depuis QtDesigner (j'entends par là est-il possible de rentrer le code dedans directement ou faut il attendre d'avoir générer le .py)

    2°) Après la génération du .py, j'obtiens entre autre cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QObject.connect(self.pushButton_2, QtCore.SIGNAL("clicked()"), MainWindow.slot1)
    Malheureusement je ne parviens pas à créer la def correspondante à cette action. Pour palier à ceci j'ai fait ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        QtCore.QObject.connect(self.pushButton_2, QtCore.SIGNAL("clicked()"), self.slot1)
     
    ...
     
    def slot1(self)
    Il y a t il une autre solution?

    D'avance merci de votre aide

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Bonjour,

    pour être bien sûr de ce que tu fais:

    - tu as écris un .ui avec QtDesigner: par exemple toto_ui.ui
    - tu as converti ce .ui en .py avec l'utilitaire pyuic4: toto_ui.py

    ensuite, tu écris ton propre toto.py qui fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from toto_ui import Ui_TaMainWindow
     
    class TaMainWindow(QMainWindow,Ui_TaMainWindow):
        def __init__(self, parent):
            super(TaMainWindow,self).__init__(parent)
            self.setupUi(self)
        def slot1(self):
            print "slot1"
    c'est bien ça ?

  3. #3
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut
    Presque.

    En fait je ne retouche quasi pas au .py obtenu.
    Après l'utilisation de pyuic voici ce que j'obtiens:

    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
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'main.ui'
    #
    # Created: Mon Jun 28 13:23:57 2010
    #      by: PyQt4 UI code generator 4.7.3
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt4 import QtCore, QtGui
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.pushButton = QtGui.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(630, 520, 75, 23))
            self.pushButton.setObjectName("pushButton")
            self.label = QtGui.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(20, 20, 91, 16))
            self.label.setObjectName("label")
            self.label_2 = QtGui.QLabel(self.centralwidget)
            self.label_2.setGeometry(QtCore.QRect(20, 50, 61, 16))
            self.label_2.setObjectName("label_2")
            self.lineEdit = QtGui.QLineEdit(self.centralwidget)
            self.lineEdit.setGeometry(QtCore.QRect(100, 20, 113, 20))
            self.lineEdit.setObjectName("lineEdit")
            self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
            self.pushButton_2.setGeometry(QtCore.QRect(540, 520, 75, 23))
            self.pushButton_2.setObjectName("pushButton_2")
            self.pushButton_3 = QtGui.QPushButton(self.centralwidget)
            self.pushButton_3.setGeometry(QtCore.QRect(450, 520, 75, 23))
            self.pushButton_3.setObjectName("pushButton_3")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20))
            self.menubar.setObjectName("menubar")
            self.menuFichier = QtGui.QMenu(self.menubar)
            self.menuFichier.setObjectName("menuFichier")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtGui.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.actionQuitter = QtGui.QAction(MainWindow)
            self.actionQuitter.setObjectName("actionQuitter")
            self.actionOuvrir = QtGui.QAction(MainWindow)
            self.actionOuvrir.setObjectName("actionOuvrir")
            self.menuFichier.addSeparator()
            self.menuFichier.addAction(self.actionQuitter)
            self.menubar.addAction(self.menuFichier.menuAction())
     
            self.retranslateUi(MainWindow)
            QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), MainWindow.close)
            QtCore.QObject.connect(self.actionQuitter, QtCore.SIGNAL("activated()"), MainWindow.close)
            QtCore.QObject.connect(self.pushButton_2, QtCore.SIGNAL("clicked()"), self.lineEdit.clear)
            QtCore.QObject.connect(self.pushButton_3, QtCore.SIGNAL("clicked()"), MainWindow.slot1)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
            self.pushButton.setToolTip(QtGui.QApplication.translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
    "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
    "p, li { white-space: pre-wrap; }\n"
    "</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
    "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Boutton pour quitter l\'application</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
            self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Quitter", None, QtGui.QApplication.UnicodeUTF8))
            self.label.setText(QtGui.QApplication.translate("MainWindow", "txt1", None, QtGui.QApplication.UnicodeUTF8))
            self.label_2.setText(QtGui.QApplication.translate("MainWindow", "txt2", None, QtGui.QApplication.UnicodeUTF8))
            self.pushButton_2.setText(QtGui.QApplication.translate("MainWindow", "Effacer", None, QtGui.QApplication.UnicodeUTF8))
            self.pushButton_3.setText(QtGui.QApplication.translate("MainWindow", "Imprimer", None, QtGui.QApplication.UnicodeUTF8))
            self.menuFichier.setTitle(QtGui.QApplication.translate("MainWindow", "Fichier", None, QtGui.QApplication.UnicodeUTF8))
            self.actionQuitter.setText(QtGui.QApplication.translate("MainWindow", "Quitter", None, QtGui.QApplication.UnicodeUTF8))
            self.actionOuvrir.setText(QtGui.QApplication.translate("MainWindow", "Ouvrir", None, QtGui.QApplication.UnicodeUTF8))
            self.actionOuvrir.setToolTip(QtGui.QApplication.translate("MainWindow", "Ouvrir", None, QtGui.QApplication.UnicodeUTF8))
     
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    Ce que souhaite, c'est créer la def slot1() comme ci-dessous par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def slot1():
        print 'essai'
    Pour le moment le seul moyen que j'ai trouver c'est de faire le changement que j'ai mis ci-dessus.

    Cela dit ce que tu me propose à l'aire de se rapprocher assez de ce que je veux faire.

    Par contre ton exemple me montre un peu mieux comment il est judicieux de faire et je comprends mieux pourquoi sur un autre topic tu disais que l'utilisation de QtDesigner permettait de ne pas retoucher son propre code...

    EDIT:
    Petit besoin de précision...
    Avec le code que tu me donnes, on est bien d'accord que pour lancer ton applic c'est bien toto.py que tu lances?
    Si c'est bien le cas, je continue à chercher comment lancer au mieux toto_ui.py (là où est le code de la partie graphique du programme). Si c'est pas le cas, et si le programme se lance depuis toto_ui.py, alors on doit modifier légèrement le code de celui-ci (faire au moins un import).

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    voilà tout à fait il ne faut pas DU TOUT modifier le .py généré par QtDesigner, il faut l'importer.

    je ne sais pas comment tu as réussi à créer ce "slot1" sur QtDesigner, je n'ai accès en ce qui me concerne qu'aux slots des widgets de Qt.

    le bout de code que j'ai mis, c'est ce que je fais d'habitude et ça fonctionne, par contre c'est moi qui écrit le self.connect, c'est pas QtDesigner (pour des slots que j'écris moi même bien entendu):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from toto_ui import Ui_TaMainWindow
     
    class TaMainWindow(QMainWindow,Ui_TaMainWindow):
        def __init__(self, parent):
            super(TaMainWindow,self).__init__(parent)
            self.setupUi(self)
            self.connect(self.pushButton_3, SIGNAL("clicked()"), self.slot1)
        def slot1(self):
            print "essai"

  5. #5
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut
    Citation Envoyé par kango Voir le message
    voilà tout à fait il ne faut pas DU TOUT modifier le .py généré par QtDesigner, il faut l'importer.
    Oki donc là j'ai bien piger.

    Citation Envoyé par kango Voir le message
    je ne sais pas comment tu as réussi à créer ce "slot1" sur QtDesigner, je n'ai accès en ce qui me concerne qu'aux slots des widgets de Qt.
    En fait si tu vas dans la vue "Editer signets/slots" et que tu fais pointer directement le slot depuis un bouton sur la fenêtre principale, tu as la possibilité d'éditer et de créer de nouveaux slots.
    J'ai donc fait ainsi.
    Malheureusement dans ce cas là le receveur c'est TaMainWindow.
    Ensuite une fois "compiler" tu as le code que j'ai mis ci-dessus.

    Citation Envoyé par kango Voir le message
    le bout de code que j'ai mis, c'est ce que je fais d'habitude et ça fonctionne, par contre c'est moi qui écrit le self.connect, c'est pas QtDesigner (pour des slots que j'écris moi même bien entendu):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from toto_ui import Ui_TaMainWindow
     
    class TaMainWindow(QMainWindow,Ui_TaMainWindow):
        def __init__(self, parent):
            super(TaMainWindow,self).__init__(parent)
            self.setupUi(self)
            self.connect(self.pushButton_3, SIGNAL("clicked()"), self.slot1)
        def slot1(self):
            print "essai"
    [/QUOTE]

    J'ai refais exactement le même code que toi (en réutilisant les mêmes noms pour être sûr de mon coups).
    A la fin de toto.py j'ai rajouter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TaMainWindow(Ui_TaMainWindow)
    Afin d'appeler la classe ci-dessus. Je pense que c'est bon non?
    Si c'est bien ça qu'il faut faire j'obtiens le message d'erreur suivant:

    TypeError: QMainWindow(QWidget parent=None, Qt.WindowFlags flags=0): argument 1 has unexpected type 'type'
    Fichier "C:\Documents and Settings\Charlie\Bureau\essaiQtDesigner\toto.py", ligne 14, dans <module>
    TaMainWindow(Ui_TaMainWindow)
    Fichier "C:\Documents and Settings\Charlie\Bureau\essaiQtDesigner\toto.py", ligne 7, dans __init__
    super(TaMainWindow,self).__init__(parent)
    Je me demande aussi s'il n'y a pas une toute petite modif à faire dans toto_ui.py...
    Ne faudrait-il pas enlever la condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if __name__ == "__main__":
    ???

    Cette condition est bien là pour vérifier que ce script est le script "parent"???
    Ce qui n'est plus le cas si on le lance depuis toto.py, non???

    Eventuellement si tu joindre deux bouts de codes complets ça m'éviterai de renvoyer une énième réponse très certainement inutile lol ^^

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    en effet j'ai testé pour la création de slot1, je connaissais pas .

    ouep, voici un exemple de base, c'est un Find and Replace dans un texte. C'est peu ou prou l'exemple du bouquin Rapid Gui programming with Python and Qt de Mark Summerfield.

    il y a des connections passant par des décorateurs, j'aime pas trop c'est pas très lisible, mais on peut remplacer par des appels à connect.
    Fichiers attachés Fichiers attachés

  7. #7
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut
    Citation Envoyé par kango Voir le message
    en effet j'ai testé pour la création de slot1, je connaissais pas .
    Ben j'ai la facheuse tendance à tout fouiller et à essayer n'importe quoi n'importe comment.
    Reste à trouver:
    1°) comment créé le slot ainsi appelé.
    2°) voir si éventuellement si QtDesigner permet ceci ^^

    Citation Envoyé par kango Voir le message
    ouep, voici un exemple de base, c'est un Find and Replace dans un texte. C'est peu ou prou l'exemple du bouquin Rapid Gui programming with Python and Qt de Mark Summerfield.

    il y a des connections passant par des décorateurs, j'aime pas trop c'est pas très lisible, mais on peut remplacer par des appels à connect.
    Merci, je vais zieuter ça.

    EDIT:
    Je viens de reprendre mon exemple, et en m'inspirant du tien j'ai pu créer facilement la def slot1().

    Voici en PJ ce que j'ai fait.

    Dans mes premiers exemple je pense que l'erreur vient d'une mauvaise indexation de la def.
    Bref en utilisant un 2ème fichier comme toi, ça passe facile.
    Et là ça commence à devenir très intéressant ^^.
    Fichiers attachés Fichiers attachés

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Points : 33
    Points
    33
    Par défaut
    J'avais le meme probleme quand j'ai commence a utiliser PyQT. Seulement pour ma part impossible de creer des signal/slot directement dans QT.

    On m'a conseille de generer les signal/slot dans une autre classe (dans la classe TaMainWindow en fait), tu peux mieux le gerer !!

    Si tu veux ajouter une fonction a un bouton, au lieu de repartir dans QT, creer ton signal/slot, reconvertir ton .ui en .py, tu ajoutes directement QtCore.QObject.connect( bouton, SIGNAL, self.defMethod ) et tu implementes ta methode a la suite !!

    Voici le lien du message ou tout est explique:http://www.developpez.net/forums/d91...n-slots-pyqt4/

    Voila, en esperant que tout marche pour le mieux

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

Discussions similaires

  1. Besoin de d'aide pour démarrer une petite appli avec géoloc
    Par Kaoutchou dans le forum SIG : Système d'information Géographique
    Réponses: 1
    Dernier message: 26/07/2014, 01h08
  2. Réponses: 5
    Dernier message: 06/04/2012, 19h25
  3. Besoin d'aide pour une petite requête avec distinct
    Par mims1664 dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/02/2009, 12h58
  4. Réponses: 3
    Dernier message: 01/11/2008, 17h35
  5. Petit problème avec un code : besoin de votre aide :)
    Par loicdu4000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/09/2006, 18h02

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