convert pdf to tiff c# : Adding a signature to a pdf document SDK software API .net winforms asp.net sharepoint pyqt-book37-part1608

dialog = QPrintDialog(self.printer)
if dialog.exec_():
painter = QPainter(self.printer)
painter.setRenderHint(QPainter.Antialiasing)
painter.setRenderHint(QPainter.TextAntialiasing)
self.scene.clearSelection()
self.removeBorders()
self.scene.render(painter)
self.addBorders()
A QPrinter is a paint device, just like a QWidget or a QImage, so we can easily paint
onto a printer. Here we have taken advantage of the QGraphicsScene.render()
convenience method, that paints the entire scene (or a selected portion of it) onto a paint
device. Before painting, we remove the borders (the yellow rectangles), and after painting
we restore the borders. We also clear the selection before painting, since some items may
be rendered differently if they are selected. There is a similar QGraphicsView.render
() method that can be used to render the scene (or a selected portion of it) as seen.
We will omit the code for saving and loading .pgd files, since it is very similar to what we
have seen before when working with binary files. For saving, we create a QDataStream,
call setVersion() on it, and write a magic number and a file version. Then we iterate
over all the items in the scene calling writeItemToStream() parameterized by the data
stream and by the item for each call. For loading, we also create a QDataStream. Then
we read in the magic number and file version, and if they are correct, we delete all the
existing items, and so long as the file has data in it, we call readItemFromStream()
parameterized by the stream. This method reads the item data and creates the items,
adding them to the scene as it goes.
We have seen how the application works as a whole, and how to create and use items of
two of the predefined graphics item classes, namely, QGraphicsRectItem and
QGraphicsPixmapItem. Now we will turn our attention to custom graphics view items.
We will begin by looking at the TextItem subclass; this extends the
QGraphicsTextItem class with additional behavior, but leaves all the drawing to the
base class. Then we will look at the BoxItem class; this class has code for both behavior
and drawing.
class TextItem(QGraphicsTextItem):
def __init__(self, text, position, scene,
font=QFont("Times", PointSize), matrix=QMatrix()):
super(TextItem, self).__init__(text)
self.setFlags(QGraphicsItem.ItemIsSelectable|
QGraphicsItem.ItemIsMovable)
self.setFont(font)
self.setPos(position)
self.setMatrix(matrix)
scene.clearSelection()
scene.addItem(self)
self.setSelected(True)
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 367
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.
Adding a signature to a pdf document - 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 preview pdf; create pdf stamp signature
Adding a signature to a pdf document - 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 add signature field; create pdf signature stamp
global Dirty
Dirty = True
The TextItem's initializer is very similar to the createPixmapItem() method that
creates and initializes QGraphicsPixmapItems. We provide a default font and a default
matrix (the identity matrix) if none are supplied to the initializer.
def parentWidget(self):
return self.scene().views()[0]
An item's parent is either another item or a scene. But sometimes we need to know the
visible widget in which the item appears, i.e., the item's view. The scene is available to
items, and can return a list of the views that are showing the scene. For convenience we
have assumed that there is always at least one view showing our scene and that we consider
the first view to be the "parent" view.
def itemChange(self, change, variant):
if change != QGraphicsItem.ItemSelectedChange:
global Dirty
Dirty = True
return QGraphicsTextItem.itemChange(self, change, variant)
If the user interacts with an item, for example, moving or selecting it, this method is called.
If the interaction is not merely a change in selection status we set the global dirty flag.
Two caveats apply to itemChange() reimplementations. Firstly, we must always return
the result of calling the base class implementation, and secondly, we must never do
anything inside this method that will lead to another (recursive) itemChange() call. In
particular we must never call setPos() inside itemChange().
def mouseDoubleClickEvent(self, event):
dialog = TextItemDlg(self, self.parentWidget())
dialog.exec_()
If the user double-clicks the item, we pop up a smart dialog through which the user can
change the item's text and font. This is the same dialog that we used for adding a text item.
This completes the text item class. It is quite small because we were only concerned with
changing its behavior. For the BoxItem class that we will look at next, we provide code to
govern both its behavior and its appearance.
class BoxItem(QGraphicsItem):
def __init__(self, position, scene, style=Qt.SolidLine,
rect=None, matrix=QMatrix()):
super(BoxItem, self).__init__()
self.setFlags(QGraphicsItem.ItemIsSelectable|
QGraphicsItem.ItemIsMovable|
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 368
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
Help to Improve the Security of Your PDF File by Adding Digital Signatures. Overview. Search unsigned signature field in PDF document.
add signature to pdf file; sign pdf online
C# Create PDF Library SDK to convert PDF from other file formats
What's more, you can also protect created PDF file by adding digital signature (watermark) on PDF using C# code.
pdf sign in; pdf signatures
QGraphicsItem.ItemIsFocusable)
if rect is None:
rect = QRectF(-10 * PointSize, -PointSize,
20 * PointSize, 2 * PointSize)
self.rect = rect
self.style = style
self.setPos(position)
self.setMatrix(matrix)
scene.clearSelection()
scene.addItem(self)
self.setSelected(True)
self.setFocus()
global Dirty
Dirty = True
Box items must be able to receive keyboard focus because we want users to be able to resize
boxes by using the arrow keys. If no explicit size is given, for example when the user clicks
Add Box, rather than when a box is being recreated from file or being pasted from the
copied item, we provide a default size which gives a letter-box shape. We also provide a
default line style of a solid line, and a default identity matrix. The rest of the initializer is
the same as we used before for text items.
We will omit the code for parentWidget() and itemChange() because their
implementations are the same as the ones we used for the TextItem class.
def setStyle(self, style):
self.style = style
self.update()
global Dirty
Dirty = True
This method is used to set the box's line style. It notifies the scene that the item needs
repainting, and sets the dirty flag since we record box line styles when we save
into .pgd files.
def contextMenuEvent(self, event):
wrapped = []
menu = QMenu(self.parentWidget())
for text, param in (
("&Solid", Qt.SolidLine),
("&Dashed", Qt.DashLine),
("D&otted", Qt.DotLine),
("D&ashDotted", Qt.DashDotLine),
("DashDo&tDotted", Qt.DashDotDotLine)):
wrapper = functools.partial(self.setStyle, param)
wrapped.append(wrapper)
menu.addAction(text, wrapper)
menu.exec_(event.screenPos())
If the user invokes the context menu on the item (for example, by right-clicking on some
platforms) this method will be called.
[*]
This context menu uses partial function application
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 369
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 PowerPoint
can convert PowerPoint to PDF (.pdf) online, convert Viewer to view PowerPoint Document, users can Users can perform text signature adding, freehand signature
pdf sign; add signature block to pdf
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit PDF
C# .NET provides permanent annotations adding feature, all to PDF, including freehand signature, text and date signature. such as logo to PDF document, you and
pdf signature field; add signature to pdf
to wrap a method to be called, setStyle(), and a parameter to call it with, one of PyQt's
built-in line styles. The wrappers must stay alive long enough for the menu to finish, since
it is only at that point that one of them will be called. For this reason we keep a local list
of the wrappers; the list will only go out of scope after the menu's exec_() call has finished,
when the contextMenuEvent() itself completes.
[*] Note that this method will not be called if the view has been told to handle context menu events, for example, by having its context menu policy set to
Qt.ActionsContextMenu.
def keyPressEvent(self, event):
factor = PointSize / 4
changed = False
if event.modifiers() & Qt.ShiftModifier:
if event.key() == Qt.Key_Left:
self.rect.setRight(self.rect.right() - factor)
changed = True
elif event.key() == Qt.Key_Right:
self.rect.setRight(self.rect.right() + factor)
changed = True
elif event.key() == Qt.Key_Up:
self.rect.setBottom(self.rect.bottom() - factor)
changed = True
elif event.key() == Qt.Key_Down:
self.rect.setBottom(self.rect.bottom() + factor)
changed = True
if changed:
self.update()
global Dirty
Dirty = True
else:
QGraphicsItem.keyPressEvent(self, event)
If the user presses the arrow keys and the view has scrollbars, the view will scroll
appropriately. This method interceptsarrow key presses that are pressed with the Shift key
when the item has the keyboard focus, to give the user a means of resizing the box. The
QRect.setRight() and QRect.setBottom() methods change the size of the
rectangle because they change the width and height. If we handled the key press event we
call update() to schedule a paint event, and mark the page as dirty; otherwise we call the
base class implementation.
Now that we have seen how the box's behavior is implemented, we are ready to turn our
attention to how the box is drawn. When subclassing QGraphicsItem we must at least
provide implementations of the boundingRect() and paint() methods. It is also
common to reimplement shape(), but we will defer that to the example in the next
section.
def boundingRect(self):
return self.rect.adjusted(-2, -2, 2, 2)
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 370
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 insert image Library: insert images into PDF in C#.net, ASP
scanned signature or logo into PDF document page in C#.NET class application? To help you solve this technical problem, we provide this C#.NET PDF image adding
export pdf sign in; pdf create signature
VB.NET PDF Library SDK to view, edit, convert, process PDF file
Capable of adding PDF file navigation features to your VB allows users to perform PDF document security settings Password, digital signature and PDF text, image
create pdf signature field; create signature pdf
This method should return the bounding rectangle of the item, plus half the pen width if
the item has an outline. Here we have cheated and made the
Table 12.3. Selected QGraphicsItem Methods #2
Syntax
Description
g.boundingRect()
Returns QGraphicsItem g's bounding QRectF; subclasses should reimplement this
g.collidesWithPath(pp)
Returns True if QGraphicsItem g collides with QPainterPath pp
g.collidingItems()
Returns a (possibly empty) list of the QGraphicsItem's that QGraphicsItem g collides
with
g.contains(pt)
Returns True if QGraphicsItem g contains QPointF pt
g.isObscured()
Returns True if QGraphicsItem g is obscured by its colliding items, providing their z
values are larger
g.isSelected()
Returns True if QGraphicsItem g is selected
g.itemChange(c, v)
Does nothing; subclasses can reimplement this method to detect changes, e.g., in selected
status or position. Do not call QGraphicsItem.setPos() directly or indirectly in this
method
g.moveBy(dx, dy)
Moves QGraphicsItem g by float dx horizontally and by float dy vertically in scene
coordinates
g.paint(p, o)
Does nothing; subclasses should reimplement this to draw themselves on QPainter p
and with options QStyleOptionGraphicsItem o; painting is done in local logical
coordinates, by default centered at (0, 0)
g.pos()
Returns QGraphicsItem g's position as a QPointF. If g is a child of another
QGraphicsItem, the point is in terms of the parent item's local logical coordinates;
otherwise in terms of scene coordinates
g.resetMatrix()
Resets QGraphicsItem g's transformation matrix to the identity matrix; for PyQt 4.3 use
resetTransform() instead
g.rotate(a)
Rotates QGraphicsItem g by float a°
g.scale(x, y)
Scales QGraphicsItem g horizontally by float x and vertically by float y; 1.0 is
unscaled, 0.5 is half size, 3.0 is three times the size
g.scene()
Returns QGraphicsItem g's QGraphicsScene or None if it has not been added to a
scene
g.sceneBoundingRect()
Returns QGraphicsItem g's bounding QRectF in scene coordinates—this accounts for
transformations
g.setCursor(c)
Sets g's cursor to QCursor or Qt.CursorShape, c
g.setEnabled(b)
Sets g to be enabled or disabled depending on b
g.setFocus()
Gives the keyboard focus to QGraphicsItem g
g.setFlag(f)
Sets the given QGraphicsItem.ItemFlag f on g
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 371
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 PDF Digital Signature Library: add, remove, update PDF
Guide VB.NET Programmers to Improve the Security of Your PDF File by Adding Digital Signatures in VB.NET. Search unsigned signature field in PDF document.
pdf secure signature; add signature to pdf acrobat
.NET PDF SDK - Description of All PDF Processing Control Feastures
Add signature image to PDF file. PDF Hyperlink Edit. Support adding and inserting hyperlink (link) to PDF document; Allow to create, edit, and remove PDF bookmark
pdf export sign in; adding a signature to a pdf file
Syntax
Description
g.setMatrix(m)
Sets QGraphicsItem g's matrix to QMatrix m; for PyQt 4.3 use setTransform() with
a QTransform argument
g.setPos(x, y)
Sets QGraphicsItem g's position. If g is a child of another QGraphicsItem, the position
is in the parent item's local logical coordinates; otherwise it is in scene coordinates
g.setSelected(b)
Sets QGraphicsItem g to be selected or unselected depending on bool b
g.setZValue(z)
Sets QGraphicsItem g's z value to float z. The default is 0; items with higher values
appear in front of those with lower values
g.shape()
Returns QGraphicsItem g's shape as a QPainterPath. The default implementation
calls boundingRect() to determine the painter path to return; reimplementations
normally create and return the exact shape. By default collision detection is based on shape
g.shear(x, y)
Shears QGraphicsItem g's coordinate system horizontally by float x and vertically
by float y
g.translate(dx, dy)
Moves QGraphicsItem g's coordinate system horizontally by int dx and vertically by
int dy
g.update()
Schedules a paint event for QGraphicsItem g where it is visible in the scene's views
g.zValue()
Returns QGraphicsItem g's z value
bounding rectangle a bit larger. This makes it much easier for the user to click the box,
even if they have reduced it to being a line with a height or width of just 1 pixel.
We have not implemented the shape() method, so the base class's shape() method will
be used, and will produce a shape that is based on the bounding rectangle. Since we have
given a larger rectangle than is really the case, the shape will also be larger. The shape is
used when determining collision detection, but does not matter here because we don't
make use of collision detection in this application; we will in the next one though.
def paint(self, painter, option, widget):
pen = QPen(self.style)
pen.setColor(Qt.black)
pen.setWidth(1)
if option.state & QStyle.State_Selected:
pen.setColor(Qt.blue)
painter.setPen(pen)
painter.drawRect(self.rect)
Painting the box is quite easy. We begin by creating a pen based on the line style the user
has set and with a fixed width of 1 logical unit. We change the pen's color if the rectangle
is selected, then we set the pen and draw the rectangle.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 372
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, All Mature Features Introductions
or typing new signature, deleting added signature from the file After adding such a control button, with a & profession imaging controls, PDF document, image to
adding a signature to a pdf in preview; adding signature to pdf form
VB.NET TIFF: Add New Image to TIFF File in Visual Basic .NET
want to copy an image, graphics, signature or logo However, RasterEdge VB.NET TIFF document processing SDK can and extensive TIFF page image adding tool that
create pdf with signature field; pdf signature stamp
Using the graphics view classes and painting graphics items is often easier than
reimplementing paint events. This is because each item has its own paint() method, and
because the items use a local logical coordinate system whose center is (0, 0), which is
especially convenient for rotation.
In this section we have seen the use of predefined graphics items, and also custom items,
both of which provide custom behavior, and the second of which, BoxItem, also does
custom drawing. In the example covered in the next section, we will see more sophisticated
item painting, and also collision detection and a simple form of animation.
Animation and Complex Shapes
In the previous section we looked at a graphics view application in which user interaction
was central. In this section we will look at a very different kind of application, one where
we simulate a population of creatures, "multipedes", by visualizing each member of the
population using a set of graphics items. Each multipede has internal timers. At each time
interval the multipede moves, and if it has collisions, its coloring is changed slightly, and
eventually it disappears.
We will begin by looking at an extract from the main form's initializer. Then we will review
the form's populate() method which is used to create and position the multipedes. Next
we will look at the action of the Pause/Resume button and at the implementation of the
zoom slider. Then we will look at the form's timer event, a kind of event handler we have
not used before. Once we can see how the application works as a whole, we will look at the
implementations of the graphics item subclasses that are used to visualize the multipedes.
class MainForm(QDialog):
def __init__(self, parent=None):
super(MainForm, self).__init__(parent)
self.scene = QGraphicsScene(self)
self.scene.setSceneRect(0, 0, SCENESIZE, SCENESIZE)
self.view = QGraphicsView()
self.view.setRenderHint(QPainter.Antialiasing)
self.view.setScene(self.scene)
self.view.setFocusPolicy(Qt.NoFocus)
zoomSlider = QSlider(Qt.Horizontal)
zoomSlider.setRange(5, 200)
zoomSlider.setValue(100)
self.pauseButton = QPushButton("Pa&use")
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 373
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.
Figure 12.4. The Multipedes Application
quitButton = QPushButton("&Quit")
The form begins by creating a graphics scene. As usual for non-visual QObject subclasses,
we give the scene a parent. The SCENESIZE is a global integer of value 500. Setting up the
view is similar to what we saw in the previous example. The zoom slider is used to zoom
the scene in or out. We set its initial value to 100 (100%), and give it a range of 5% to 200%.
The pause button is used to pause and resume the animation.
self.connect(zoomSlider, SIGNAL("valueChanged(int)"),
self.zoom)
self.connect(self.pauseButton, SIGNAL("clicked()"),
self.pauseOrResume)
self.connect(quitButton, SIGNAL("clicked()"), self.accept)
self.populate()
self.startTimer(INTERVAL)
self.setWindowTitle("Multipedes")
We have omitted the layout since we have seen so many before, and this one is not unusual.
The connections contain no surprises, but are shown so that we can see how the user
interaction is handled.
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 374
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.
Every QObject subclass (which includes all QWidgets since they are QObject
subclasses), can set off a timer which causes a timer event to occur at every time interval.
Here the INTERVAL is 200 milliseconds. The accuracy of timers depends on the underlying
operating system, but should be at least as good as 20 milliseconds unless the machine is
very heavily loaded. The startTimer() method returns a timer ID which is useful if we
want to call the method more than once to set up multiple timers; we ignore it here because
we just want one timer.
At the end of the initializer, we call populate() to create the multipedes, and set the
application's window title as usual.
def pauseOrResume(self):
global Running
Running = not Running
self.pauseButton.setText("Pa&use" if Running else "Res&ume")
If the user clicks the pause button, we set the global Running Boolean to the opposite of
what it was, and change the button's caption. The form's timer and the multipede timers
refer to this variable, doing nothing if it is False.
def zoom(self, value):
factor = value / 100.0
matrix = self.view.matrix()
matrix.reset()
matrix.scale(factor, factor)
self.view.setMatrix(matrix)
To zoom the scene, all that we need to do is change the scale of the view that shows the
scene. This is achieved by getting the view's current transformation matrix, clearing any
transformations (i.e., scaling) that may be in force, and then rescaling it to a factor that is
proportional to the slider's setting.
Zooming has a significant affect on how the multipedes are drawn. This is because in the
QGraphicsItem.paint() method we can find out how zoomed in or out a scene is and
can use this information to determine how much detail to draw. This means, for example,
that we can draw in a faster and more simplified way if the scene is zoomed out with users
unable to discern the details anyway, and that we can draw in increasing detail as users
zoom in.
def populate(self):
red, green, blue = 0, 150, 0
for i in range(random.randint(6, 10)):
angle = random.randint(0, 360)
offset = random.randint(0, SCENESIZE // 2)
half = SCENESIZE / 2
x = half + (offset * math.sin(math.radians(angle)))
y = half + (offset * math.cos(math.radians(angle)))
color = QColor(red, green, blue)
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 375
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.
head = Head(color, angle, QPointF(x, y))
color = QColor(red, green + random.randint(10, 60), blue)
offset = 25
segment = Segment(color, offset, head)
for j in range(random.randint(3, 7)):
offset += 25
segment = Segment(color, offset, segment)
head.rotate(random.randint(0, 360))
self.scene.addItem(head)
global Running
Running = True
This method is used to generate a random population of 6–10 multipedes. Each multipede
is made up of a head, and between four and eight body segments. For each multipede, the
head is created first, with a semi-random color, a random angle of direction, and at a
random position inside a circle with its center in the middle of the scene. Then the
multipede's first segment is created, with the head being its parent. This means that
whatever transformation is applied to the head, for example, moving or rotating it, will
also be applied to the first segment. Next, 3–7 additional segments are created. Each one
is made a child of its preceding segment. The effect of this is that if the head is transformed,
the first segment is transformed correspondingly, and so is the first segment's child
segment, and so on, for all the multipede's segments.
Once the head and segments have been created, we rotate the head and add it to the scene.
Adding a graphics item to a scene, automatically adds all the item's children, recursively,
so by adding just the head, the entire multipede is added.
At the end we set the global Running Boolean to True. In addition to the form's timer,
each multipede part has a timer, and so long as Running is True, the part will move at
each time interval.
Figure 12.5. Multipedes at Two Different Zoom Levels
The red color we have used is significant for head items. The red color component is set to
0 for all multipedes when they are first created. If a multipede's head's red color component
Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming
Page 376
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