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 :

Intégrer une classe dans une autre


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut Intégrer une classe dans une autre
    Bonjour
    comment faire pour intégrer une classe crée par QtDesigner ou QT Creator ( dérivé d'un objet ) dans une classe qui hérite QWidget ?
    merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,
    Je suppose que vous avez converti le my_dialog.ui construit par Qt Designer en ui_my_dialog.py. A l'intérieur, il y a une classe qui devrait s'appeler Ui_MyDialog.

    Dans le module/script qui utilisera la classe, il faudra faire 'au moins':
    import ui_my_dialog # en supposé "dans le même répertoire"

    Comme Python est "multiple inheritance", çà peut s'écrire:
    class MyWidget(QWidget, ui_my_dialog.Ui_MyDialog): pass

    Mais vous pouvez "coller" les deux par aggrégation composite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MyWidget(QWidget):
            ...
            self._dialog = ui_my_dialog.Ui_MyDialog(self)
            ...
    - W
    PS: Avec Qt, je ne vois pas l'intérêt de passer par héritage multiple dans ce cas.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà ce que je fais:

    - création de la fenêtre graphique avec QtDesigner => fichier prog_ui.ui. La classe crée est, par exemple: Ui_MainWindow dérivant de object.

    - conversion en .py avec pyuic4 => fichier: prog_ui.py.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pyuic4 prog_ui.ui -o prog_ui.py
    - création du programme principal .py comme suit:

    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
     
    from PyQt4 import QtCore, QtGui
    from prog_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)
            #
            # suite: les objets venant de QtDesigner sont préfixés par self.ui
            #
     
    app = QtGui.QApplication(sys.argv)
    fen = Fenetre()
    fen.show()
    sys.exit(app.exec_())
    Une autre solution plus simple est possible: la fenêtre peut hériter en même temps de QMainWindow et de Ui_MainWindow grâce au fait que Ui_MainWindow dérive de object. En effet, il est interdit que l'on hérite de 2 objets QT en même temps! Dans ce cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class Fenetre(QtGui.QMainWindow, Ui_MainWindow)
    Et les objets créés par QtDesigner sont préfixés simplement par self.

    En tout cas: c'est une très mauvaise idée d'éditer directement le fichier issu de QtDesigner, car la moindre modif ultérieure par QtDesigner fait perdre toutes les modifications.

    Tyrtamos

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    En effet, il est interdit que l'on hérite de 2 objets QT en même temps! Dans ce cas:
    Il n'est pas "interdit", mais tous les objets ne s'y prêtent pas:
    - pour des questions de MRO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >>> class Spam(QWidget, QDialog): pass
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Error when calling the metaclass bases
        Cannot create a consistent method resolution
    order (MRO) for bases QWidget, QDialog
    >>> class Spam(QDialog, QWidget): pass
    ... 
    >>>
    Et puis il y a quelques singletons qui n'aiment pas être accouplé avec n'importe quoi...

    Cela fait partie des subtilités de l'héritage multiple qui font qu'on évite de l'utiliser lorsque ce n'est pas si indispensable.
    Ne l'avais je pas mentionné en PS?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour wiztricks,

    Citation Envoyé par wiztricks Voir le message
    Il n'est pas "interdit", mais tous les objets ne s'y prêtent pas:
    Désolé, j'ai la mauvaise habitude de lire les notices. Extrait de celle de PyQt4:

    Multiple Inheritance¶

    It is not possible to define a new Python class that sub-classes from more than one Qt class.
    Tyrtamos

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Oui vous avez raison SIP ne permet pas cela.
    Mais vous pouvez utilisez la classe construire par le Designer via héritage multiple car cette dernière n'est pas un QObject.
    Je ne vois pas trop ce que vous ajoutez à mon post initial - just rambling?
    Et la doc est ici
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. utilisation d'une variable d'une class dans une autre class
    Par the watcher dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2010, 14h01
  2. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  3. Détecter une action d'une classe dans une autre classe
    Par Pirokkk dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 12/05/2008, 12h14
  4. Réponses: 3
    Dernier message: 29/04/2008, 14h14
  5. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04

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