Dialog creation/fr

= Dialog_creation/fr =

Dans cette page nous allons vous montrer comment construire une simple boîte de dialogue avec Qt Designer, Qt Designer, est l'outil officiel de Qt pour la conception d'interfaces (Gui), puis de le convertir en code Python, et l'utiliser à l'intérieur de FreeCAD. Je vais supposer, que pour l'exemple, vous savez déjà comment modifier et exécuter un script Python, et que vous pouvez travailler avec des choses simples dans une fenêtre de terminal tel que se déplacer, etc. . Bien sûr, vous devez également avoir installé pyqt.

Construire une boîte de dialogue
Dans les applications de CAO, bien concevoir une UI (interface utilisateur) est très important. Tout ce que l'utilisateur fera, se fera à travers un outil de l'interface: la lecture des boîtes de dialogue, appuyer sur les boutons, le choix entre les icônes, etc. . Il est donc très important de réfléchir attentivement à la conception de votre boîte de dialogue, comment vous voulez que l'utilisateur se comporter avec la boîte, et comment sera le flux de travail de votre action. Il y a une deux choses à savoir lors de la conception de l'interface: Dans certains cas, le premier est préférable, dans d'autres cas non. La boîte à outils de l'interface Qt que nous utilisons, est une boîte à outils state-of-the-art (interface graphique avancée), et nous n'aurons pas beaucoup d'inquiétudes pour rendre les choses claires, car elles sont déjà très claires par elles-mêmes. Donc, maintenant que nous avons bien défini ce que nous ferons, il est temps d'ouvrir Qt Designer. Nous allons concevoir très facilement une simple boîte de dialogue, comme ceci:
 * Boîtes de dialogue modales ou non-modale :
 * Une boîte de dialogue modale apparaît en face de votre écran et, arrête l'action de la fenêtre principale, forçant l'utilisateur à répondre à la boîte de dialogue.
 * Une boîte de dialogue non modale ne vous empêche pas de travailler sur la Fenêtre principale, vous pouvez travailler sur les deux fenêtres.
 * Identifier ce qui est nécessaire et ce qui est optionnel:
 * Assurez-vous que l'utilisateur sait ce qu'il doit faire. Prévoyez des étiquettes avec des descriptions appropriées, des info-bulles d'utilisation, etc ..
 * Séparez les commandes à partir de paramètres:
 * Cela se fait habituellement avec des boutons et des champs de saisie de texte.
 * L'utilisateur sait que cliquer sur un bouton va produire une action, tout en changeant une valeur dans un champ de texte, va changer un paramètre quelque part. Cependant, aujourd'hui, les utilisateurs savent généralement bien ce qu'est un bouton, ce qu'est un champ de saisie, etc . ..



Nous allons ensuite utiliser cette boîte de dialogue dans FreeCAD pour produire une belle surface plane rectangulaire. Vous ne trouverez peut-être pas très utile de produire de beaux plans rectangulaires, mais il sera facile de le changer plus tard et de faire des choses plus complexes. Lorsque vous l'ouvrez, Qt Designer ressemble à ceci:



