Ajouter une fenêtre dans un projet avec Qt Designer
Bonjour,
Dans mon projet, j'ai une fenêtre principale.
J'aimerai faire apparaitre une nouvelle fenêtre en cliquant sur un bouton.
Je tourne en rond depuis 1h pour trouver comment faire ceci avec Qt Designer.
Si quelqu'un à une piste elle est la bienvenue.
D'avance merci
Mythes et réalités de la création d'IHM avec Qt Designer.
Bonjour,
je suppose que ceci est dans la suite de ce précédent fil :
http://www.developpez.net/forums/d94...e-qt-designer/
Comme tu as pu le constater, si l'on peut créer des slots étrangers au code de la fenêtre, il seront toujours considérés comme lui appartenant. Si tu transformes ton .ui en .py tu constates que tes slots se sont vu gratifiés d'un 'self.'
Qt Designer est un outil permettant d'économiser de nombreuses heures de travail mais qui, comme toutes choses, a ses limites.
Personne n'aimerait à se taper 1000 lignes de code de ce genre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
self.label_12 = QtGui.QLabel(self.tab_img)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(63)
sizePolicy.setVerticalStretch(158)
sizePolicy.setHeightForWidth(self.label_12.sizePolicy().hasHeightForWidth())
self.label_12.setSizePolicy(sizePolicy)
self.label_12.setMinimumSize(QtCore.QSize(60, 18))
self.label_12.setMaximumSize(QtCore.QSize(150, 18))
font = QtGui.QFont()
font.setFamily("Sans Serif")
font.setWeight(75)
font.setBold(True)
self.label_12.setFont(font)
self.hl_21.addWidget(self.label_12)
self.width_lbl = QtGui.QLabel(self.tab_img)
self.width_lbl.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.hl_21.addWidget(self.width_lbl) |
Un pensum.
Personnellement, avec un quota d'une faute de frappe pour deux lignes, le temps de correction serait à lui seul supérieur au temps de création avec Qt Designer.
Pour de petites applications, i.e. boite de dialogue d'avertissement, tu n'as aucune raison de séparer le code qui lui "donne vie", ajoute-le à la suite du code généré par pyuic4.
Pour des applications plus lourdes une séparation des codes fenêtre-appli se justifie pour des questions de lisibilité et, ceci lié à cela, de maintenance.
Une mainWindow, par contre, ne sera jamais créée d'un premier jet, on sait d'avance que l'on reviendra souvent dessus, nouvelles fonctionnalités, nouvelles idées, changement de concept suite aux test, ergonomie qui ne "passe" pas auprès des essayeurs, etc, les raisons ne manquent pas.
Cela signifie qu'il conviendra, donc, de conserver le code de la fenêtre en l'état.
Deux solutions :
- Petite application(*), créer les slots comme tu l'as fait dans le Designer et ajouter ceci à la fin du code (après la fonction retranslateUi) :
Code:
1 2 3 4 5 6 7 8
|
def slot_11(self):
self.main.do_1()
def slot_2(self):
self.main.do_2
... |
ceci implique que "main" ait été passé en argument à la fenêtre. Tu pourras
toujours revoir ta fenêtre et recompiler avec pyuic4, il suffira de recopier le bloc
des def slot_x à la fin.
- Application lourde, ici le risque de devoir diviser le code de la fenêtre en
modules .ui séparés, interdit la première solution,
donc, aucun slots définis lors de la création, mais tous instanciés dans
le code main, celui-ci ayant de toutes façons accès à tous les widgets de l'appli.
Pour le reste, laissons l'expérience guider nos choix, certains préféreront importer directement le .ui plutôt que le convertir en .py.
Mais c'est vrai que tu as posé une question dans le premier post. La réponse est non.
On ne peut pas créer une sous fenêtre directement dans le designer et la lier avec un signal/slot.
Construis des objets séparés. une mainWindow et des dialogues
Pour rappel, une boite de dialogue peut s'appeler ainsi :
Code:
1 2 3 4 5
|
Dialog = QtGui.QDialog()
md = myDialog()
md.setupDialog(Dialog)
reply = Dialog.exec_() |
Si l'on regarde comment est instanciée une mainWindow :
Code:
1 2 3 4 5 6 7
|
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_()) |
On y trouve des similitudes qui permettent d'en comprendre la mécanique.
(*) ... deviendra grande , on ne se méfie jamais assez.