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
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
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:
- W
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) ...
PS: Avec Qt, je ne vois pas l'intérêt de passer par héritage multiple dans ce cas.
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.
- création du programme principal .py comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part pyuic4 prog_ui.ui -o prog_ui.py
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
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_())
Et les objets créés par QtDesigner sont préfixés simplement par self.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 class Fenetre(QtGui.QMainWindow, Ui_MainWindow)
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
Il n'est pas "interdit", mais tous les objets ne s'y prêtent pas:En effet, il est interdit que l'on hérite de 2 objets QT en même temps! Dans ce cas:
- pour des questions de MRO:
Et puis il y a quelques singletons qui n'aiment pas être accouplé avec n'importe quoi...
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 ... >>>
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
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
Partager