Il est très simple à utiliser. Sur la barre de gauche vous avez des éléments qui peuvent être glissés sur votre widget (tous les outils). Sur le côté droit vous avez des panneaux d'affichage de propriétés de toutes sortes, des propriétés de certains éléments modifiables. Donc, commencez par créer un nouveau widget. Sélectionnez "Dialog without buttons", car nous ne voulons pas de boutons par défaut Ok/Annuler. Ensuite, faites glisser sur votre widget 3 labels, un pour le titre, un pour l'écriture "Height" (Hauteur) et l'autre pour l'écriture "Width" (Largeur). Les labels (étiquettes) sont de simples textes qui apparaissent sur ​​votre widget, il servent a informer l'utilisateur. Si vous sélectionnez un label, sur le côté droit apparaîssent plusieurs propriétés que vous pouvez modifier, comme le style de police, taille, etc. . . Ensuite, ajoutez 2 LineEdits, qui sont des champs texte que l'utilisateur peut remplir, un pour la hauteur et l'autre pour la largeur. Ici aussi, nous pouvons modifier les propriétés. Par exemple, pourquoi ne pas définir une valeur par défaut ? Par exemple 1,00 pour chacun d'eux. De cette façon, lorsque l'utilisateur verra la boîte de dialogue, les deux valeurs seront déjà remplies et si les valeurs conviennent, il peut directement appuyer sur le bouton, gain de temps précieux. Ensuite, ajoutez un PushButton, qui est le bouton, que l'utilisateur devra appuyer après avoir rempli les 2 champs. Notez que j'ai choisi ici des contrôles très simples, mais Qt a beaucoup plus d'options, par exemple, vous pouvez utiliser spinbox au lieu de LineEdits, etc .. Regardez tout ce qui est disponible, vous aurez sûrement d'autres idées. C'est à peu près tout ce que nous devons faire dans Qt Designer. Une dernière chose, nous allons renommer tous nos éléments avec des noms faciles, de sorte qu'il sera plus facile de les identifier dans nos scripts:



Conversion de notre boîte de dialogue en code Python avec "pyuic"
Maintenant, nous allons sauver notre widget quelque part. Il sera sauvegardé dans un fichier .Ui, que nous allons facilement convertir en script Python avec pyuic. Dans windows, le programme est livré avec pyuic pyqt (à vérifier), sur Linux, vous aurez probablement besoin de l'installer séparément à partir de votre gestionnaire de paquets (sur debian-systèmes basés sur, il fait partie du paquet pyqt4-dev-tools). Pour faire la conversion, vous aurez besoin d'ouvrir une fenêtre de terminal (ou une fenêtre d'invite de commandes), accédez à l'endroit où vous avez enregistré votre fichier ui : pyuic -x fichier.ui > fichier.py
 * pyuic.py est l'outil qui convertit les fichiers qt-designer .ui (Interface Utilisateur) en fichier .py (code Python), la ligne de commande dans la console DOS est :


 * vous pouvez créer un fichier .bat pour automatiser la commande:
 * copiez cette ligne dans un fichier texte et sauvez le sous le nom "compile.bat"

@"C:\Python27\python" "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" -x %1.ui > %1.py

Autres liens de documentation "Python and Qt", sur Développez.com et bien d'autres. Sur certains systèmes, le programme est appelé pyuic4 au lieu de pyuic (attention à la compatibilité). Il sert simplement de convertisseur de fichier .Ui en un script python .py. Si nous ouvrons le fichier mywidget.py, son contenu est très facile à comprendre:
 * puis tapez à la ligne de commande " compile fichier " sans extension, le nom "fichier" entré .ui, sera le nom sortant avec extension .py
 * ATTENTION: il faut que les fichiers soient présents et accessibles, vérifiez que les fichiers sont présents et que les chemins sont justes !
 * pour cet exemple entièrement automatique et simplifié, "compile.bat" est au même endroit que le fichier.ui à convertir en fichier.py

from PyQt4 import QtCore, QtGui class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(187, 178) self.title = QtGui.QLabel(Dialog) self.title.setGeometry(QtCore.QRect(10, 10, 271, 16)) self.title.setObjectName("title") self.label_width = QtGui.QLabel(Dialog) ...        self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) self.title.setText(QtGui.QApplication.translate("Dialog", "Plane-O-Matic", None, QtGui.QApplication.UnicodeUTF8)) ...

Comme vous voyez, il a une structure très simple: une classe nommée Ui_Dialog est créé, qui stocke les éléments de l'interface de notre widget. Cette classe dispose de deux méthodes, une pour la mise en place du widget, et l'autre pour traduire son contenu, qui fait partie du mécanisme général de Qt pour la traduction des éléments d'interface. La méthode de configuration, crée simplement, un par un, les widgets tels que nous les avons définis dans Qt Designer, et définit leurs options aussi comme nous avons décidé plus tôt. Puis, toute l'interface est traduite, et enfin, les "slots" se connectent (nous en reparlerons plus tard). Nous pouvons maintenant créer un nouveau widget, et utiliser cette classe pour créer son interface. Nous pouvons déjà voir notre widget en action, en mettant notre fichier mywidget.py dans un endroit où FreeCAD la trouvera (dans le répertoire bin FreeCAD, ou dans l'un des sous-répertoires Mod), et, dans l'interpréteur Python de FreeCAD, faisons:

from PyQt4 import QtGui import mywidget d = QtGui.QWidget d.ui = mywidget.Ui_Dialog d.ui.setupUi(d) d.show

Et notre boîte de dialogue apparaîtra! Notez que notre interpréteur Python fonctionne toujours, nous avons une boîte de dialogue non modale. Donc, pour la fermer, nous pouvons (à part cliquer sur son icône, bien sûr) faire:

d.hide

Faire quelque chose avec notre boîte de dialogue
Maintenant que nous pouvons afficher et masquer notre boîte de dialogue, nous avons juste besoin d'ajouter la dernière partie, pour en faire quelque chose ! Si vous explorez un peu Qt Designer, vous découvrirez rapidement toute une section appelée "signaux et slots". Fondamentalement, cela fonctionne comme ceci, ce sont les éléments sur vos widgets (dans la terminologie de Qt, ces éléments sont eux-mêmes des widgets) qui peuvent envoyer des signaux. Ces signaux diffèrent selon le type de widget. Par exemple, un bouton peut envoyer un signal quand il est pressé et quand il est relâché. Ces signaux peuvent être connectés à des créneaux, qui peuvent être des fonctionnalités spéciales d'autres widgets (par exemple une boîte de dialogue a un bouton "Fermer" sur lequel vous pouvez connecter le signal à partir d'un autre bouton "Fermer"), ou, peuvent être des fonctions personnalisées. La documentation de référence PyQt répertorie tous les widgets Qt, ce qu'ils peuvent faire, ce qu'ils signalent, ce qu'ils peuvent envoyer, etc. . . Ce que nous allons faire ici, c'est créer une nouvelle fonction qui permettra de créer une surface plane basée sur la hauteur et la largeur, et, relier cette fonction au bouton "Create!". Donc, nous allons commencer par importer nos modules FreeCAD, en mettant la ligne suivante en haut du script, où nous importons déjà QtCore et QtGui:

import FreeCAD, Part

Ensuite, nous allons ajouter une nouvelle fonction à notre classe Ui_Dialog:

def createPlane(self): try: # first we check if valid numbers have been entered w = float(self.width.text) h = float(self.height.text) except ValueError: print "Error! Width and Height values must be valid numbers!" else: # create a face from 4 points p1 = FreeCAD.Vector(0,0,0) p2 = FreeCAD.Vector(w,0,0) p3 = FreeCAD.Vector(w,h,0) p4 = FreeCAD.Vector(0,h,0) pointslist = [p1,p2,p3,p4,p1] mywire = Part.makePolygon(pointslist) myface = Part.Face(mywire) Part.show(myface) self.hide

Puis, nous avons besoin d'informer Qt pour qu'il se connecte sur le bouton de la fonction, en plaçant la ligne suivante juste avant QtCore.QMetaObject.connectSlotsByName(Dialog):

QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed"),self.createPlane)

Il s'agit, comme vous le voyez, de relier le signal du bouton enfoncé de l'objet a créer ("Create!" Bouton), à un emplacement nommé createPlane, dont nous venons de définir. Ça y est ! Maintenant, la touche finale, nous pouvons ajouter une petite fonction, pour créer la boîte de dialogue, elle sera plus facile a appeler. En dehors de la classe Ui_Dialog class, nous allons ajouter le code suivant:

class plane: def __init__(self): self.d = QtGui.QWidget self.d.ui = Ui_Dialog self.d.ui.setupUi(d) self.d.show

(Rappel sur Python : la méthode __init__ est une classe qui s'exécute automatiquement chaque fois qu'un nouvel objet est créé ! )

Puis, à partir de FreeCAD, nous avons seulement besoin de faire:

import mywidget mywidget.plane

Voilà, c'est tout ... Maintenant, vous pouvez essayer toutes sortes de choses, comme par exemple l'insertion de votre widget dans l'interface FreeCAD (voir la page Code snippets), ou, faire des outils personnalisés beaucoup plus avancés, en utilisant d'autres éléments dans votre widget.

Le script complet
Ceci est le script de référence complet:

# # from PyQt4 import QtCore, QtGui import FreeCAD, Part class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(187, 178) self.title = QtGui.QLabel(Dialog) self.title.setGeometry(QtCore.QRect(10, 10, 271, 16)) self.title.setObjectName("title") self.label_width = QtGui.QLabel(Dialog) self.label_width.setGeometry(QtCore.QRect(10, 50, 57, 16)) self.label_width.setObjectName("label_width") self.label_height = QtGui.QLabel(Dialog) self.label_height.setGeometry(QtCore.QRect(10, 90, 57, 16)) self.label_height.setObjectName("label_height") self.width = QtGui.QLineEdit(Dialog) self.width.setGeometry(QtCore.QRect(60, 40, 111, 26)) self.width.setObjectName("width") self.height = QtGui.QLineEdit(Dialog) self.height.setGeometry(QtCore.QRect(60, 80, 111, 26)) self.height.setObjectName("height") self.create = QtGui.QPushButton(Dialog) self.create.setGeometry(QtCore.QRect(50, 140, 83, 26)) self.create.setObjectName("create") self.retranslateUi(Dialog) QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed"),self.createPlane) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) self.title.setText(QtGui.QApplication.translate("Dialog", "Plane-O-Matic", None, QtGui.QApplication.UnicodeUTF8)) self.label_width.setText(QtGui.QApplication.translate("Dialog", "Width", None, QtGui.QApplication.UnicodeUTF8)) self.label_height.setText(QtGui.QApplication.translate("Dialog", "Height", None, QtGui.QApplication.UnicodeUTF8)) self.create.setText(QtGui.QApplication.translate("Dialog", "Create!", None, QtGui.QApplication.UnicodeUTF8)) def createPlane(self): try: # first we check if valid numbers have been entered w = float(self.width.text) h = float(self.height.text) except ValueError: print "Error! Width and Height values must be valid numbers!" else: # create a face from 4 points p1 = FreeCAD.Vector(0,0,0) p2 = FreeCAD.Vector(w,0,0) p3 = FreeCAD.Vector(w,h,0) p4 = FreeCAD.Vector(0,h,0) pointslist = [p1,p2,p3,p4,p1] mywire = Part.makePolygon(pointslist) myface = Part.Face(mywire) Part.show(myface) class plane: def __init__(self): self.d = QtGui.QWidget self.d.ui = Ui_Dialog self.d.ui.setupUi(d) self.d.show
 * 1) -*- coding: utf-8 -*-
 * 1) Form implementation generated from reading ui file 'mywidget.ui'
 * 1) Created: Mon Jun  1 19:09:10 2009
 * 2)      by: PyQt4 UI code generator 4.4.4
 * 1) WARNING! All changes made in this file will be lost!

