Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Table of Contents Copyright About the Author Production Introduction The Structure of the Book Acknowledgements Python Programming Data Types and Data Structures Executing Python Code Variables and Objects 12 Numbers and Strings 16 Collections 32 Built-in Functions 42 Summary 45 Exercises 46 Control Structures 48 Conditional Branching 49 Looping 52 Functions 58 Exception Handling 70 Summary 76 Exercises 77 Classes and Modules 80 Creating Instances 82 Methods and Special Methods 84 Inheritance and Polymorphism 105 Modules and Multi-File Applications 111 Summary 114 Exercises 115 Basic GUI Programming 116 Introduction to GUI Programming 116 A Pop-up Alert in 25 Lines 117 An Expression Evaluator in 30 Lines 122 A Currency Converter in 70 Lines 129 Signals and Slots 134 Summary 144 Exercise 145 Dialogs 145 Dumb Dialogs 147 Standard Dialogs 154 Smart Dialogs 161 Summary 169 Exercise 170 Main Windows 172 Creating a Main Window 174 Handling User Actions 201 Summary 212 Exercise 214 Using Qt Designer 215 Designing User Interfaces 217 Implementing Dialogs 228 Testing Dialogs 233 Summary 234 Exercise 235 Data Handling and Custom File Formats 236 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Main Window Responsibilities 239 Data Container Responsibilities 244 Saving and Loading Binary Files 250 Saving and Loading Text Files 258 Saving and Loading XML Files 266 Summary 275 Exercise 276 Intermediate GUI Programming 276 Layouts and Multiple Documents 277 Layout Policies 278 Tab Widgets and Stacked Widgets 279 Splitters 288 Single Document Interface (SDI) 291 Multiple Document Interface (MDI) 298 Summary 308 Exercise 309 Events, the Clipboard, and Drag & Drop 310 The Event Handling Mechanism 310 Reimplementing Event Handlers 312 Using the Clipboard 318 Drag and Drop 319 Summary 325 Exercise 326 Custom Widgets 327 Using Widget Style Sheets 328 Creating Composite Widgets 331 Subclassing Built-in Widgets 333 Subclassing QWidget 335 Summary 351 Exercise 352 Item-Based Graphics 353 Custom and Interactive Graphics Items 355 Animation and Complex Shapes 373 Summary 382 Exercise 384 Rich Text and Printing 384 Rich Text Editing 386 Printing Documents 402 Summary 415 Exercise 416 Model/View Programming 417 Using the Convenience Item Widgets 419 Creating Custom Models 427 Creating Custom Delegates 439 Summary 446 Exercise 447 Databases 447 Connecting to the Database 448 Executing SQL Queries 449 Using Database Form Views 454 Using Database Table Views 460 Summary 473 Exercise 474 Advanced GUI Programming 475 Advanced Model/View Programming 475 Custom Views 476 Generic Delegates 483 Representing Tabular Data in Trees 492 Summary 506 Exercise 506 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Online Help and Internationalization 508 Online Help 509 Internationalization 512 Summary 520 Exercise 521 Networking 521 Creating a TCP Client 523 Creating a TCP Server 529 Summary 534 Exercise 535 Multithreading 536 Creating a Threaded Server 538 Creating and Managing Secondary Threads 543 Implementing a Secondary Thread 552 Summary 557 Exercise 558 This Is Not Quite The End 559 Installing 560 Installing on Windows 560 Installing on Mac OS X 565 Installing on Linux and Unix 570 Selected PyQt Widgets 574 Selected PyQt Class Hierarchies 579 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page Return to Table of Copyright Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks Where those designations appear in this book, and the publisher was aware of a trademark claim, the designations have been printed with initial capital letters or in all capitals The author and publisher have taken care in the preparation of this book, but make no expressed or implied warranty of any kind and assume no responsibility for errors or omissions No liability is assumed for incidental or consequential damages in connection with or arising out of the use of the information or programs contained herein Copyright Safari Books Online #905221 The publisher offers excellent discounts on this book when ordered in quantity for bulk purchases or special sales, which may include electronic versions and/or custom covers and content particular to your business, training goals, marketing focus, and branding interests For more information, please contact: U.S Corporate and Government Sales (800) 382-3419 corpsales@pearsontechgroup.com For sales outside the United States, please contact: International Sales international@pearsoned.com Visit us on the Web: www.prenhallprofessional.com Library of Congress Cataloging-in-Publication Data Summerfield, Mark Rapid GUI programming with Python and Qt / Mark Summerfield p cm Includes bibliographical references and index ISBN 0-13-235418-7 (pbk.: alk paper) Graphical user interfaces (Computer systems) C++ (Computer program language) QA76.9.????? 2006 005.4'37—dc22 ????? Copyright © 2007 Pearson Education, Inc All rights reserved Printed in the United States of America 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page Return to Table of Trolltech®, Qt®, Qtopia®, and the Trolltech and Qtopia logos are registered trademarks of Trolltech ASA Text printed in the United States on recycled paper at Courier in Stoughton, Massachusetts First printing, November 2007 Dedication This book is dedicated to Andrea Summerfield About the Author Mark Summerfield Mark graduated in computer science with first class honors from the University of Wales Swansea He followed this with a year's postgraduate research before going into industry He spent many years working as a software engineer for a variety of firms before joining Trolltech He spent almost three years as Trolltech's documentation manager, during which he founded and edited Trolltech's technical journal, Qt Quarterly, and co-wrote C ++ GUI Programming with Qt 3, and later C++ GUI Programming with Qt Mark owns Qtrac Ltd., www.qtrac.eu, where he works as an independent author, editor, trainer, and consultant, specializing in C++, Qt, and Python Production The text was written using gvim and marked up with the Lout typesetting language The index was compiled by the author, with the assistance of a PyQt program developed for the purpose All the diagrams were produced using Lout Almost all of the code snippets were extracted directly from the example programs using Lout in conjunction with a Python script The icons used in the example programs are mostly from KDE (The "K" Desktop Environment), with a few created by the author The images used in the book's margins are from the Open Clip Art Library, with some other images coming from Project Gutenberg SVG images were converted to EPS using Inkscape The Linux screenshots were taken with KSnapshot, and the Windows screenshots were captured and saved using a tiny PyQt application; in both cases the png images were converted to eps using ImageMagick The monospaced font used for code is derived from Crystal, modified using FontForge Wikipedia proved itself to be useful in all kinds of ways, including being the source of the flag images, and was frequently referred to for ideas, information, and sample data The marked-up text was previewed using gv and evince, and converted to PostScript by Lout, then to PDF by Ghostscript 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page Return to Table of All the editing and processing was done on Fedora and Kubuntu systems The cover was provided by the publisher, with the picture suggested by the author in view of the fact that Python is used to calibrate and analyze data from the Hubble Space Telescope The screenshots were taken on Windows XP, Mac OS X, and Linux/KDE All the example programs have been tested on Windows, Linux, and Mac OS X, using Python 2.5, Qt 4.2, and PyQt 4.2, and additionally on Linux using Qt 4.3 Introduction This book teaches how to write GUI applications using the Python programming language and the Qt application development framework The only prior knowledge assumed is that you can program in some object-oriented programming language, such as C++, C#, Java, or of course Python itself A slight familiarity with HTML is also assumed, and some knowledge of regular expresssions would be beneficial A knowledge of GUI programming is not required since all the key concepts are covered The book will be useful to people who program professionally as part of their job, whether as full-time software developers, or those from other disciplines who need to some programming in support of their work It is also suitable for undergraduate and postgraduate students, particularly those doing courses or research that includes a substantial computing element The exercises (with solutions) are provided especially to help students Python is probably the easiest to learn and nicest scripting language in widespread use, and Qt is probably the best library for developing GUI applications The combination of Python and Qt, "PyQt", makes it possible to develop applications on any supported platform and run them unchanged on all the supported platforms, for example, all modern versions of Windows, Linux, Mac OS X, and most Unix-based systems No compilation is required thanks to Python being interpreted, and no source code changes to adapt to different operating systems are required thanks to Qt abstracting away the platformspecific details We only have to copy the source file or files to a target machine that has both Python and PyQt installed and the application will run If you are new to Python: Welcome! You are about to discover a language that is clear to read and write, and that is concise without being cryptic Python supports many programming paradigms, but because our focus is on GUI programming, we will take an object-oriented approach everywhere except in the very early chapters Python is a very expressive language, which means that we can usually write far fewer lines of Python code than would be required for an equivalent application written in, say, C++ or Java This makes it possible to show some small but complete examples throughout the 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page Return to Table of text, and makes PyQt an ideal tool for rapidly and easily developing GUI applications, whether for prototyping or for production use Since the emphasis of the book is on GUI programming, although Part I provides a fastpaced Python tutorial, it also includes some PyQt coverage This material is clearly marked (just like this paragraph, with "Qt" in the margin) to make it easy for experienced Python programmers to skip the Python they already know Parts II, III, and IV of the book are all PyQt-specific and assume that readers can already program in Python, whether from previous experience or from reading Part I Figure The eric4 IDE—a PyQt4 application Quite often in programming we reach decision points when there are several possible approaches we could take Reference books and the online documentation identify what classes, methods, and functions are available, and in some cases provide examples, but such documents rarely provide a broader context This book gives the necessary context, highlighting the key decision points for GUI programming, and offering insights into the pros and cons, so that you can decide for yourself what the right policy is for your particular 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page Return to Table of circumstances For example, when you create a dialog, should it be modal, modeless, or global modal? (See Chapter for an explanation and policy recommendations on this issue.) PyQt is used to write all kinds of GUI applications, from visualization tools used by scientists and engineers, to accounting applications It is possible to write PyQt applications that are just tens of lines long, and medium sized projects of 000 to 10 000 lines are very common Some commercial companies have built 100 000 line PyQt applications, with programming teams varying in size from just one person to more than a dozen people Many in-house tools are written using PyQt, but because these are often used to gain competitive advantage, the companies involved generally not permit their use of PyQt to be made public PyQt is also widely used in the open source world, with games, utilities, visualization tools, and IDEs, all written using it This book is specifically about PyQt4, the Python bindings for the Qt C++ application development framework.[*] PyQt4 is provided in the form of 10 Python modules which between them contain around 400 classes and about 000 methods and functions All the example programs have been tested on Windows, Linux, and Mac OS X using Python 2.5, Qt 4.2, and PyQt 4.2 Back-porting to earlier versions may be possible in some cases, but we recommend using the most up-to-date versions of Python, Qt, and PyQt [*] There are also Python bindings for the older Qt library, but there is no reason to use that library for new projects, especially since Qt offers far more functionality Python, PyQt, and Qt can be used free of charge for non-commercial purposes, but the license used by Python is different from that used by PyQt and Qt Python is available with a very liberal license that allows it to be used to develop both commercial and noncommercial applications Both PyQt and Qt are dual-licensed: This essentially allows for them to be used to develop noncommercial applications—which must in turn be licensed using an acceptable Open Source license such as the GNU General Public License (GPL); or to be used to develop commercial applications—in this case a commercial PyQt license and a commercial Qt license must be purchased The Structure of the Book The book is divided into five parts Part I is primarily a rapid conversion course aimed at non-Python programmers who are familiar with an object-oriented language, although it also has some (clearly marked) PyQt content Because the core Python language is mostly simple and is quite small, these chapters can teach the basics of Python, to a sufficient extent that real Python applications can be written Where more advanced Python techniques are used in later parts of the book, they are explained at the point where they are needed If you think that you could pick up the Python syntax simply through reading it, you might be tempted to skip Part I and dive straight into the GUI programming that begins in Part 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page Return to Table of II The early chapters in Part II include back-references to the relevant pages in Part I to support readers who choose this approach However, even for readers familiar with Python, we recommend reading about QString in Chapter If you are unfamiliar with partial function application (currying), it is important to read the sub-section that covers this in Chapter 2, since this technique is sometimes used in GUI programming Part II begins by showing three tiny PyQt GUI applications to give an initial impression of what PyQt programming is like It also explains some of the fundamental concepts involved in GUI programming, including PyQt's high-level signals and slots communication mechanism Chapter (Dialogs) shows how to create dialogs and how to create and lay out widgets ("controls" in Windows-speak—the graphical elements that make up a user interface such as buttons, listboxes, and similar) in a dialog Dialogs are central to GUI programming: Most GUI applications have a single main window, and dozens or scores of dialogs, so this topic is covered in depth After, the dialogs chapter comes, Chapter 6, which covers main windows, including menus, toolbars, keyboard shortcuts, and also loading and saving application settings Part II concludes with Chapter which shows how to create dialogs using Qt Designer, Qt's visual design tool Part III gives deeper coverage of some of the topics covered in Part II and introduces new topics Chapter shows how to lay out widgets in quite sophisticated ways Chapter 10 gives more formal coverage of event handlers, and also shows the powerful technique of event filtering Chapter 10 shows how to use the clipboard and how to drag and drop both text and arbitrary data Chapter 12 covers painting with QPainter and also the QGraphicsView and QGraphicsScene classes introduced in Qt 4.2 It also covers printing both to paper and to PDF files Chapter 11 shows how to create custom widgets, starting simply by modifying the properties of existing widgets, and working up to implementing widgets from scratch with complete control over their appearance and behavior Part III concludes with Chapter 14 which introduces Qt's model/view architecture and shows how to use Qt's built-in views and how to create custom data models Part IV begins by showing more advanced model/view techniques, in particular how to achieve complete control over the editing and presentation of data items Chapter 13 introduces Qt's HTML-capable text engine, and shows how to create and render rich text Chapter 17 explains how to make an application translatable, including how to use Qt's translation tools to create translation files Python provides its own classes for networking and for threading, but in the last two chapters of this part we show how to networking and threading using the PyQt classes Appendix A explains where Python, PyQt, and Qt can be obtained, and how to install them on Windows, Linux, and Mac OS X 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 570 Return to Table Contents a suitable bookmark to your browser It also comes with numerous examples; at the very least it is worth looking at the PyQt examples and running the demo (For example, change directory to $HOME/Desktop/PyQt-mac-gpl-4.2/examples/tools/qtdemo and run /qtdemo.py.) If you downloaded the book's examples, you might like to unpack pyqtbook.tar.gz in $HOME to get a $HOME/pyqt directory with all the book's examples, and model answers to the exercises, categorized by chapter In the $HOME/pyqt directory itself you will find mkpyqt.py and makepyqt.pyw; you might like to move (or soft link) these to a directory on your $PATH, for example, $HOME/bin to make them more convenient to use Some of the examples depend on Qt Designer ui files or on qrc resource files How to turn these into Python modules is covered on page 205, but for now it might be convenient to simply perform the conversions: cd $HOME/pyqt /mkpyqt.py -r This will convert any ui and qrc files that are found in the pyqt directory and in its subdirectories.[*] If you prefer to use the GUI makepyqt.pyw tool, you may have to click Tool paths option and set the path to pyuic4 It may also be necessary to set its More the paths to the other tools too [*] If mkpyqt.py does not work, you will have to edit the mkpyqt.py file and at least hard-code the path to pyuic4 This completes the installation for Mac OS X If you unpacked the examples, you could go to the Desktop and click the pyqt directory, then the chap12 directory, and then click multipedes.pyw to see a graphics application If an unwanted Terminal window pops up, right-click multipedes.pyw, and click the Info dialog; change the Open with setting to the Python Launcher for the correct version of Python, and apply the change to all files with the pyw suffix You are now ready to write and run PyQt applications on your Mac OS X machine—and they will run unchanged on Windows and Linux too! Installing on Linux and Unix If you are running Kubuntu (7.04 Fiesty Fawn and later), you already have PyQt4 installed! So you only need to install the book's examples (see page 569), and the documentation packages, python-doc, and python-qt4-doc For Linux and most other Unices that don't have PyQt4 preinstalled, there are four tools to install: The Qt C++ application development framework, the Python interpreter and its accompanying libraries, the SIP bindings tool, and PyQt4 itself The most convenient way 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page 571 Return to Table of to get everything up and running is to install the tools using standard packages for the Linux or Unix distribution being used For ArchLinux, Debian, Fedora, Gentoo, Kubuntu, Pardus, Ubuntu, and many others, the necessary components are available as packages These can be installed using Adept, Pirut, apt-get, yum, or whatever other package manager the system uses For PyQt4, the package is usually called pyqt4 or PyQt4 or pyqt4-dev-tools PyQt4's documentation package is usually called pyqt4-doc or python-qt4-doc or PyQt4-examples Python's documentation is usually in a package called python-doc or python-docs IDLE is often available separately in a package called idle or python-tools If you want a more powerful IDE, Eric4, itself written in PyQt, is available in a package for many popular distributions The package manager should be able to figure out the dependencies, but if it cannot, you may have to also request that it install Python itself, and maybe even Qt and the g++ compiler The Qt Designer visual design tool and the translation support tools are often packaged separately, for example in packages called qt4-designer and qt4-dev-tools If you are fortunate enough to be able to install using standard packages, once you have done so, you are all set for writing PyQt programs, and can skip to installing the book's examples, described on page 569 For users of older distributions, for those who don't have suitable packages available or who only have some of the components available in packages, and for those who want to build manually to get the most up-to-date versions, building and installing by hand is quite straightforward However, we make two assumptions if you are building from source Firstly, that a C++ compiler and tool chain, for example make, are already installed and operational, and secondly that you install as root (using su or sudo), or know how to use configure's prefix option to install locally The files required for installation are qt-x11-opensource-src-4.2.3.tar.gz, Python-2.5.1.tgz, sip-4.6.tar.gz, and, PyQt-x11-gpl-4.2.tar.gz The book's examples are in the file pyqtbook.tar.gz Start by getting Qt Go to http://www.trolltech.com/developer/downloads/qt/index and click the "Qt/X11 Open Source Edition" link, and near the bottom of the page, download qt-x11-opensource-src-4.2.3.tar.gz A later version number, say, 4.3.1, should also be fine Now it is time to get Python Go to http://www.python.org/download and then click the "current production version" link, and download one of the "Other platforms" source versions, for example, Python-2.5.1.tgz or Python-2.5.1.tar.bz2 We will 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 572 Return to Table Contents assume you got the tgz version—later 2.x series versions such as 2.5.2, or 2.6.0, should be okay, providing they are production releases (not alphas, betas, or release candidates) The last two tools that must be obtained are SIP and PyQt Go to http:// www.riverbankcomputing.co.uk/sip/download.php and download the source package sip-4.6.tar.gz, then go to, http://www.riverbankcomputing.co.uk/pyqt/ download.php and download the source package PyQt-x11-gpl-4.2.tar.gz Again, the version numbers may be higher, for example, 4.3, for PyQt If you want to run the examples that are shown in the book or to see the model answers to the exercises, you can unpack the pyqtbook.tar.gz file available from http:// www.qtrac.eu/pyqtbook.html Now that all the pieces are at hand, you can perform the installation Both Qt and Python must be installed first, then SIP, and finally PyQt itself We will assume that the versions are those mentioned above, but obviously use whichever versions you downloaded and adjust accordingly We assume that the downloaded tarballs are in the $HOME/ packages directory, and that either you everything as superuser having done su, or that you every make install as superuser using sudo First build Qt The last line should be sudo make install if you are using sudo cd $HOME/packages tar xvfz qt-x11-opensource-src-4.2.3.tar.gz cd qt-x11-opensource-src-4.2.3 /configure -fast -qt-sql-sqlite -no-qt3support make make install The -qt-sql-sqlite option will build the SQLite in-process database; this is used in Chapter 15 but can be omitted if desired The -fast and -no-qt3support options should reduce the build time slightly, but both can be safely omitted If you want to see what other options are available, including the database drivers that can be installed, run /configure -help Building Qt can take quite a while (from half an hour to over three hours depending on the processor), since it is well over 600 000 lines of C++ code Python and SIP don't take anywhere near as long You should build Python next, again using sudo make install if you are using sudo (We'll take this for granted from now on.) cd $HOME/packages tar xvfz Python-2.5.1.tgz cd Python-2.5.1 /configure make make install 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 573 Return to Table Contents This should be a lot faster than the Qt build Once it is complete, you can the last two phases, building SIP and then PyQt, doing so in a slightly different way than you built Qt and Python cd $HOME/packages tar xvfz sip-4.6.tar.gz cd sip-4.6 python configure.py make make install This assumes that (the correct version of) Python is in your $PATH If that is not the case (i.e., because you have two or more versions of Python installed), then give the full path to the appropriate Python executable, for example $HOME/opt/python25/bin/python configure.py Once SIP is installed, you can install PyQt cd $HOME/packages tar xvfz PyQt-x11-gpl-4.2.tar.gz cd PyQt-x11-gpl-4.2 python configure.py make make install Just like the SIP installation, this assumes that the correct version of Python is in your $PATH Again, if this is not the case, then give the full path to the appropriate Python executable when running configure.py The make phase can take a long time (but not as long as building Qt) Qt, Python, and PyQt, are all supplied with documentation in HTML format It is worthwhile moving this somewhere permanent and adding suitable bookmarks to your browser All three also come with numerous examples; at the very least it is worth looking at the PyQt examples and running the demo (For example, change directory to $HOME/ PyQt-x11-gpl-4.2/examples/tools/qtdemo and run /qtdemo.py.) If you downloaded the book's examples, you might like to unpack pyqtbook.tar.gz in $HOME to get a $HOME/pyqt directory with all the book's examples, and model answers to the exercises, categorized by chapter In the $HOME/pyqt directory itself you will find mkpyqt.py and makepyqt.pyw; you might like to move (or soft link) these to a directory on your $PATH, for example, $HOME/bin to make them more convenient to use Some of the examples depend on Qt Designer ui files or on qrc resource files How to turn these into Python modules is covered on page 205, but for now it might be convenient to simply perform the conversions:[*] [*] If mkpyqt.py does not work, you will have to edit the mkpyqt.py file and at least hard-code the path to pyuic4 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 574 Return to Table Contents cd $HOME/pyqt /mkpyqt.py -r This completes the installation for X11-based Unices and Unix clones, including Linux and BSD You are now ready to write and run PyQt applications on your Unix or Unix-like platform—and they will run unchanged on Mac OS X and Windows too! Appendix B Selected PyQt Widgets The screenshots shown here were all taken on Linux using KDE to provide an eye-pleasing consistency In the body of the book, screenshots are shown for Windows, Linux, and Mac OS X, generally varying from chapter to chapter QCalendarWidget This widget can be used as a display widget, although it was designed primarily as an input widget through which the user can choose a particular date The widget's display is highly configurable, e.g., week numbers can be displayed or not, day names can be represented by a single letter, or in short or full forms, the colors and fonts used can be set, and so can which day is treated as the first day of the week Minimum and maximum allowable dates can also be set Calling setCalendarPopup(True) on a QDateEdit or a QDateTimeEdit, wil cause their spin buttons to be replaced by an arrow button If the user clicks the arrow button, a QCalendarWidget wil pop up QCheckBox A checkbox can be used to present users with a simple yes/no choice If QCheckBox.setTristate(True) is called, the checkbox will have three states: The user checked it, the user unchecked it, or the user did not change it from whatever it was before The tristate approach may be useful for representing Boolean database fields where IS NULL is allowed 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page 575 Return to Table of QComboBox The screenshot shows a QComboBox with its list popped down A combobox is used to present the user with a list of items where too little vertical space is available for a QListView to be used Calling QComboBox.setEditable(True) allows the user to either choose one of the items in the list, or to type in their own text instead Each combobox item has a text, an optional icon, and optional data We can populate a combobox using QComboBox.addItem() or QComboBox.addItems(), or we can use a custom or built-in QAbstractItemModel subclass with QComboBox.setModel() QDateEdit, QDateTimeEdit, and QTimeEdit The QDateEdit is used for displaying and entering dates, the QDateTimeEdit is used for date/times and the QTimeEdit for times By defaul the widgets use localespecific date and time formats—they are shown here using a US locale The formats can be changed and minimum and maximum allowable dates and times can be set QDialogButtonBox This widget can be used to create a row o column of buttons The buttons can be standard buttons with pre-defined roles and texts, or can be added with the roles and texts of our choice This widget automatically arranges the buttons according to their roles and the underlying windowing system's user interface guidelines QFontComboBox PyQt provides a pop-up font dialog, using the native font dialog where available If we want to provide font choices ourselves for example in a toolbar, we can use the QFontComboBox, shown here popped down For Qt 4.0 and Qt 4.1 the nearest equivalent (but without font previewing) is to use an ordinary QComboBox, populating it with the list returned by QFontDatabase.families() 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 576 Return to Table Contents QGroupBox and QRadioButton A group box can be used purely as a visua grouping device, or it can be made checkable, as shown here If checkable, the widgets contained in the group box can only be interacted with when the group box is checked If a frame is required without a title, a QFrame can b used instead When QRadioButtons are put in a group box they automatically behave correctly, i.e., the user can only choose one of them QComboBoxes and QListViews are often more convenient than QRadioButtons QGraphicsView This widget is used to view the QGraphicsItems in a QGraphicsScene Any number of QGraphicsViews can view the same scene, each with its own transformations e.g., scaling and rotation, in effect The scrollbars appear automatically if they are needed Each QGraphicsView can provide its own background and foreground, overriding those provided by the scene QLabel The QLabel widget is a display widget that can be used to show an image, a plain text string, a QTextDocument, or HTML A label with an accelerator (a single underlined character), can be associated with a "buddy" widget, passing the keyboard focus to the buddy when the accelerator is pressed QLCDNumber This is a display widget for showing numbers in the style of a seven-segment LCD QLineEdit This widget can accept one line of text from the user The text can be constrained by using a validator, e.g., a QIntValidator or a QRegExpValidator, or by setting an input mask, or both The echo mode can be set to show "*"s (or nothing) instead o the text entered 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page 577 Return to Table of QListView and QListWidget Through these widgets users can choose an item, or with a suitable selection mode multiple items The widgets can be in lis mode (as shown), or icon mode, where the icons appear larger and the texts are displayed under the icons A QListView must be used in conjunction with a custom or built-in QAbstractItemModel subclass using QListView.setModel() A QListWidget has a built-in model, so items can be added to it directly using QListWidget.addItem() and QListWidget.addItems() Where vertical space is at a premium, a QComboBox can be used instead QProgressBar This widget can be used to show users the progress of long running operations It i often put in a QMainWindow's status ba using QStatusBar.addWidget() or addPermanentWidget() An alternative is to pop up a QProgressDialog QPushButton Buttons are used to invoke actions If a button click will lead to a dialog being popped up we normally add an ellipsis ( ) to the end of the button's text Button can also be set to have pop-up menus (in which case PyQt will add a little triangle indicator), or they can be set as toggle buttons, staying down when clicked an odd number of times, and coming back up when clicked an even number of times Since Qt 4.2, most applications use QDialogButtonBoxes rather than individual QPush-Buttons QSlider A slider is often used to show proportionality, and is commonly used in conjunction with a QLabel or QLCDNumber that shows an actual amount Sliders can be aligned vertically or horizontally A QScrollBar could be used for a similar purpose 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 578 Return to Table Contents QDoubleSpinBox and QSpinBox These widgets are used to accept and display numbers The number can be shown with a prefix or suffix and with a particular alignment (The QDoubleSpinBox shown here has a "$" prefix.) They can have minimum and maximum values set, and for the QDoubleSpinBox, the number of digits shown after the decimal point can be set An alternative is to use a QLineEdit in conjunction with a QIntValidator or a QDoubleValidator QTableView and QTableWidget These widgets are used to present data in tabular form A QTableView must be used in conjunction with a custom or built-in QAbstractItemModel subclass, such as QSqlTableModel, using QTableView.setModel() A QTableWidget has a built-in model, so items can be added to it directly, e.g., using QTableWidget.setItem() Both widgets can show icons as well as text in every cell, including in the header cells QTabWidget This widget is used when space is at a premium, or simply as a means of logically grouping widgets The tabs have two shape settings, and can appear at the top, left, right, or bottom, with the text rotated when shown left or right 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 579 Return to Table Contents QTextEdit and QTextBrowser These widgets can display HTML, including lists, tables, and images The QTextEdit can also be used as an editing widget, either for plain text, or for PyQt "rich text" (essentially HTML, although a custom subclass would be needed to provide table and image editing) The QTextBrowser supports clickable links so can be used as a simple web browser Both widgets have support for CSS (Cascading Style Sheets) QTreeView and QTreeWidget These widgets are used to present hierarchical data A QTreeView must be used with a custom or built-in QAbstractItemModel subclass using QTreeView.set-Model() Like all widgets that use a model, only the data that is visible to the user is retrieved, so even large datasets are very fast A QTreeWidget has a builtin model, so items can be added to it directly using QTreeWidget.insertTopLevelItem () and insertTopLevelItems(), or by creating QTreeWidgetItems as children of other items 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 580 Return to Table Contents Appendix C Selected PyQt Class Hierarchies Figure C.1 Selected Base Classes Figure C.2 Selected Classes from the QFrame Hierarchy 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming Contents Page 581 Return to Table of Figure C.3 Selected Classes from the QWidget Hierarchy 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 582 Return to Table Contents Figure C.4 Selected Classes from the QAbstractItemModel Hierarchy Figure C.5 Selected Classes from the QDialog Hierarchy Figure C.6 Selected Classes from the QIODevice Hierarchy Figure C.7 Selected Classes from the QPaintDevice Hierarchy 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 583 Return to Table Contents Figure C.8 Selected Classes from the QEvent Hierarchy Figure C.9 Selected Classes from the QGraphicsItem Hierarchy 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming of Page 584 Return to Table Contents Figure C.10 Selected Classes from the QLayoutItem Hierarchy 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 Prepared for Paul Waddell, Safari ID: pwaddell@u.washington.edu By Mark Summerfield ISBN: 9780132354189 Publisher: Prentice Hall 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 ... operand type(s) for +: 'int' and 'str' 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. .. cStringIO module PyQt' s 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 Prepared... applied to s, a new string object is 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