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 !