Méthode 1
Un exemple d'une boîte de dialogue complète avec ses connections.


 * 1) -*- coding: utf-8 -*-
 * 2) Create by flachyjoe

from PyQt4 import QtCore, QtGui

try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s

try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):

def __init__(self, MainWindow): self.window = MainWindow

MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(400, 300) self.centralWidget = QtGui.QWidget(MainWindow) self.centralWidget.setObjectName(_fromUtf8("centralWidget"))

self.pushButton = QtGui.QPushButton(self.centralWidget) self.pushButton.setGeometry(QtCore.QRect(30, 170, 93, 28)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.pushButton.clicked.connect(self.on_pushButton_clicked) #connection pushButton

self.lineEdit = QtGui.QLineEdit(self.centralWidget) self.lineEdit.setGeometry(QtCore.QRect(30, 40, 211, 22)) self.lineEdit.setObjectName(_fromUtf8("lineEdit")) self.lineEdit.returnPressed.connect(self.on_lineEdit_clicked) #connection lineEdit

self.checkBox = QtGui.QCheckBox(self.centralWidget) self.checkBox.setGeometry(QtCore.QRect(30, 90, 81, 20)) self.checkBox.setChecked(True) self.checkBox.setObjectName(_fromUtf8("checkBoxON")) self.checkBox.clicked.connect(self.on_checkBox_clicked) #connection checkBox

self.radioButton = QtGui.QRadioButton(self.centralWidget) self.radioButton.setGeometry(QtCore.QRect(30, 130, 95, 20)) self.radioButton.setObjectName(_fromUtf8("radioButton")) self.radioButton.clicked.connect(self.on_radioButton_clicked) #connection radioButton

MainWindow.setCentralWidget(self.centralWidget)

self.menuBar = QtGui.QMenuBar(MainWindow) self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 26)) self.menuBar.setObjectName(_fromUtf8("menuBar")) MainWindow.setMenuBar(self.menuBar)

