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
Version imprimable
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:
- WCode:
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: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:
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:
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:Citation:
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:
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
salut
j'ai crée deux fichier :
1. un fichier feb.py qui contient la classe Ui_myClasse generé par QT Creator et qui derive d'un objet
2. un fichier openFileHerite.py contenant ma classe contenat ma classe Fenetre
masi j'ai un message d'erreur dans ce fichier
voici le code de mes deux classe avec un fichier attaché du message d'erreur :
code du fichier feb.py :
code du fichier openFileHerite.pyCode:
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 # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'myclasse.ui' # # Created: Wed Mar 30 10:06:15 2011 # by: PyQt4 UI code generator 4.8.3 # # WARNING! All changes made in this file will be lost! import sys from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_myClasse(object): def setupUi(self, myClasse): myClasse.setObjectName(_fromUtf8("myClasse")) myClasse.resize(400, 300) self.centralWidget = QtGui.QWidget(myClasse) self.centralWidget.setObjectName(_fromUtf8("centralWidget")) self.pushButton = QtGui.QPushButton(self.centralWidget) self.pushButton.setGeometry(QtCore.QRect(150, 80, 75, 23)) self.pushButton.setObjectName(_fromUtf8("pushButton")) QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.charger) myClasse.setCentralWidget(self.centralWidget) self.menuBar = QtGui.QMenuBar(myClasse) self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 20)) self.menuBar.setObjectName(_fromUtf8("menuBar")) myClasse.setMenuBar(self.menuBar) self.mainToolBar = QtGui.QToolBar(myClasse) self.mainToolBar.setObjectName(_fromUtf8("mainToolBar")) myClasse.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar) self.statusBar = QtGui.QStatusBar(myClasse) self.statusBar.setObjectName(_fromUtf8("statusBar")) myClasse.setStatusBar(self.statusBar) self.retranslateUi(myClasse) QtCore.QMetaObject.connectSlotsByName(myClasse) def retranslateUi(self, myClasse): myClasse.setWindowTitle(QtGui.QApplication.translate("myClasse", "myClasse", None, QtGui.QApplication.UnicodeUTF8)) self.pushButton.setText(QtGui.QApplication.translate("myClasse", "PushButton", None, QtGui.QApplication.UnicodeUTF8)) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) MainWindow = QtGui.QMainWindow() ui = Ui_myClasse() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
Code:
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 # -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui from feb import Ui_myClasse try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Fenetre(QtGui.QMainWindow) def __init__(self, parent=None): super(Fenetre,self).__init__(parent) self.ui = Ui_myClasse() self.ui.setupUi(self) self.ui.retranslateUi(self) # # suite: les objets venant de Qt Creator sont préfixés par self.ui # myClasse.setObjectName(_fromUtf8("myClasse")) myClasse.resize(400, 300) self.ui.centralWidget = QtGui.QWidget(myClasse) self.ui.centralWidget.setObjectName(_fromUtf8("centralWidget")) self.ui.pushButton = QtGui.QPushButton(self.centralWidget) self.ui.pushButton.setGeometry(QtCore.QRect(150, 70, 75, 23)) self.ui.pushButton.setObjectName(_fromUtf8("pushButton")) QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.chargerFichier) self.ui.menuBar = QtGui.QMenuBar(myClasse) self.ui.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 20)) self.ui.menuBar.setObjectName(_fromUtf8("menuBar")) myClasse.setMenuBar(self.ui.menuBar) self.mainToolBar = QtGui.QToolBar(myClasse) self.mainToolBar.setObjectName(_fromUtf8("mainToolBar")) myClasse.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar) self.ui.statusBar = QtGui.QStatusBar(myClasse) self.ui.statusBar.setObjectName(_fromUtf8("statusBar")) myClasse.setStatusBar(self.ui.statusBar) self.retranslateUi(myClasse) QtCore.QMetaObject.connectSlotsByName(myClasse) def chargerFichier(self): fichier = QtGui.QFileDialog.getOpenFileName(self, u"Sélectionnez le fichier", u"toto.txt", u"Fichier texte (*.txt);;Tous (*.*)") fichier = unicode(fichier) if fichier!=u"": print u"fichier demand�:", fichier else: print u"aucun fichier demand�" app = QtGui.QApplication(sys.argv) fen = Fenetre() fen.show() sys.exit(app.exec_())
objectif : c'est de pouvoir appeler la fonction chargerFichier quand je clique sur le bouton pour ouvrir un fichier à partir de l'ordinateur
Bonjour,
Quand l'erreur dit quelque chose comme "j'attends ':'", c'est qu'il manque ':'!
A part cela, tu as plusieurs erreurs dues au fait que feb.py référence la fenetre de openFileHerite.py, alors que pendant l'importation, cette fenêtre est encore inconnue.Code:class Fenetre(QtGui.QMainWindow):
En fait, tu fais trop de choses dans feb.py. Déplace la connexion entre les boutons et les méthodes de Fenetre dans openFileHerite.py.
Si tu veux plus d'aide, donne le fichier feb.ui.
Tu es bientôt au bout!
Tyrtamos
c'est ca mon fichier myClass.ui
donc j'ai generé myClasse.py
et j'ai crée sous eclipse un fichier feb.py dedans j'ai inseré le code de myClasse.py
la classe Fenetre est deja dans le fichier openFileHertie.pyCode:
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 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>myClasse</class> <widget class="QMainWindow" name="myClasse"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>myClasse</string> </property> <widget class="QWidget" name="centralWidget"> <widget class="QPushButton" name="pushButton"> <property name="geometry"> <rect> <x>150</x> <y>80</y> <width>75</width> <height>23</height> </rect> </property> <property name="text"> <string>PushButton</string> </property> </widget> </widget> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>20</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui>
le probleme ce qu'il connait pas myClass
j'ai corrigé l'erreur
mais il me dit comme message :
myClasse.setObjectName(_fromUtf8("myClasse"))
NameError: global name 'myClasse' is not defined
Respecte le principe suivant:
1- tous les objets graphiques, y compris les menus, sont définis dans QtDesigner
2- toutes les connexions entre ces objets graphiques et les méthodes de la classe Fenetre sont définies dans la classe Fenetre.
Je n'ai pas le temps d'en faire plus cet après-midi. Si tu es encore coincé(e) dans la soirée, je te ferai une proposition de code.
Tyrtamos
ca marche
:P j'ai fais comme tu m'as dit et ca fonctionne :D
donc je postule ce code qui marche pour ceux qui ont le même problème que moi :ccool:
merci infiniment à toi , tes conseils m'ont beaucoup aidé
le code de fichier feb.py :
le code du fichier openFileHerite.py :Code:
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 # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'myclasse.ui' # # Created: Wed Mar 30 10:06:15 2011 # by: PyQt4 UI code generator 4.8.3 # # WARNING! All changes made in this file will be lost! import sys from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_myClasse(object): def setupUi(self, myClasse): myClasse.setObjectName(_fromUtf8("myClasse")) myClasse.resize(400, 300) self.centralWidget = QtGui.QWidget(myClasse) self.centralWidget.setObjectName(_fromUtf8("centralWidget")) self.pushButton = QtGui.QPushButton(self.centralWidget) self.pushButton.setGeometry(QtCore.QRect(150, 80, 75, 23)) self.pushButton.setObjectName(_fromUtf8("pushButton")) myClasse.setCentralWidget(self.centralWidget) self.menuBar = QtGui.QMenuBar(myClasse) self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 20)) self.menuBar.setObjectName(_fromUtf8("menuBar")) myClasse.setMenuBar(self.menuBar) self.mainToolBar = QtGui.QToolBar(myClasse) self.mainToolBar.setObjectName(_fromUtf8("mainToolBar")) myClasse.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar) self.statusBar = QtGui.QStatusBar(myClasse) self.statusBar.setObjectName(_fromUtf8("statusBar")) myClasse.setStatusBar(self.statusBar) self.retranslateUi(myClasse) QtCore.QMetaObject.connectSlotsByName(myClasse) def retranslateUi(self, myClasse): myClasse.setWindowTitle(QtGui.QApplication.translate("myClasse", "myClasse", None, QtGui.QApplication.UnicodeUTF8)) self.pushButton.setText(QtGui.QApplication.translate("myClasse", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
je suis contente :mrgreen:Code:
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 # -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui from feb import Ui_myClasse try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Fenetre(QtGui.QMainWindow): def __init__(self, parent=None): super(Fenetre,self).__init__(parent) self.ui = Ui_myClasse() self.ui.setupUi(self) self.ui.retranslateUi(self) # # suite: les objets venant de QtDesigner sont préfixés par self.ui # QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), self.chargerFichier) def chargerFichier(self): fichier = QtGui.QFileDialog.getOpenFileName(self, u"Sélectionnez le fichier", u"toto.txt", u"Fichier texte (*.txt);;Tous (*.*)") fichier = unicode(fichier) if fichier!=u"": print u"fichier demand�:", fichier else: print u"aucun fichier demand�" app = QtGui.QApplication(sys.argv) fen = Fenetre() fen.show() sys.exit(app.exec_())
si tu peux me faire une proposition de code mais avec un menu à la place du bouton
je explique plus :
un menu fichier quand je clique j'ai sélectionner un fichier je clique dessus j'affiche la fenêtre pour choisir un fichier sur l'ordinateur .
bon j'ai fais pareil tout à l'heure avec le bouton :
1. une classe qui construit le menu (QT Designer)
2. une autre classe qui contient cette ligne :y a pas de message d'erreur mais quand je clique sur le sous-menu sélectionner un fichier rien ne se passeCode:self.ui.actionOuvrir_un_fichier.triggered.connect(self.ouvrirFichier)
pourtant ca marche nickel pour le bouton
merci encore
merci
ca fonctionne , j'ai tout recommencer de zéro et ca marche
pourtant j'ai fais pareil que hier , j'aurais du faire une petite erreur dans le code sans me rendre compte
:ccool: