PySide Simplissimus : tout en un

PySide Simplissimus : des tutoriels d'une dizaine de minutes pour un débutant par un débutant

| Traducteur : Thibaut Cuvelier | Qt Developer Network |

Voici la dernière manière de combiner les trois scripts précédents. Dans cette version, on va éliminer le fichier combine.ui et sa version Python, ui_combine.py : on n'utilise donc plus le Qt Designer.

Commentez

- Titre : PySide Simplissimus : tout en un

- Auteurs : Traducteur : Thibaut Cuvelier, Qt Developer Network

- Parution : 14 mai 2011

- Mise à jour : 12 juillet 2011

- Licence : Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. L'article original

- II. Tout combiner

- III. Remerciements

I - L'article original

Le Qt Developer Network est un réseau de développeurs utilisant Qt afin de partager leur savoir sur ce framework. Vous pouvez le consulter en anglais.

Nokia, Qt, Qt Quarterly et leurs logos sont des marques déposées de Nokia Corporation en Finlande et/ou dans les autres pays. Les autres marques déposées sont détenues par leurs propriétaires respectifs.

Cet article est la traduction de Combine All In One.

II - Tout combiner

On aura maintenant un grand avantage : moins de fichiers. Par contre, si on décide plus tard de changer l'interface, on ne pourra plus utiliser Qt Designer. Quand le programme n'est qu'une GUI pour un programme sous-jacent, il est parfois utile d'utiliser ce format modifié. En tout cas, certains ouvrages recommandent cette forme, en suggérant qu'elle est aussi facile que la conception avec aide visuelle.

La modification est implémentée en copiant d'abord la procédure setupUi() du fichier ui_combine.py dans le corps du programme. Ensuite, toutes ces lignes sont transférées dans la procédure init() du programme principal. Cela requiert plusieurs modifications. Heureusement, elles représentent une occasion de vérifier la bonne compréhension du processus. On en profite pour déterminer précisément les widgets à importer, comme on n'utilise plus les noms QtCore et QtGui dans le code. Il a soudain l'air plus clair !

#!/usr/bin/env python
# combine_allin1.py - combination of ShowGPL, About, Close scripts
# The purpose of this version of program is to show implementation
# of most code in one file - all_in_1!.

import sys
import platform

import PySide

from PySide.QtCore import QRect
from PySide.QtGui import QApplication, QMainWindow, QTextEdit, QPushButton,\
QMessageBox,  QIcon, QAction, QWidget, QGridLayout,\
QTextEdit, QMenuBar, QMenu, QStatusBar

__version__ = '0.0.0'
import qrc_combine

class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
#       self.setObjectName("MainWindow")
self.resize(731, 475)
centralwidget = QWidget(self)
#       centralwidget.setObjectName("centralwidget")
gridLayout = QGridLayout(centralwidget)
#       gridLayout.setObjectName("gridLayout")
# textEdit needs to be a class variable.
self.textEdit = QTextEdit(centralwidget)
#       self.textEdit.setObjectName("textEdit")
gridLayout.addWidget(self.textEdit, 0, 0, 1, 1)
self.setCentralWidget(centralwidget)
menubar = QMenuBar(self)
menubar.setGeometry(QRect(0, 0, 731, 29))
#       menubar.setObjectName("menubar")
menu_File = QMenu(menubar)
#       menu_File.setObjectName("menu_File")
self.setMenuBar(menubar)
statusbar = QStatusBar(self)
#       statusbar.setObjectName("statusbar")
self.setStatusBar(statusbar)
actionShow_GPL = QAction(self)
#       actionShow_GPL.setObjectName("actionShow_GPL")
actionShow_GPL.triggered.connect(self.showGPL)
action_About = QAction(self)
#       action_About.setObjectName("action_About")
action_About.triggered.connect(self.about)
iconToolBar = self.addToolBar("iconBar.png")
actionShow_GPL.setIcon(QIcon(":/showgpl.png"))
action_About.setIcon(QIcon(":/about.png"))
action_Close = QAction(self)
action_Close.setCheckable(False)
action_Close.setObjectName("action_Close")
action_Close.setIcon(QIcon(":/quit.png"))
actionShow_GPL.setStatusTip("Show GPL Licence")
action_About.setStatusTip("Pop up the About dialog.")
action_Close.setStatusTip("Close the program.")
menu_File.addAction(actionShow_GPL)
menu_File.addAction(action_About)
menu_File.addAction(action_Close)
menubar.addAction(menu_File.menuAction())

iconToolBar.addAction(actionShow_GPL)
iconToolBar.addAction(action_About)
iconToolBar.addAction(action_Close)
action_Close.triggered.connect(self.close)

def showGPL(self):
'''Read and display GPL licence.'''
self.textEdit.setText(open('COPYING.txt').read())

def about(self):
'''Popup a box with about message.'''
QMessageBox.about(self, "About PyQt, Platform and the like",
"""<b> About this program </b> v %s
<p>Copyright © 2011 Your Name.
All rights reserved in accordance with
GPL v2 or later - NO WARRANTIES!
<p>This application can be used for
displaying OS and platform details.
<p>Python %s - PySide version %s - Qt version %s on %s""" % \
(__version__, platform.python_version(), PySide.__version__,\
PySide.QtCore.__version__, platform.system()))

if __name__ == '__main__':
app = QApplication(sys.argv)
frame = MainWindow()
frame.show()
sys.exit(app.exec_())

Vous avez fort probablement remarqué que certaines lignes étaient systématiquement commentées : celles qui appellent des méthodes setObjectName(). Pourquoi ? Elles ne sont pas du tout utilisées dans ce tutoriel, le programme fonctionne aussi bien sans elles. Elles ne sont cependant pas juste supprimées, elles proviennent de l'utilisation de Qt Designer et de la conversion avec pyside-uic, elles pourraient être utiles pour certaines situations de débogage. Cela ne coûte donc rien de les commenter.

Ceci est la dernière variation de combinaison explorée. Il est bien temps de venir à un vrai problème d'ingénierie dans lequel on utilise PySide pour la GUI du programme sous-jacent. Le problème est très simple : la détermination de forces dans un treillis. La méthode de résolution et la gestion des données sont réalistes mais pas trop complètes, pour rester dans le cadre d'un tutoriel de débutant pour débutant.

III - Remerciements

Merci à Claude Leloup pour sa relecture attentive !