self.mainToolBar = QtGui.QToolBar(MainWindow) self.mainToolBar.setObjectName(_fromUtf8("mainToolBar")) MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)

self.statusBar = QtGui.QStatusBar(MainWindow) self.statusBar.setObjectName(_fromUtf8("statusBar")) MainWindow.setStatusBar(self.statusBar)

self.retranslateUi(MainWindow)

def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) self.pushButton.setText(_translate("MainWindow", "OK", None)) self.lineEdit.setText(_translate("MainWindow", "tyty", None)) self.checkBox.setText(_translate("MainWindow", "CheckBox", None)) self.radioButton.setText(_translate("MainWindow", "RadioButton", None))

def on_checkBox_clicked(self): if self.checkBox.checkState==0: App.Console.PrintMessage(str(self.checkBox.checkState)+" CheckBox KO\r\n") else: App.Console.PrintMessage(str(self.checkBox.checkState)+" CheckBox OK\r\n") App.Console.PrintMessage(str(self.lineEdit.displayText)+" LineEdit\r\n")
 * 1)        App.Console.PrintMessage(str(self.lineEdit.setText("tititi"))+" LineEdit\r\n") #écrit le texte dans la fenêtre lineEdit !
 * 2)        str(self.lineEdit.setText("tititi")) #écrit le texte dans la fenêtre lineEdit

def on_radioButton_clicked(self): if self.radioButton.isChecked: App.Console.PrintMessage(str(self.radioButton.isChecked)+" Radio OK\r\n") else: App.Console.PrintMessage(str(self.radioButton.isChecked)+" Radio KO\r\n")

def on_lineEdit_clicked(self): App.Console.PrintMessage(str(self.lineEdit.displayText)+" LineEdit Display\r\n")
 * 1)        if self.lineEdit.textChanged:

def on_pushButton_clicked(self): App.Console.PrintMessage("Terminé\r\n") self.window.hide

MainWindow = QtGui.QMainWindow ui = Ui_MainWindow(MainWindow) MainWindow.show

Ici la même fenêtre mais avec un icône sur chaque bouton.


 * 1) -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui

try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s

try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):

def __init__(self, MainWindow): self.window = MainWindow path = FreeCAD.ConfigGet("AppHomePath")
 * 1)        path = FreeCAD.ConfigGet("UserAppData")

MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(400, 300) self.centralWidget = QtGui.QWidget(MainWindow) self.centralWidget.setObjectName(_fromUtf8("centralWidget"))

