Figure 12.2. The Page Designer Application
The wheel event is called whenever the user rolls the mouse wheel, and will cause the view
to scale smaller or larger depending on which way the wheel is rolled. The effect of this is
to change the apparent size of the page—the underlying scene is not changed at all. The
maths used in this event handler is rather tricky, but this isn't a problem since the method
can be copied and pasted as-is.
Near the top of chap12/pagedesigner.pyw we have some global declarations.
PageSize = (612, 792)
PointSize = 10
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 357
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 to word converter sign in - 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
add signature to pdf in preview; adding signature to pdf document
Pdf to word converter sign in - 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
create pdf signature box; pdf will signature
MagicNumber = 0x70616765
FileVersion = 1
Dirty = False
The page size is in points for US Letter sized paper. (The source code also has the A4 page
size, commented out.) The magic number and file version are used by QDataStream as
we have seen in Chapter 8 and elsewhere. We also have a global dirty flag.
We have not shown the imports, but they include functools. This is needed because in
the context menu we use the functools.partial() function to wrap the methods to
call with a suitable argument.
Partial Function Application 63
The main form's initializer is quite long, so we will look at it in parts, but omitting code
that is similar to what we have seen elsewhere, for example where we create and lay out
the form's buttons.
class MainForm(QDialog):
def __init__(self, parent=None):
super(MainForm, self).__init__(parent)
self.filename = QString()
self.copiedItem = QByteArray()
self.pasteOffset = 5
self.prevPoint = QPoint()
self.addOffset = 5
self.borders = []
self.printer = QPrinter(QPrinter.HighResolution)
self.printer.setPageSize(QPrinter.Letter)
The copied item is essentially a lump of binary data that describes the most recent item to
be cut or copied. We store this data inside the application rather than on the clipboard
because it is of no use to any other application. The paste offset is used when the user
repeatedly pastes the same item, and the previous point and add offset are used when the
user repeatedly adds the same item type. In both cases the newly added items are added
at offset positions rather than exactly on top of the previous item. This makes it easier for
the user to see where they are.
The borders list will contain two graphics items, both yellow rectangles, one giving the
page outline and the other giving an outline inside the page allowing for some margin
space. They are used as guidelines and are not saved or printed.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 358
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
XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. VB.NET How-to, VB.NET PDF, VB.NET Word, VB.NET Excel, VB Search unsigned signature field in PDF document.
create transparent signature stamp for pdf; add signature box to pdf
VB.NET PDF Digital Signature Library: add, remove, update PDF
XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. VB.NET How-to, VB.NET PDF, VB.NET Word, VB.NET Excel, VB Search unsigned signature field in PDF document.
add a signature to a pdf file; adding signature to pdf doc
While it is possible to create a QPrinter object when it is needed, by creating one and
keeping it as an instance variable, we ensure that the user's settings, such as page size, are
preserved between uses in the same session.
self.view = GraphicsView()
self.scene = QGraphicsScene(self)
self.scene.setSceneRect(0, 0, PageSize[0], PageSize[1])
self.addBorders()
self.view.setScene(self.scene)
We create an instance of our custom GraphicsView class, and also a standard
QGraphicsScene. The rectangle we set on the scene is the "window", i.e., the logical
coordinate system that the scene will use, in this case a rectangle with a top-left point of
(0, 0), and a width and height corresponding to the page's size in points.
The rest of the initializer creates and connects the buttons, and lays out the buttons and
the view.
def addBorders(self):
self.borders = []
rect = QRectF(0, 0, PageSize[0], PageSize[1])
self.borders.append(self.scene.addRect(rect, Qt.yellow))
margin = 5.25 * PointSize
self.borders.append(self.scene.addRect(
rect.adjusted(margin, margin, -margin, -margin),
Qt.yellow))
This method creates two QGraphicsRectItems, the first corresponding to the size of a
page, and the second (indicating the margins), inside the first. The QRect.adjusted
() method returns a rectangle with its top-left and bottom-right points adjusted by the
two sets of dx and dy pairs. In this case the top-left is moved right and down (by each being
increased by margin amount) and the bottom-right is moved left and up (by each being
reduced by margin amount).
def removeBorders(self):
while self.borders:
item = self.borders.pop()
self.scene.removeItem(item)
del item
When we print or save we do not want to include the borders. This method destructively
retrieves each item from the self.borders list (in a random order), and removes the
item from the scene. When an item is removed from a scene the scene automatically notifies
its views so that they can repaint the uncovered area. An alternative to deleting is to call
setVisible(False) to hide the borders.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 359
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# WinForms Viewer: Load, View, Convert, Annotate and Edit PDF
PDF Conversion. • Convert PDF to Microsoft Office Word (.docx). Draw PDF markups. PDF Protection. • Sign PDF document with signature. • Erase PDF text.
add signature pdf online; adding signature to pdf file
C# WinForms Viewer: Load, View, Convert, Annotate and Edit Word
XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. View & Process. Word Conversion. • Convert Microsoft Office Word to PDF (.pdf). View Word outlines.
create pdf with signature field; add signature image to pdf acrobat
The call to QGraphicsScene.removeItem() removes the item (and its children) from
the scene, but it does not delete the item, instead passing ownership to its caller. So after
the removeItem() call, the item still exists. We could just leave the item to be deleted
when each item reference goes out of scope, but we prefer to explicitly delete the items to
make clear that we have taken ownership and really are deleting them.
def addPixmap(self):
path = QFileInfo(self.filename).path() \
if not self.filename.isEmpty() else "."
fname = QFileDialog.getOpenFileName(self,
"Page Designer - Add Pixmap", path,
"Pixmap Files (*.bmp *.jpg *.png *.xpm)")
if fname.isEmpty():
return
self.createPixmapItem(QPixmap(fname), self.position())
When the user clicks the Add Pixmap button this method is called. We simply obtain the
name of the image file the user wants to add to the page, and pass the work on to a
createPixmapItem() method. The reason we don't do everything in one method is
because splitting the functionality is more convenient, for example, for when we load
pixmaps from a Page Designer .pgd file. The position() method is used to get the
position where an item should be added; we will review it shortly.
def createPixmapItem(self, pixmap, position, matrix=QMatrix()):
item = QGraphicsPixmapItem(pixmap)
item.setFlags(QGraphicsItem.ItemIsSelectable|
QGraphicsItem.ItemIsMovable)
item.setPos(position)
item.setMatrix(matrix)
self.scene.clearSelection()
self.scene.addItem(item)
item.setSelected(True)
global Dirty
Dirty = True
The graphics view classes include QGraphicsPixmapItem which is perfect for showing
images in scenes. QGraphicsItem's have three flags in Qt 4.2, ItemIs-Movable,
ItemIsSelectable and ItemIsFocusable. (Qt 4.3 adds ItemClipsToShape,
ItemClipsChildrenToShape, and ItemIgnoresTransformations, this last
particularly useful for showing text that we don't want the view to transform.)
Having created the item we set its position in the scene. The setPos() method is the only
item method that works in terms of scene coordinates; all the others work in item local
logical coordinates. We do not have to set a transformation matrix (and the one returned
by QMatrix() is the identity matrix), but we want an explicit matrix so that we can use
it when we come to save and load (or copy and paste) the scene's items.
[*]
[*]
An identity matrix in this context is one that when set, causes no transformations to occur.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 360
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 Word
users can convert Convert Microsoft Office Word to searchable PDF online, create To view, convert, edit, process, built, sign Word documents, please refer to
create signature field in pdf; add signature to pdf acrobat reader
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit PDF
as convert PDF to Microsoft Office Word (.docx) online C# users can view PDF outlines online To view, convert, edit, process, protect, sign PDF files, please
pdf converter sign in; add signature field to pdf
The QMatrix class holds a 3 x 3 matrix and is specifically designed for graphical
transformations, rather than being a general matrix class. As such it is a rare example of
a poorly named Qt class. From Qt 4.3, QMatrix has been superceded by the more sensibly
named QTransform class, which is also capable of more powerful transformations since
it uses a 4 x 4 matrix.
Once the item is set up, we clear any existing selections, and add the item to the scene.
Then we select it, ready for the user to interact with it.
def position(self):
point = self.mapFromGlobal(QCursor.pos())
if not self.view.geometry().contains(point):
coord = random.randint(36, 144)
point = QPoint(coord, coord)
else:
if point == self.prevPoint:
point += QPoint(self.addOffset, self.addOffset)
self.addOffset += 5
else:
self.addOffset = 5
self.prevPoint = point
return self.view.mapToScene(point)
This method is used to provide a position in the scene where a newly added item should
go. If the mouse is over the view, we use the mouse position provided by QCursor.pos
()—"cursor" in this context means mouse cursor—but add an offset if an item has just
been added at the same place. This means that if the user repeatedly presses an Add button,
each successive item will be offset from the one before making it easier for the user to see
and interact with them. If the mouse is outside the view we put the item at a semi-random
position near the top-left of the scene.
The mapFromGlobal() method converts a screen coordinate into a physical widget
coordinate as used by the view. But scenes use their own logical coordinate system, so we
must use QGraphicsView.mapToScene() to convert the physical coordinate into a
scene coordinate.
def addText(self):
dialog = TextItemDlg(position=self.position(),
scene=self.scene, parent=self)
dialog.exec_()
This method is called when the user clicks the Add Text button. It pops up a smart add/
edit item dialog, and if the user clicks OK, a new item is added with the text and font of
their choice. We won't discuss the dialog since it isn't relevant to graphics programming;
its source code is in chap12/pagedesigner.pyw.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 361
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.
XDoc.HTML5 Viewer for .NET, Zero Footprint AJAX Document Image
View, Convert, Edit, Sign Documents and Images. We are dedicated to provide powerful & profession imaging controls, PDF document, image to pdf files and
create a pdf signature file; add signature image to pdf
XDoc.HTML5 Viewer for .NET, Technical Specifications Introductions
All Formats. XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. View & Process. XDoc.PDF. Scanning. Microsoft Office. XDoc.Word. XDoc.Excel. XDoc.PowerPoint.
adding signature to pdf files; export pdf to word sign in
We do not need to keep a reference to the added item because we pass ownership of it to
the scene inside the smart dialog.
def addBox(self):
BoxItem(self.position(), self.scene)
This method is called when the user clicks the Add Box button. The user can resize the box,
even turning it into a line (by reducing the width or height to 1 pixel), by using the arrow
keys, as we will see.
Again, we don't need to keep a reference to the added box item, because ownership is given
to the scene.
Figure 12.3. Adding a New Text Item
We want the user to be able to cut, copy, and paste items inside Page Designer, but since
the items are not meaningful for other applications we will not use the clipboard.
def copy(self):
item = self.selectedItem()
if item is None:
return
self.copiedItem.clear()
self.pasteOffset = 5
stream = QDataStream(self.copiedItem, QIODevice.WriteOnly)
self.writeItemToStream(stream, item)
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 362
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.
XDoc.HTML5 Viewer for .NET Purchase information
All Formats. XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. View & Process. XDoc.PDF. Scanning. Microsoft Office. XDoc.Word. XDoc.Excel. XDoc.PowerPoint.
adding signature to pdf form; add jpeg signature to pdf
XDoc.HTML5 Viewer for .NET, All Mature Features Introductions
View, Convert, Edit, Sign Documents and Images. Microsoft Word: DOC, DOCX, DOCM, DOT, DOTX, DOTM; PowerPoint: PPT, PPTX, PPS, PPSX; PDF: Portable Document Format;
adding a signature to a pdf document; pdf signature stamp
If the user invokes the copy action we start by seeing if there is exactly one selected item.
If there is we clear the copied item byte array, and create a data stream to write to the byte
array. There is no need to use QDataStream.setVersion() because the data stream is
only used for cutting, copying, and pasting during a single run of the application, so using
whatever happens to be the current version is fine. We will look at the
writeItemToStream() and the corresponding readItemFromStream() methods
later.
def selectedItem(self):
items = self.scene.selectedItems()
if len(items) == 1:
return items[0]
return None
This method returns the one selected item, or None if there are no selected items, or if
there are two or more selected items. The QGraphicsScene.selected-Items()
method returns a list of the selected items. There are also items() methods that return
lists of the items that intersect a particular point, or that are inside a particular rectangle
or polygon, and also a collidingItems() method to report collisions.
def cut(self):
item = self.selectedItem()
if item is None:
return
self.copy()
self.scene.removeItem(item)
del item
This method copies the selected item using copy(), and then removes it from the scene.
As mentioned when we discussed removing the border rectangles, removeItem() only
removes an item from the scene, it does not delete the item. We could leave the item to be
deleted when the item reference goes out of scope, but we prefer to explicitly delete it to
make it clear that we have taken ownership and are really deleting the item.
def paste(self):
if self.copiedItem.isEmpty():
return
stream = QDataStream(self.copiedItem, QIODevice.ReadOnly)
self.readItemFromStream(stream, self.pasteOffset)
If an item has been cut or copied to the copied item, we simply create a data stream and
read the item's data from the copied item byte array. The readItemFromStream()
method takes care of creating the item and adding it to the scene.
def writeItemToStream(self, stream, item):
if isinstance(item, QGraphicsTextItem):
stream << QString("Text") << item.pos() << item.matrix() \
<< item.toPlainText() << item.font()
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 363
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.
elif isinstance(item, QGraphicsPixmapItem):
stream << QString("Pixmap") << item.pos() \
<< item.matrix() << item.pixmap()
elif isinstance(item, BoxItem):
stream << QString("Box") << item.pos() << item.matrix() \
<< item.rect
stream.writeInt16(item.style)
This method is used by copy(), cut() (indirectly), and by save(). For each item it writes
a string that describes the item's type, then the item's position and transformation matrix,
and then any extra item-specific data. For text items, the extra data is the item's text and
font, for pixmap items, the extra data is the pixmap itself—which means that the .pgd file
could be quite large—and for boxes the extra data is the box's rectangle and line style.
def readItemFromStream(self, stream, offset=0):
type = QString()
position = QPointF()
matrix = QMatrix()
stream >> type >> position >> matrix
if offset:
position += QPointF(offset, offset)
if type == "Text":
text = QString()
font = QFont()
stream >> text >> font
TextItem(text, position, self.scene, font, matrix)
elif type == "Box":
rect = QRectF()
stream >> rect
style = Qt.PenStyle(stream.readInt16())
BoxItem(position, self.scene, style, rect, matrix)
elif type == "Pixmap":
pixmap = QPixmap()
stream >> pixmap
self.createPixmapItem(pixmap, position, matrix)
This method is used both by paste() and by open() (which loads a .pgd file). It begins
by reading in the type, position, and matrix which are stored for every type of item. Then,
it adjusts the position by the offset—this is only used if the item is being pasted. Next, the
item-specific data is read and a suitable item created using the data that has been gathered.
The TextItem and BoxItem initializers, and the createPixmapItem() method, all
create the appropriate graphics items, and pass ownership to the scene.
def rotate(self):
for item in self.scene.selectedItems():
item.rotate(30)
If the user clicks Rotate, any selected items are rotated by 30°. There are no child items
used in this application, but if any of the rotated items had child items, these too would be
rotated.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 364
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.
def delete(self):
items = self.scene.selectedItems()
if len(items) and QMessageBox.question(self,
"Page Designer - Delete",
"Delete %d item%s?" % (len(items),
"s" if len(items) != 1 else ""),
QMessageBox.Yes|QMessageBox.No) == QMessageBox.Yes:
while items:
item = items.pop()
self.scene.removeItem(item)
del item
global Dirty
Dirty = True
Table 12.1. Selected QGraphicsScene Methods
Syntax
Description
s.addEllipse(r, pn, b)
Adds an ellipse bounded by QRectF r, outlined by QPen pn, and filled with QBrush
b, to QGraphics-Scene s
s.addItem(g)
Adds QGraphicsItem g to QGraphicsScene s. The other add*() methods are
conveniences for creating and adding some of the built-in graphics items
s.addLine(l, pn)
Adds QLineF l, drawn with QPen pn, to s
s.addPath(pp, pn, b)
Adds QPainterPath pp, outlined by QPen pn, and filled with QBrush b, to
QGraphicsScene s
s.addPixmap(px)
Adds QPixmap px to QGraphicsScene s
s.addPolygon(pg, pn, b)
Adds QPolygon pg, outlined by QPen pn, and filled with QBrush b, to
QGraphicsScene s
s.addRect(r, pn, b)
Adds QRect r, outlined by QPen pn, and filled with QBrush b, to QGraphicsScene
s
s.addText(t, f)
Adds text t using QFont f, to QGraphicsScene s
s.collidingItems(g)
Returns a (possibly empty) list of the QGraphics-Item's that QGraphicsItem g
collides with
s.items()
Returns all the QGraphicsItems in QGraphicsScene s; using different arguments,
those items that are at a particular point, or that are within or that intersect with, a
given rectangle, polygon, or painter path, can be returned
s.removeItem(g)
Removes QGraphicsItem g from QGraphicsScene s; ownership passes to the
caller
s.render(p)
Renders QGraphicsScene s on QPainter p; additional arguments can be used to
control the source and destination rectangle
s.setBackgroundBrush(b)
Sets QGraphicsScene s's background to QBrush b
s.setScene Rect(x, y, w,
h)
Sets QGraphicsScene s's rectangle to position (x, y), with width w and height h; the
arguments are floats
s.update()
Schedules a paint event for QGraphicsScene s
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 365
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.
Syntax
Description
s.views()
Returns a (possibly empty) list of QGraphicsViews that are showing
QGraphicsScene s
If the user clicks Delete and there is at least one selected item, they are asked if they want
to delete the selected items, and if they do, each selected item is deleted.
def print_(self):
Printing Images
Printing images in general is just as simple as printing scenes. Here is a
printImage() method that will print any QImage or QPixmap (both of which
can load .bmp, .png, .jpg, and various other graphics file types), on a single
page, assuming that printer is a QPrinter:
def printImage(image, printer, scaleToFillPage=False):
dialog = QPrintDialog(printer)
if dialog.exec_():
painter = QPainter(printer)
painter.setRenderHint(QPainter.Antialiasing)
rect = painter.viewport()
size = image.size()
size.scale(rect.size(), Qt.KeepAspectRatio)
painter.setViewport(rect.x(), rect.y(),
size.width(), size.height())
if scaleToFillPage:
painter.setWindow(image.rect())
if isinstance(image, QPixmap):
painter.drawPixmap(0, 0, image)
else:
painter.drawImage(0, 0, image)
Printing a QPicture is very similar, except that we must calculate the size
ourselves based on the picture's bounding rectangle, and call
QPainter.drawPicture() to do the drawing.
SVG images can also be printed. The approach is very similar to that used for
drawing QGraphicsScenes. The QSvgRenderer class can load in an SVG
image and has a render() method that can paint the image on any paint device,
including a QPrinter. And with Qt 4.3 it is now possible to create SVG images
by painting using the QSvgGenerator class which is a paint device.
[*]
[*]
Printing documents, including images, is covered in the next chapter.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 366
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