[PyQt] Boîte de dialogue

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

[PyQt] Boîte de dialogue

Post by mario52 »

Bonjour
J'ai fait une boîte de dialogue avec Qt, si j'exécute le code tel quel dans FreeCAD, la fenêtre s'affiche et disparaît et ferme FreeCAD (sys.exit(app.exec_()))
si je l'adapte avec la procédure Dialog_creation http://sourceforge.net/apps/mediawiki/f ... reation/fr
je sais l'afficher mais à sa fermeture, FreeCAD se bloque comme décrit ici https://sourceforge.net/apps/mediawiki/ ... eCADGui/fr.
PS: dans le gestionnaire de tâches de Windows, il y a autant d'instances de FReeCAD que de blocages peut être une piste ?

Ici une simple fenêtre avec une lineEdit, un checkBox, un radioButton, un pushButton.
Ce serait pour savoir comment l'utiliser dans FreeCAD et comment connecter les slots.

Code: Select all


# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mainwindow.ui'
#
# Created: Thu Mar 21 16:24:39 2013
#      by: PyQt4 UI code generator 4.9.6
#
# WARNING! All changes made in this file will be lost!

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 setupUi(self, 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.lineEdit = QtGui.QLineEdit(self.centralWidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 40, 211, 22))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.checkBox = QtGui.QCheckBox(self.centralWidget)
        self.checkBox.setGeometry(QtCore.QRect(30, 90, 81, 20))
        self.checkBox.setChecked(True)
        self.checkBox.setObjectName(_fromUtf8("checkBox"))
        self.radioButton = QtGui.QRadioButton(self.centralWidget)
        self.radioButton.setGeometry(QtCore.QRect(30, 130, 95, 20))
        self.radioButton.setObjectName(_fromUtf8("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)
        QtCore.QMetaObject.connectSlotsByName(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))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
merci
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
ryback08
Posts: 57
Joined: Mon Jan 09, 2012 10:06 pm

Re: [PyQt] Boîte de dialogue

Post by ryback08 »

Je ne suis pas du tout expert programmation mais je me lance :
mario52 wrote:J'ai fait une boîte de dialogue avec Qt, si j'exécute le code tel quel dans FreeCAD, la fenêtre s'affiche et disparaît et ferme FreeCAD (sys.exit(app.exec_()))
c'est la dernière ligne du programme qui ferme tout, supprime la et tu auras ta fenetre.

Code: Select all

 sys.exit(app.exec_())
il me semble que j'avais utiliser xxxx.hide() pour fermer la fenetre a la fin de mon programme.

Je te joins ce que j'avais codé l'année derniere mais ce n'est pas un exemple de genre. j'ai fait comme toi, j'ai pris les exemples et j'ai ajouter mon code. [Macro] Touche de guitare - Guitar Fretboard.
Ce serait pour savoir comment l'utiliser dans FreeCAD et comment connecter les slots
il me semble que la connection se fait au niveau de "self.retranslateUi(Dialog)"
CF Dialog creation

Moi, c'est la partie ci dessous que je ne comprends toujours pas.. je me demande d'ailleurs si il n'y avait pas un souci a ce niveau (ca marchait avec les vieilles version de freecad, j'avais été aidé par la team sur ce point. encore merci a eux.

Code: Select all

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
bonne chance
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: [PyQt] Boîte de dialogue

Post by flachyjoe »

Salut,
voila un code utilisable :

Code: Select all

# -*- 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

		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)
		
		self.lineEdit = QtGui.QLineEdit(self.centralWidget)
		self.lineEdit.setGeometry(QtCore.QRect(30, 40, 211, 22))
		self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
		
		self.checkBox = QtGui.QCheckBox(self.centralWidget)
		self.checkBox.setGeometry(QtCore.QRect(30, 90, 81, 20))
		self.checkBox.setChecked(True)
		self.checkBox.setObjectName(_fromUtf8("checkBox"))
		
		self.radioButton = QtGui.QRadioButton(self.centralWidget)
		self.radioButton.setGeometry(QtCore.QRect(30, 130, 95, 20))
		self.radioButton.setObjectName(_fromUtf8("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_pushButton_clicked(self):
		self.window.hide()

MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow(MainWindow)
MainWindow.show()
Pour connecter les slots la syntaxe est de ce genre :

Code: Select all

self.control.event.connect(function)
La partie avec "import sys, etc." sert, il me semble, à créer un processus, ce n'est pas utilisable ici puisqu'on utilise le processus de FreeCAd qui est déjà existant. C'est pour ça aussi qu'il ne faut pas le fermer mais juste cacher la fenêtre.

Bonne continuation !
- Flachy Joe -
Image
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: [PyQt] Boîte de dialogue

Post by mario52 »

Bonjour

une petite approche avec les slots raccordés

Code: Select all

# -*- 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

        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.checkBox.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.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()

merci flachyjoe je vais pouvoir m’amuser, et bien sûr l'ajouter sur le wiki !
ryback08 wrote: Moi, c'est la partie ci dessous que je ne comprends toujours pas..
ryback08 ça va être facile pour toi aussi, bon amusement ;)
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: [PyQt] Boîte de dialogue

Post by flachyjoe »

Voila un petit raccourci pour créer les fenêtres :
Fichier QtForm.py

Code: Select all

# -*- 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 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))
Utilisation :

Code: Select all

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import QtForm

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()
- Flachy Joe -
Image
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: [PyQt] Boîte de dialogue

Post by mario52 »

Bonjour
merci je vais utiliser la méthode dans un seul fichier
et je vais aussi mettre celle ci dans le wiki
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: [PyQt] Boîte de dialogue

Post by mario52 »

Ici la même fenêtre mais avec un icône sur chaque bouton, de quoi enjoliver la vie.

Code: Select all

# -*- 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("UserAppData")
        path = FreeCAD.ConfigGet("AppHomePath")

        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,

Code: Select all

        # 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

Code: Select all

#        path = FreeCAD.ConfigGet("UserAppData")
        path = FreeCAD.ConfigGet("AppHomePath")
# Cette commande inverse le sens horizontal du bouton, droite à gauche

Code: Select all

self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # cette commande inverse la direction du bouton
# affiche une info sur le bouton

Code: Select all

self.pushButton.setToolTip(_translate("MainWindow", "Quitter la fonction", None)) # affiche une info sur le bouton
#cette fonction donne une couleur au bouton

Code: Select all

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

Code: Select all

self.pushButton.setStyleSheet("color : #ff0000") #cette fonction donne une couleur au texte du bouton 
#combinaison des deux, bouton et texte

Code: Select all

self.pushButton.setStyleSheet("color : #ff0000; background-color : #0000ff;" ) #combinaison des deux, bouton et texte 
#remplacer l'icône de la fenêtre principale

Code: Select all

MainWindow.setWindowIcon(QtGui.QIcon('C:\Program Files\FreeCAD0.13\View-C3P.png'))
# connecte une lineEdit sur execute

Code: Select all

self.lineEdit.returnPressed.connect(self.execute) #connecte le lineEdit après validation sur entrée
# self.lineEdit.textChanged.connect(self.execute) #connecte le lineEdit à chaque frappe sur le clavier
# afficher un texte dans une lineEdit

Code: Select all

self.lineEdit.setText(str(val_X)) # affiche la valeur dans lineEdit (convertir en string)
# extraire la chaine contenue dans une lineEdit

Code: Select all

 val_X = self.lineEdit.text() # extrait la chaine (string) contenue dans lineEdit
# extraire la valeur d'un SpinBox

Code: Select all

numberSpires = self.DS_Numb_Spires.value()
# ce code permet de changer la police de caractère et ses attributs

Code: Select all

        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(10)
        font.setWeight(10)
        font.setBold(True) # même résultat avec les balises "<b>votre texte</b>" (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))
#fonctions pour obtenir la date et l'heure système

Code: Select all

def heure():
    return QtCore.QTime().currentTime().toString('hh:mm:ss') # heure:minutes:secondes
def dateEu():
    return QtCore.QDate().currentDate().toString('dd/MM/yyyy') # date forme euro jour/mois/année
def dateUs():
    return QtCore.QDate().currentDate().toString('yyyy/MM/dd') # date forme us 
def dateComp():
    return QtCore.QDate().currentDate().toString('dddd d MMMM yyyy') # Retourne "dimanche 20 Juillet 69" (on peut jouer avec le format ex:dd MM yyy.....)
Dans le cas ou vous obtenez l'erreur : UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data
# conversion à partir d'une lineEdit

Code: Select all

# conversion à partir d'une lineEdit
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

Code: Select all

def utf8(unio):
    return unicode(unio).encode('UTF8')
ou l'erreur UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 9: ordinal not in range(128)

Code: Select all

# conversion
a = u"Nom de l'élément : "
f.write(a.encode('iso-8859-1')+str(element_)+"\n")
ou avec la procédure

Code: Select all

def iso8859(encoder):
    return unicode(encoder).encode('iso-8859-1')
ou

Code: Select all

iso8859(unichr(176))
ou

Code: Select all

unichr(ord(176))
ou

Code: Select all

uniteSs = "mm"+iso8859(unichr(178))
print unicode(uniteSs, 'iso8859')
[EDIT :05/02/2015 ] ajout de "Extraire la valeur d'un SpinBox"
[EDIT :03/05/2013 ] ajout de Dans le cas ou vous obtenez l'erreur : UnicodeDecodeError: 'utf8'
[EDIT :04/09/2013 ] ajout de Dans le cas ou vous obtenez l'erreur : UnicodeEncodeError: 'ascii'
[EDIT :04/11/2013 ] ajout de uniteSs = "mm"+iso8859(unichr(178))
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
CMT
Posts: 16
Joined: Thu Jan 24, 2019 7:00 pm

Re: [PyQt] Boîte de dialogue

Post by CMT »

Bonjour Mario,
Suivant votre code j'ai essayé d'afficher une icone une fenetre (GUI) mais je n'ai pas pu arriver à l(afficher voila le code :

Code: Select all

from PySide import QtGui, QtCore
class Test(QtGui.QDialog):
	""""""
	def __init__(self):
		super(Test, self).__init__()
		self.initUI()
	def initUI(self):
		# create our window
		# define window	 xLoc,yLoc,xDim,yDim
		self.setGeometry(300, 200, 350, 100)
		self.setMinimumSize(350,400)
		self.setMaximumSize(350,100)		
		self.setWindowTitle("Library")
		self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
		#self.image_01 = "C:\Program Files\FreeCAD 0.17\IconeLIBFACOD\Icone.png" 
        self.image_01 = path+"Icone.png" # adapter le nom de l'icne
        Icone = QtGui.QIcon() 
        Icone.addPixmap(QtGui.QPixmap(self.image_01),QtGui.QIcon.Normal, QtGui.QIcon.ON)
		Icone.move(270,39)
		self.show()
form = Test()
form.exec_()
Pouvez-vous m'aider svp ?
joel
Posts: 195
Joined: Thu Jan 26, 2017 8:17 pm
Location: Thonon les Bains

Re: [PyQt] Boîte de dialogue

Post by joel »

CMT wrote: Wed Feb 20, 2019 9:14 pm Bonjour Mario,
Suivant votre code j'ai essayé d'afficher une icone une fenetre (GUI) mais je n'ai pas pu arriver à l(afficher voila le code :
Pouvez-vous m'aider svp ?
Lire le bandeau rouge tout en haut. Apparemment d'après votre code vous êtes sous Windows et FreeCAD 0.17.
Sous Ubuntu les versions de Qt:
FreeCAD 0.18 et 0.17: Qt 5.9.5.
FreeCAD 0.17 Appimage: Qt 4.8.6
Le lien de Mario Qt_Example https://www.freecadweb.org/wiki/Qt_Example/fr fonctionne très bien avec Qt 4.8.6 et pas avec Qt 5.9.5.
Vérifier votre version Qt. Comme vous êtes avec 0.17 ce devrait être Qt 5.9.5.
Dans FreeCAD: Aide, A Propos, Copier dans le presse papier puis dans Bloc Notes et ici.
Je mets un code avecPIL qu"il faudra sans doute installer. Il faut aussi ouvrir le panneau rapport pour les erreurs et les indiquer.

Code: Select all

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
imgpil = Image.open("chemin et nom de l'image.jpg")  
img = np.asarray(imgpil) # Transformation de l'image en tableau numpy
plt.imshow(img)
plt.show()
L'image ci-dessous est celle obtenue avec le code. Je ne me souviens plus où je l'ai eu.
Attachments
Affichage.png
Affichage.png (113.65 KiB) Viewed 2639 times
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: [PyQt] Boîte de dialogue

Post by mario52 »

Bonjour

ici on crée une fenêtre avec un QLabel() texte + image

Code: Select all

import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import QPixmap, QMovie, QLabel
from PySide.QtCore import *
class MyLabelPatience():
    label = QtGui.QLabel()
    label.setText("<img src=" + path_Name_Image + "><b><center>Wait please</center> \n\n<center>i search the fonts !\n\n</center></b>")
    # center screen
    ecran = FreeCADGui.getMainWindow().frameGeometry()
    xF = 250; yF = 120
    xW = (ecran.width()/2) - (xF/2)
    yW = (ecran.height()/2)- (yF/2)
    label.setGeometry(xW, yW, xF, yF)
    ####
    label.setStyleSheet("QLabel {background-color : #F0C300;font: 12pt; }");
    label.setWindowFlags(Qt.WindowFlags(Qt.FramelessWindowHint))        # pas de bords
#    ### un-comment for use ###############
#    movie = QtGui.QMovie(path_Name_Image)    # anime le fichier Gif anime (decommenter)
#    label.setMovie(movie)
#    movie.start()
#    ##################

patience = MyLabelPatience().label
patience.show()
#patience.close()
#MyLabelPatience().movie.start()
#MyLabelPatience().movie.stop()
Qlabel_Image00.png
Qlabel_Image00.png (12.07 KiB) Viewed 2431 times

mais avec le gif animé je ne vois plus de texte !
Qlabel_Image_Animee00.gif
Qlabel_Image_Animee00.gif (22.32 KiB) Viewed 2431 times
EDIT ajout de la ligne:

Code: Select all

from PySide.QtGui import QMessageBox, QPixmap, QMovie
EDIT 11/06/2019 10h44 Paris placé le code dans une Class

mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
Post Reply