self.pushButton = QtGui.QPushButton(self.centralWidget) self.pushButton.setGeometry(QtCore.QRect(30, 170, 93, 28)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.pushButton.clicked.connect(self.on_pushButton_clicked) #connection pushButton

self.lineEdit = QtGui.QLineEdit(self.centralWidget) self.lineEdit.setGeometry(QtCore.QRect(30, 40, 211, 22)) self.lineEdit.setObjectName(_fromUtf8("lineEdit")) self.lineEdit.returnPressed.connect(self.on_lineEdit_clicked) #connection lineEdit

self.checkBox = QtGui.QCheckBox(self.centralWidget) self.checkBox.setGeometry(QtCore.QRect(30, 90, 100, 20)) self.checkBox.setChecked(True) self.checkBox.setObjectName(_fromUtf8("checkBoxON")) self.checkBox.clicked.connect(self.on_checkBox_clicked) #connection checkBox

self.radioButton = QtGui.QRadioButton(self.centralWidget) self.radioButton.setGeometry(QtCore.QRect(30, 130, 95, 20)) self.radioButton.setObjectName(_fromUtf8("radioButton")) self.radioButton.clicked.connect(self.on_radioButton_clicked) #connection radioButton

MainWindow.setCentralWidget(self.centralWidget)

self.menuBar = QtGui.QMenuBar(MainWindow) self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 26)) self.menuBar.setObjectName(_fromUtf8("menuBar")) MainWindow.setMenuBar(self.menuBar)

self.mainToolBar = QtGui.QToolBar(MainWindow) self.mainToolBar.setObjectName(_fromUtf8("mainToolBar")) MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)

self.statusBar = QtGui.QStatusBar(MainWindow) self.statusBar.setObjectName(_fromUtf8("statusBar")) MainWindow.setStatusBar(self.statusBar)

self.retranslateUi(MainWindow)

# Affiche un icône sur le bouton PushButton # self.image_01 = "C:\Program Files\FreeCAD0.13\icone01.png" # adapter le nom de l'icône self.image_01 = path+"icone01.png" # adapter le nom de l'icône icon01 = QtGui.QIcon icon01.addPixmap(QtGui.QPixmap(self.image_01),QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton.setIcon(icon01) self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # cette commande inverse la direction du bouton

# Affiche un icône sur le bouton RadioButton # self.image_02 = "C:\Program Files\FreeCAD0.13\icone02.png" # adapter le nom de l'icône self.image_02 = path+"icone02.png" # adapter le nom de l'icône icon02 = QtGui.QIcon icon02.addPixmap(QtGui.QPixmap(self.image_02),QtGui.QIcon.Normal, QtGui.QIcon.Off) self.radioButton.setIcon(icon02) # self.radioButton.setLayoutDirection(QtCore.Qt.RightToLeft) # cette commande inverse la direction du bouton

# Affiche un icône sur le bouton CheckBox # self.image_03 = "C:\Program Files\FreeCAD0.13\icone03.png" # adapter le nom de l'icône self.image_03 = path+"icone03.png" # adapter le nom de l'icône icon03 = QtGui.QIcon icon03.addPixmap(QtGui.QPixmap(self.image_03),QtGui.QIcon.Normal, QtGui.QIcon.Off) self.checkBox.setIcon(icon03) # self.checkBox.setLayoutDirection(QtCore.Qt.RightToLeft) # cette commande inverse la direction du bouton

def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "FreeCAD", None)) self.pushButton.setText(_translate("MainWindow", "OK", None)) self.lineEdit.setText(_translate("MainWindow", "tyty", None)) self.checkBox.setText(_translate("MainWindow", "CheckBox", None)) self.radioButton.setText(_translate("MainWindow", "RadioButton", None))

def on_checkBox_clicked(self): if self.checkBox.checkState==0: App.Console.PrintMessage(str(self.checkBox.checkState)+" CheckBox KO\r\n") else: App.Console.PrintMessage(str(self.checkBox.checkState)+" CheckBox OK\r\n") # App.Console.PrintMessage(str(self.lineEdit.setText("tititi"))+" LineEdit\r\n") #écrit le texte dans la fenêtre lineEdit ! # str(self.lineEdit.setText("tititi")) #écrit le texte dans la fenêtre lineEdit App.Console.PrintMessage(str(self.lineEdit.displayText)+" LineEdit\r\n")

