be able to edit the data through the QListView, using a custom BarGraphDelegate to
control both the presentation and the editing of data items in the list view.
The model should be a QAbstractListModel subclass, and should hold a list of data
values (integers), and a dictionary of colors (keyed by "row", e.g., the color with key 6
corresponds to the 7th data value and so on). The model should reimplement rowCount
(), insertRows()—including calls to beginInsertRows() and endInsertRows()
where appropriate, flags() to make the model editable, setData() to allow the value
(Qt.DisplayRole) and a value's color (Qt.UserRole) to be set—and which should emit
signals to indicate that data has changed, and data() which should return the value, color,
and for the Qt.DecorationRole, a 20 x 20 pixmap filled with the color. If no color has
been set for a particular row, use a default of red.
The delegate is quite simple, and very similar to the IntegerColumnDelegate
mentioned earlier in this chapter. The key difference is that the paint() method must be
reimplemented, but only to set the alignment to Qt.AlignRight; the painting can still
be done perfectly well by the base class.
Figure 16.5. The Bar Grapher Application's Widgets
The custom view will need to reimplement setModel() in which connections should be
made to the base class's update() method so that repainting occurs when the model's
data is changed, minimumSizeHint(), sizeHint()—which can simply call
minimumSizeHint(), and paintEvent(). The paint event can be done in just over a
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 507
Return to Table
of 
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
Pdf signatures - C# PDF File Permission Library: add, remove, update PDF file permission in C#.net, ASP.NET, MVC, WPF
Tell C# users how to set PDF file permissions, like printing, copying, modifying, extracting, annotating, form filling, etc
pdf secure signature; add signature to pdf acrobat
Pdf signatures - VB.NET PDF File Permission Library: add, remove, update PDF file permission in vb.net, ASP.NET, MVC, WPF
VB.NET Tutorial for How to Set PDF File Access Permissions Using XDoc.PDF for .NET
pdf converter sign in; sign pdf online
dozen lines—make sure that you use QPainter.setWindow() so that the graph always
fills the available space. All the methods should work correctly even if no model has been
set, for example, with no model the paint event should paint nothing.
Here is the code for the MainForm, to give a feel for how the classes are used:
class MainForm(QDialog):
def __init__(self, parent=None):
super(MainForm, self).__init__(parent)
self.model = BarGraphModel()
self.barGraphView = BarGraphView()
self.barGraphView.setModel(self.model)
self.listView = QListView()
self.listView.setModel(self.model)
self.listView.setItemDelegate(BarGraphDelegate(0, 1000, self))
self.listView.setMaximumWidth(100)
self.listView.setEditTriggers(QListView.DoubleClicked|
QListView.EditKeyPressed)
layout = QHBoxLayout()
layout.addWidget(self.listView)
layout.addWidget(self.barGraphView, 1)
self.setLayout(layout)
self.setWindowTitle("Bar Grapher")
In the model solution we added some extra code to create twenty random items to create
an initial bar graph. The whole thing can be done in under 200 lines.
A solution is provided in chap16/bargrapher.pyw.
17. Online Help and Internationalization
Online Help
Internationalization
Users may be able to use a very simple application just by reading its menu options and
button texts. Other applications may require a little more information, and in these cases
tooltips and status tips are an easy-to-program solution. But some applications are so
complex or sophisticated that users may need more extensive help to understand what
facilities are available to them, and how to use the application.
Tooltips and Status tips 169
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 508
Return to Table
of 
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
C# PDF Digital Signature Library: add, remove, update PDF digital
less. How to C#: Add Digital Signatures to PDF. Help to Improve the Security of Your PDF File by Adding Digital Signatures. Overview.
click to sign pdf; add signature image to pdf acrobat
VB.NET PDF Digital Signature Library: add, remove, update PDF
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET edit PDF digital signatures, C#.NET
add signature to pdf document; add signature image to pdf
One solution to giving adequate information is to supply a printed manual, another is to
provide a help system. There are several possible approaches that can be used to create a
suitable online help system; we will mention them all, and show one of them. We will return
to the Image Changer application introduced in Chapter 6, and in this chapter's first section
we will show the implementation of the application's MainWindow.helpHelp()
method, and how to provide an online help system.
Throughout the book, the applications shown have provided menu texts, button texts,
labels, tips, and so on, in English. This is fine for the minority of the world's people who
can read English, but not much use to those who speak the world's most widely spoken
language, Mandarin Chinese, or to those who speak other major languages such as Spanish,
Arabic, Hindi, Portuguese, Bengali, Russian, or Japanese.
To make an application as widely useable as possible it must be accessible to non-English
speakers. PyQt provides a toolchain for identifying user-visible strings and for making
these strings available in the easy-to-use Qt Linguist GUI application that human
translators can use to provide suitable translations. In this chapter's second section we will
discuss the translation tools and show how to use them. We will also present a new
translation-aware version of the Image Changer application suitable for use with the
translation tools.
Online Help
There are three common ways of providing an online help system. One approach is to
provide the help in the form of HTML files, and to launch a web browser set to the relevant
page. Another is to use the Qt Assistant application provided with Qt. And another to
provide a help form, again using HTML, but with the images and HTML files as resources.
The first approach can be achieved by launching a web browser as a separate process, either
using Python's subprocess module, or using PyQt's QProcess class. Qt 4.2 introduced
a new class, QDesktopServices, that makes it really easy to launch a browser in a
platform independent way with its openUrl() static convenience method.
The second approach is trickier since it requires us to create an XML file in a special format
and to distribute Qt Assistant with our application. The advantage of using Qt Assistant
is that it provides automatic indexing.
The third approach, using a custom help form and with HTML files and images as
resources, is the one that we will use. We saw back in Chapter 6 when we looked at resource
files, that we could include arbitrary files, including HTML files, and we incorporated some
demo help files in our resources.qrc file. Here is the code for the Image Changer's
MainWindow.helpHelp() method:
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 509
Return to Table
of 
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit PDF
HTML5 Viewer for C# .NET enables you to create signatures to PDF, including freehand signature, text and date signature. If you
create pdf with signature field; adding signature to pdf files
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit Excel
Robust API can help users freely implement conversion from Excel document to PDF, Tiff and HTML file. HTML5 Viewer. Excel document protection with signatures.
adding a signature to a pdf form; add signature to pdf preview
def helpHelp(self):
form = helpform.HelpForm("index.html", self)
form.show()
Resource files 170
Using our help form is easy: We just give it one of the HTML files, and self (over which
the form will center itself). Notice that we use show() rather than exec_(); this almost
always means that the form shown will have the delete on close attribute set.
The screenshot in Figure 17.1 may give the misleading impression that keyboard users are
not catered for, but in fact the class used to show the HTML files, QTextBrowser, provides
good keyboard support. For example, users can press Tab to move the focus from hyperlink
to hyperlink, and Enter to follow a hyperlink. They can go back by pressing Alt+Left
Arrow, and they can go to the first page by pressing Home. And because the form is a
QDialog subclass, they can close the window by pressing Esc.
Figure 17.1. The Image Changer Help form
By now we are very familiar with creating PyQt dialogs, so we will confine ourselves to just
showing those extracts that are relevant to creating the online help system—specifically, a
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 510
Return to Table
of 
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
C# PDF Library SDK to view, edit, convert, process PDF file for C#
WinFoms project. Support protecting PDF file by adding password and digital signatures with C# sample code in .NET Class. Feel free
add signature to pdf; add signature box to pdf
VB.NET Create PDF Library SDK to convert PDF from other file
Create and save editable PDF with a blank page, bookmarks, links, signatures, etc. Create fillable PDF document with fields in Visual Basic .NET application.
add signature to pdf file; create signature field in pdf
couple of extracts from the HelpForm's initializer, and one of its methods. (The code is in
chap17/helpform.py.)
class HelpForm(QDialog):
def __init__(self, page, parent=None):
super(HelpForm, self).__init__(parent)
self.setAttribute(Qt.WA_DeleteOnClose)
self.setAttribute(Qt.WA_GroupLeader)
The Qt.WA_GroupLeader attribute ensures that if the help form is invoked from a modal
dialog, the user will be able to interact both with the modal dialog and with the help form,
something that would not be possible otherwise. If the help form is invoked from a
modeless dialog or main window, the attribute has no effect, and the user can interact with
both as usual.
self.textBrowser.setSearchPaths([":/"])
self.textBrowser.setSource(QUrl(page))
The QTextBrowser class is a subclass of QTextEdit that can be used to display a large
subset of HTML tags, including images, lists, and tables. We have set its search path to the
resource file's root directory, and set its initial page to be the page that was passed in.
Because we have set a search path we are able to pass a page without a path, e.g., simply
index.html or filemenu.html. The QTextBrowser understands resource paths, and
is therefore able to find image resources in <img> tags such as <img src=":/
filenew.png">.
self.connect(backAction, SIGNAL("triggered()"),
self.textBrowser, SLOT("backward()"))
self.connect(homeAction, SIGNAL("triggered()"),
self.textBrowser, SLOT("home()"))
self.connect(self.textBrowser, SIGNAL("sourceChanged(QUrl)"),
self.updatePageTitle)
Navigating from page to page is handled automatically by the QTextBrowser.
Nonetheless, we have provided two toolbar buttons, Back and Home, and connected them
to the appropriate QTextBrowser slots to get the behavior we want. If the HTML
document is changed, for example, due to the user clicking a hyperlink, we call a custom
updatePageTitle() slot.
def updatePageTitle(self):
self.pageLabel.setText(self.textBrowser.documentTitle())
This slot simply puts the HTML page's <title> text in a QLabel that is in the toolbar,
to the right of the toolbar buttons.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 511
Return to Table of
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
C# WPF Viewer: Load, View, Convert, Annotate and Edit PDF
Insert text box to PDF file. • Draw markups to PDF document. PDF Protection. • Add signatures to PDF document. • Erase PDF text. • Erase PDF images.
pdf signature; create pdf signature field
VB.NET PDF - WPF PDF Viewer for VB.NET Program
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET edit PDF digital signatures, C#.NET
add jpeg signature to pdf; create signature pdf
Once we have a HelpForm class, we can implement our online help system entirely in
HTML, either including the files as resources, or alternatively, installing them in the file
system and finding them using code like this:
helppath = os.path.join(os.path.dirname(__file__), "help")
This assumes that the help files are in a help directory which resides in the directory where
the application's .pyw file is located.
Writing the code to provide an online help system is straightforward; but designing a
system that is easy to navigate, and that is understandable, can be quite a challenge.
Internationalization
There are several issues to consider when making applications suitable for users who speak
a different language than the one used originally. The largest and most obvious issue is
that all user-visible strings must be translated into the target language—this not only
includes the strings used for menu options and dialog buttons, but also tooltips, status
tips, and any other online help. In addition we must perform other localizations, such as
making sure that numbers use the appropriate decimal marker and thousands symbol,
that time and date formats are correct, and that paper sizes and systems of measurement
are right. For example, English is spoken by most American and British people, but the
two cultures have different date format conventions, different currencies, different
standard paper sizes, and different systems of measurement.
Thanks to the use of Unicode, any character used by just about any human language can
be displayed. We saw near the beginning of the book that any unicode character can be
included in unicode or QString strings using the unicode escape character and the target
character's hexadecimal code point, or using the unichr() function. As for reading and
writing text files containing Unicode we can use Python's codecs.open() function, or
PyQt's QTextStream as we saw in an earlier chapter.
Unicode Strings 20
Text Files 247
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 512
Return to Table of
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
VB.NET Create PDF from Excel Library to convert xlsx, xls to PDF
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET edit PDF digital signatures, C#.NET
adding signature to pdf form; create pdf signature stamp
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET edit PDF digital signatures, C#.NET
pdf to word converter sign in; add signature pdf preview
When it comes to some aspects of localization we can use QString, QDate and
QDateTime. For example, assuming n is a number, QString("%L1").arg(n) will
produce a QString with thousands and decimal separators suitable to the current locale.
Both QDate and QDateTime have toString() methods that can accept either a custom
format, or a predefined format such as Qt.SystemLocaleDate (Qt.LocalDate in
older code), or Qt.ISODate which is "universal". In addition, the QLocale class provides
many methods for returning localized QStrings, and a few methods for extracting
numbers from localized QStrings. It also has methods that return locale-specific
characters such as the character to use as a negative sign, a percentage symbol, and so on.
QString.arg() 398
Most of the work involved with internationalizing an application is concerned with
translation, so it is this topic that we will focus on for the rest of the section.
To help translate applications, PyQt provides a toolchain of three tools: pylupdate4,
lrelease, and Qt Linguist. For these tools to be useful, every user-visible string must be
specially marked. This is easily achieved by using the QObject.tr() method, which is
inherited by all QWidget subclasses, including all dialogs and main windows. For example,
instead of writing QString("&Save"), we write self.tr("&Save") instead. The text
passed to tr() should be ASCII; if characters outside the ASCII range are required, use
trUtf8() instead.
For each string marked for translation, the translation tools are provided with a pair of
strings: A "context" string (the class name), and the marked string itself. The purpose of
the context is to help human translators identify which window the string to translate is
shown in, since different translations might be needed in different windows in some
languages.
For strings that need translating which are not inside classes, we must use the
QApplication.translate() method, and supply the context string ourselves. For
example, in a main() function we might translate the application's name like this:
QApplication.translate("main", "Gradgrind"). Here, the context is "main",
and the string to translate is "Gradgrind".
Unfortunately, the context used by self.tr() can be different from that used by C++/
Qt's tr() method, because PyQt determines the context dynamically, whereas C++ does
so at compile time.
[*]
This may matter if translation files are being shared between C++/
Qt and PyQt applications. It can also be an issue if forms are subclassed. If this is ever a
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 513
Return to Table of
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
problem, the solution is simply to replace each single argument self.tr() call with a
two argument QApplication.translate() call, explicitly giving the correct context
as the first argument, and the string to be translated as the second argument.
[*] See the PyQt pyqt4ref.html documentation, under "Differences Between PyQt and Qt".
Once all of an application's user-visible strings are suitably marked we must slightly change
the way the application starts up so that it reads in the translated strings for the locale in
which it is run.
Here is how an internationalized application is created:
1.Create the application using QObject.tr() or QApplication.translate()
for all user-visible strings.
2.Modify the application to read in the locale-specific .qm (Qt message) files at start
up if they are available.
3.Create a .pro file that lists the application's .ui (Qt Designer) files, its .py
and .pyw source files, and the .ts (translation source) file that it will use.
4.Run pylupdate4 to create the .ts file.
5.Ask the translator to translate the .ts file's strings using Qt Linguist.
6.Run lrelease to convert the updated .ts file (that contains the translations) to
a .qm file.
And here is how such an application is maintained:
1.Update the application making sure that all user-visible strings use QObject.tr
() or QApplication.translate().
2.Update the .pro file if necessary, for example, adding any new .ui or .py files that
have been added to the application.
3.Run pylupdate4 to update the .ts file with any new strings.
4.Ask the translator to translate any new strings in the .ts file.
5.Run lrelease to convert the .ts file to a .qm file.
We will cover all the steps listed above, starting with the use of QObject.tr(), using
extracts from the translation-aware version of the Image Changer application in the
chap17 directory.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 514
Return to Table of
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
fileNewAction = self.createAction(self.tr("&New..."),
self.fileNew, QKeySequence.New, "filenew",
self.tr("Create an image file"))
The first string marked for translation is the menu option string, 
New..., and the second
is the string used for tooltips and status tips. (The "filenew" string is the name of the
icon file without its .png suffix.)
self.fileMenu = self.menuBar().addMenu(self.tr("&File"))
Menu strings as well as action strings must be translated.
self.statusBar().showMessage(self.tr("Ready"), 5000)
Here we have an initial status message for the user, and again we must use tr().
One situation where it is not usually appropriate to translate, are the strings used as
QSettings keys, especially since these strings are not normally visible to the user.
reply = QMessageBox.question(self,
self.tr("Image Changer - Unsaved Changes"),
self.tr("Save unsaved changes?"),
QMessageBox.Yes|QMessageBox.No|
QMessageBox.Cancel)
For this message box we have marked both the window title and the message text for
translation. We don't have to worry about translating the buttons in this case because we
are using standard buttons and Qt has translations for these.
[*]
If we had used our own texts
we would have had to use tr() on them, like any other user-visible string.
[*]
Trolltech provides translations for some languages, such as French and German, and some unsupported translations to various other languages. These translations
are in Qt's (not PyQt's) translations directory; search your file system for qt_fr.qm for example, to find the French translation.
self.tr("Saved %1 in file %2").arg(self.dataname).arg(self.filename)
One way of providing the string shown above would be to write:
self.tr("Saved %s in file %s" % (self.dataname, self.filename)) # BAD
This is not recommended. Always use QStrings, and always use QString.arg(); this
makes it easier for translators. (The tr() method returns a QString, so we can call any
QString method, such as arg(), on its return value.) For example, in some languages
the translation would be phrased "Saved in file %2 the data %1". This is no problem using
a QString with arg()s since the translator can change the order of the %n's in the string
and the arg() methods will respect this. But swapping one Python string's %s for another
will not change anything.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 515
Return to Table of
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
We must use tr() for every user-visible string in hand-coded .pyw and .py files. But
for .py files generated from .ui files by pyuic4 we don't need to do anything, since
pyuic4 automatically uses QApplication.translate() on all strings anyway. This
works even for untranslated applications because if there is no suitable translation the
original language, for example English, is used instead.
A PyQt application usually uses PyQt built-in dialogs, for example, the "file open" dialog,
or the "file print" dialog. These must also be translated, although for several languages
translations are already available in the .qm files provided by Trolltech.
Having used tr() throughout, and located an appropriate Qt translation, we are ready to
modify the application's start up code to load in suitable translation files if they exist.
app = QApplication(sys.argv)
locale = QLocale.system().name()
qtTranslator = QTranslator()
if qtTranslator.load("qt_" + locale, ":/"):
app.installTranslator(qtTranslator)
appTranslator = QTranslator()
if appTranslator.load("imagechanger_" + locale, ":/"):
app.installTranslator(appTranslator)
app.setOrganizationName("Qtrac Ltd.")
app.setOrganizationDomain("qtrac.eu")
app.setApplicationName(app.translate("main", "Image Changer"))
app.setWindowIcon(QIcon(":/icon.png"))
form = MainWindow()
form.show()
app.exec_()
The QLocale.system().name() call will return a string such as "en_US" (English, US),
or "fr_CA" (French, Canada), and so on. The QTranslator.load() method takes a file
stem and a path. In this case we have given the path of :/ which is the application's resource
file. If the locale were "fr_CA", the file stems would be qt_fr_CA and
imagechanger_fr_CA. Given these, PyQt will look for qt_fr_CA.qm, and failing that,
for qt_fr.qm, and similarly for imagechanger_fr_CA.qm and failing that for
imagechanger_fr.qm. If the locale was "en_US", no .qm files would be found, and
therefore none installed—and this is fine since the application would then fall back to use
the original strings which are in English anyway.
Notice that we had to use QApplication.translate() (written as app.translate
()), since this code is not inside a QObject subclass's method. With no class name, we
chose to use the text "main" for the context; some programmers might prefer to use
"global"—we are free to use any name we like—the purpose of contexts is purely to help
human translators.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 516
Return to Table of
Contents
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall
Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu
Print Publication Date: 2007/10/19
User number: 905221 Copyright 2007, Safari Books Online, LLC.
This PDF is exclusively for your use in accordance with the Safari Terms of Service. No part of it may be reproduced or transmitted in any form by any means without the prior
written permission for reprints and excerpts from the publisher. Redistribution or other use that violates the fair use priviledge under U.S. copyright laws (see 17 USC107) or that
otherwise violates the Safari Terms of Service is strictly prohibited.
Documents you may be interested
Documents you may be interested