def on_radioButton_clicked(self): if self.radioButton.isChecked: App.Console.PrintMessage(str(self.radioButton.isChecked)+" Radio OK\r\n") else: App.Console.PrintMessage(str(self.radioButton.isChecked)+" Radio KO\r\n")

def on_lineEdit_clicked(self): # if self.lineEdit.textChanged: App.Console.PrintMessage(str(self.lineEdit.displayText)+" LineEdit Display\r\n")

def on_pushButton_clicked(self): App.Console.PrintMessage("Terminé\r\n") self.window.hide

MainWindow = QtGui.QMainWindow ui = Ui_MainWindow(MainWindow) MainWindow.show

ici le code pour afficher l'icône sur le pushButton, modifiez le nom pour un autre bouton, (radioButton, checkBox) ainsi que le chemin de l'icône. # Affiche un icône sur le bouton PushButton # self.image_01 = "C:\Program Files\FreeCAD0.13\icone01.png" # adapter le nom de l'icône self.image_01 = path+"icone01.png" # adapter le nom de l'icône icon01 = QtGui.QIcon icon01.addPixmap(QtGui.QPixmap(self.image_01),QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton.setIcon(icon01) self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # cette commande inverse la direction du bouton La commande UserAppData donne le chemin utilisateur AppHomePath donne le chemin d'installation de FreeCAD path = FreeCAD.ConfigGet("AppHomePath") Cette commande inverse le sens horizontal du bouton, droite à gauche self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # cette commande inverse la direction du bouton
 * 1)        path = FreeCAD.ConfigGet("UserAppData")

Méthode 2
Une autre méthode pour afficher une fenêtre, ici en créant un fichier QtForm.py qui renferme l'entête du programme (module appelé avec import QtForm), et d'un deuxième module qui renferme le code de la fenêtre tous ces accessoires, et votre code (le module appelant).

Cette méthode nécessite 2 fichiers distincts, mais permet de raccourcir votre programme, en utilisant le fichier QtForm.py en import. Il faut alors distribuer les deux fichiers ensemble, ils sont indissociables.

Le fichier QtForm.py

from PyQt4 import QtCore, QtGui
 * 1) -*- coding: utf-8 -*-
 * 2) Create by flachyjoe

try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s

try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig)

class Form(object): def __init__(self, title, width, height): self.window = QtGui.QMainWindow self.title=title self.window.setObjectName(_fromUtf8(title)) self.window.setWindowTitle(_translate(self.title, self.title, None)) self.window.resize(width, height)

def show(self): self.createUI self.retranslateUI self.window.show def setText(self, control, text): control.setText(_translate(self.title, text, None))

Le fichier appelant, qui contient la fenêtre et votre code.

Le fichier mon_fichier.py

Les connections sont à faire, un bon exercice.

from PyQt4 import QtCore, QtGui import QtForm
 * 1) -*- coding: utf-8 -*-
 * 2) Create by flachyjoe

class myForm(QtForm.Form): def createUI(self): self.centralWidget = QtGui.QWidget(self.window) self.window.setCentralWidget(self.centralWidget) self.pushButton = QtGui.QPushButton(self.centralWidget) self.pushButton.setGeometry(QtCore.QRect(30, 170, 93, 28)) self.pushButton.clicked.connect(self.on_pushButton_clicked) self.lineEdit = QtGui.QLineEdit(self.centralWidget) self.lineEdit.setGeometry(QtCore.QRect(30, 40, 211, 22)) self.checkBox = QtGui.QCheckBox(self.centralWidget) self.checkBox.setGeometry(QtCore.QRect(30, 90, 81, 20)) self.checkBox.setChecked(True) self.radioButton = QtGui.QRadioButton(self.centralWidget) self.radioButton.setGeometry(QtCore.QRect(30, 130, 95, 20)) def retranslateUI(self): self.setText(self.pushButton, "Fermer") self.setText(self.lineEdit, "essai de texte") self.setText(self.checkBox, "CheckBox") self.setText(self.radioButton, "RadioButton") def on_pushButton_clicked(self): self.window.hide

myWindow=myForm("Fenêtre de test",400,300) myWindow.show

Quelques commandes utiles
# Affiche un icône sur le bouton PushButton # self.image_01 = "C:\Program Files\FreeCAD0.13\icone01.png" # adapter le nom de l'icône self.image_01 = path+"icone01.png" # adapter le nom de l'icône icon01 = QtGui.QIcon icon01.addPixmap(QtGui.QPixmap(self.image_01),QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton.setIcon(icon01) self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # cette commande inverse la direction du bouton path = FreeCAD.ConfigGet("AppHomePath") # donne le chemin d'installation de FreeCAD
 * 1) ici le code pour afficher l'icône sur le pushButton,
 * 2) modifiez le nom pour un autre bouton, (radioButton, checkBox) ainsi que le chemin de l'icône,
 * 1) path = FreeCAD.ConfigGet("UserAppData") # donne le chemin utilisateur

self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # cette commande inverse la direction du bouton
 * 1) Cette commande inverse le sens horizontal du bouton,  droite à gauche

self.pushButton.setToolTip(_translate("MainWindow", "Quitter la fonction", None)) # affiche une info sur le bouton
 * 1) affiche une info sur le bouton

self.pushButton.setStyleSheet("background-color: red") #cette fonction donne une couleur au bouton
 * 1) cette fonction donne une couleur au bouton

self.pushButton.setStyleSheet("color : #ff0000") #cette fonction donne une couleur au texte du bouton
 * 1) cette fonction donne une couleur au texte du bouton

self.pushButton.setStyleSheet("color : #ff0000; background-color : #0000ff;" ) #combinaison des deux, bouton et texte
 * 1) combinaison des deux, bouton et texte

MainWindow.setWindowIcon(QtGui.QIcon('C:\Program Files\FreeCAD0.13\View-C3P.png'))
 * 1) remplacer l'icône de la fenêtre principale

self.lineEdit.returnPressed.connect(self.execute) #connecte le lineEdit sur "def execute" après validation sur entrée
 * 1) connecte une lineEdit sur execute
 * 1) self.lineEdit.textChanged.connect(self.execute) #connecte le lineEdit sur "def execute" à chaque frappe sur le clavier

self.lineEdit.setText(str(val_X)) # affiche la valeur dans lineEdit (convertir en string)
 * 1) afficher un texte dans une lineEdit

val_X = self.lineEdit.text # extrait la chaine (string) contenue dans lineEdit val_X = float(val_X0)       # converti la chaine en flottant val_X = int(val_X0)         # converti la chaine en integer
 * 1) extraire la chaine contenue dans une lineEdit

font = QtGui.QFont font.setFamily("Times New Roman") font.setPointSize(10) font.setWeight(10) font.setBold(True) # même résultat avec les balises "votre texte" (dans les guillemets) self.label_6.setFont(font) self.label_6.setObjectName("label_6") self.label_6.setStyleSheet("color : #ff0000") #cette fonction donne une couleur au texte self.label_6.setText(_translate("MainWindow", "Sélectionnez une vue", None))
 * 1) ce code permet de changer la police de caractère et ses attributs

En utilisant les caractères accentués, dans le cas ou vous obtenez les erreurs suivantes :

plusieurs méthodes sont possibles.

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

App.activeDocument.CopyRight.Text = str(unicode(self.lineEdit_20.text, 'ISO-8859-1').encode('UTF-8')) DESIGNED_BY = unicode(self.lineEdit_01.text, 'ISO-8859-1').encode('UTF-8') ou avec la procédure def utf8(unio): return unicode(unio).encode('UTF8')
 * 1) conversion à partir d'une lineEdit

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 9: ordinal not in range(128) a = u"Nom de l'élément : " f.write(a.encode('iso-8859-1')+str(element_)+"\n") ou avec la procédure def iso8859(encoder): return unicode(encoder).encode('iso-8859-1') ou iso8859(unichr(176)) ou unichr(ord(176)) ou uniteSs = "mm"+iso8859(unichr(178)) print unicode(uniteSs, 'iso8859')
 * 1) conversion