aboutsummaryrefslogtreecommitdiffstats
path: root/examples/widgets
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2022-01-26 12:49:43 +0100
committerChristian Tismer <tismer@stackless.com>2022-01-26 16:47:13 +0000
commitb61f735acd8fa2e43a68d7d90f977d8f1506052a (patch)
tree9a5f4fb9debe1d7d51119ea9e169e58bc47bc62f /examples/widgets
parentdc2046124f132ba0187d1bff97364448288b1cd6 (diff)
examples: Turn most QPainter instances into context managers
After the new context manager is in place, most of the examples benefit from moving QPainter into a `with` statement. The comments concerning PyPy could be removed, again. [ChangeLog][PySide6] The examples are updated to use the new context manager for QPainter. Task-number: PYSIDE-535 Change-Id: Idf7e1f734d549ed663383ffbb2416297ebb1e0c7 Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'examples/widgets')
-rw-r--r--examples/widgets/animation/easing/easing.py94
-rw-r--r--examples/widgets/codeeditor/codeeditor.py39
-rw-r--r--examples/widgets/draganddrop/draggableicons/draggableicons.py9
-rw-r--r--examples/widgets/effects/lighting/lighting.py9
-rw-r--r--examples/widgets/graphicsview/diagramscene/diagramscene.py32
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py9
-rw-r--r--examples/widgets/imageviewer/imageviewer.py17
-rw-r--r--examples/widgets/itemviews/stardelegate/stareditor.py6
-rw-r--r--examples/widgets/painting/basicdrawing/basicdrawing.py102
-rw-r--r--examples/widgets/painting/concentriccircles/concentriccircles.py35
-rw-r--r--examples/widgets/painting/painter/painter.py6
-rw-r--r--examples/widgets/painting/plot/plot.py12
-rw-r--r--examples/widgets/state-machine/rogue/rogue.py38
-rw-r--r--examples/widgets/state-machine/trafficlight/trafficlight.py10
-rw-r--r--examples/widgets/tetrix/tetrix.py50
-rw-r--r--examples/widgets/tutorials/cannon/t10.py19
-rw-r--r--examples/widgets/tutorials/cannon/t11.py11
-rw-r--r--examples/widgets/tutorials/cannon/t12.py13
-rw-r--r--examples/widgets/tutorials/cannon/t13.py25
-rw-r--r--examples/widgets/tutorials/cannon/t14.py27
-rw-r--r--examples/widgets/tutorials/cannon/t8.py6
-rw-r--r--examples/widgets/tutorials/cannon/t9.py19
22 files changed, 266 insertions, 322 deletions
diff --git a/examples/widgets/animation/easing/easing.py b/examples/widgets/animation/easing/easing.py
index a7bff7842..362839079 100644
--- a/examples/widgets/animation/easing/easing.py
+++ b/examples/widgets/animation/easing/easing.py
@@ -154,7 +154,6 @@ class Window(QWidget):
def create_curve_icons(self):
pix = QPixmap(self._iconSize)
- painter = QPainter()
gradient = QLinearGradient(0, 0, 0, self._iconSize.height())
gradient.setColorAt(0.0, QColor(240, 240, 240))
@@ -172,54 +171,51 @@ class Window(QWidget):
and c != QEasingCurve.TCBSpline)]
curve_types.sort(key=lambda ct: ct[1])
- painter.begin(pix)
-
- for curve_name, curve_type in curve_types:
- painter.fillRect(QRect(QPoint(0, 0), self._iconSize), brush)
- curve = QEasingCurve(curve_type)
-
- painter.setPen(QColor(0, 0, 255, 64))
- x_axis = self._iconSize.height() / 1.5
- y_axis = self._iconSize.width() / 3.0
- painter.drawLine(0, x_axis, self._iconSize.width(), x_axis)
- painter.drawLine(y_axis, 0, y_axis, self._iconSize.height())
-
- curve_scale = self._iconSize.height() / 2.0
-
- painter.setPen(Qt.NoPen)
-
- # Start point.
- painter.setBrush(Qt.red)
- start = QPoint(y_axis,
- x_axis - curve_scale * curve.valueForProgress(0))
- painter.drawRect(start.x() - 1, start.y() - 1, 3, 3)
-
- # End point.
- painter.setBrush(Qt.blue)
- end = QPoint(y_axis + curve_scale,
- x_axis - curve_scale * curve.valueForProgress(1))
- painter.drawRect(end.x() - 1, end.y() - 1, 3, 3)
-
- curve_path = QPainterPath()
- curve_path.moveTo(QPointF(start))
- t = 0.0
- while t <= 1.0:
- to = QPointF(y_axis + curve_scale * t,
- x_axis - curve_scale * curve.valueForProgress(t))
- curve_path.lineTo(to)
- t += 1.0 / curve_scale
-
- painter.setRenderHint(QPainter.Antialiasing, True)
- painter.strokePath(curve_path, QColor(32, 32, 32))
- painter.setRenderHint(QPainter.Antialiasing, False)
-
- item = QListWidgetItem()
- item.setIcon(QIcon(pix))
- item.setText(curve_name)
- self._ui.easingCurvePicker.addItem(item)
-
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(pix) as painter:
+
+ for curve_name, curve_type in curve_types:
+ painter.fillRect(QRect(QPoint(0, 0), self._iconSize), brush)
+ curve = QEasingCurve(curve_type)
+
+ painter.setPen(QColor(0, 0, 255, 64))
+ x_axis = self._iconSize.height() / 1.5
+ y_axis = self._iconSize.width() / 3.0
+ painter.drawLine(0, x_axis, self._iconSize.width(), x_axis)
+ painter.drawLine(y_axis, 0, y_axis, self._iconSize.height())
+
+ curve_scale = self._iconSize.height() / 2.0
+
+ painter.setPen(Qt.NoPen)
+
+ # Start point.
+ painter.setBrush(Qt.red)
+ start = QPoint(y_axis,
+ x_axis - curve_scale * curve.valueForProgress(0))
+ painter.drawRect(start.x() - 1, start.y() - 1, 3, 3)
+
+ # End point.
+ painter.setBrush(Qt.blue)
+ end = QPoint(y_axis + curve_scale,
+ x_axis - curve_scale * curve.valueForProgress(1))
+ painter.drawRect(end.x() - 1, end.y() - 1, 3, 3)
+
+ curve_path = QPainterPath()
+ curve_path.moveTo(QPointF(start))
+ t = 0.0
+ while t <= 1.0:
+ to = QPointF(y_axis + curve_scale * t,
+ x_axis - curve_scale * curve.valueForProgress(t))
+ curve_path.lineTo(to)
+ t += 1.0 / curve_scale
+
+ painter.setRenderHint(QPainter.Antialiasing, True)
+ painter.strokePath(curve_path, QColor(32, 32, 32))
+ painter.setRenderHint(QPainter.Antialiasing, False)
+
+ item = QListWidgetItem()
+ item.setIcon(QIcon(pix))
+ item.setText(curve_name)
+ self._ui.easingCurvePicker.addItem(item)
def start_animation(self):
self._anim.setStartValue(QPointF(0, 0))
diff --git a/examples/widgets/codeeditor/codeeditor.py b/examples/widgets/codeeditor/codeeditor.py
index bfe92c4a8..47dc8b0a3 100644
--- a/examples/widgets/codeeditor/codeeditor.py
+++ b/examples/widgets/codeeditor/codeeditor.py
@@ -85,29 +85,26 @@ class CodeEditor(QPlainTextEdit):
self.line_number_area.setGeometry(rect)
def lineNumberAreaPaintEvent(self, event):
- painter = QPainter(self.line_number_area)
- painter.fillRect(event.rect(), Qt.lightGray)
- block = self.firstVisibleBlock()
- block_number = block.blockNumber()
- offset = self.contentOffset()
- top = self.blockBoundingGeometry(block).translated(offset).top()
- bottom = top + self.blockBoundingRect(block).height()
-
- while block.isValid() and top <= event.rect().bottom():
- if block.isVisible() and bottom >= event.rect().top():
- number = str(block_number + 1)
- painter.setPen(Qt.black)
- width = self.line_number_area.width()
- height = self.fontMetrics().height()
- painter.drawText(0, top, width, height, Qt.AlignRight, number)
-
- block = block.next()
- top = bottom
+ with QPainter(self.line_number_area) as painter:
+ painter.fillRect(event.rect(), Qt.lightGray)
+ block = self.firstVisibleBlock()
+ block_number = block.blockNumber()
+ offset = self.contentOffset()
+ top = self.blockBoundingGeometry(block).translated(offset).top()
bottom = top + self.blockBoundingRect(block).height()
- block_number += 1
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ while block.isValid() and top <= event.rect().bottom():
+ if block.isVisible() and bottom >= event.rect().top():
+ number = str(block_number + 1)
+ painter.setPen(Qt.black)
+ width = self.line_number_area.width()
+ height = self.fontMetrics().height()
+ painter.drawText(0, top, width, height, Qt.AlignRight, number)
+
+ block = block.next()
+ top = bottom
+ bottom = top + self.blockBoundingRect(block).height()
+ block_number += 1
@Slot()
def update_line_number_area_width(self, newBlockCount):
diff --git a/examples/widgets/draganddrop/draggableicons/draggableicons.py b/examples/widgets/draganddrop/draggableicons/draggableicons.py
index 5fe6590e7..b3b4a56e5 100644
--- a/examples/widgets/draganddrop/draggableicons/draggableicons.py
+++ b/examples/widgets/draganddrop/draggableicons/draggableicons.py
@@ -139,10 +139,8 @@ class DragWidget(QFrame):
# .copy() is important: python is different than c++ in this case
temp_pixmap = pixmap.copy()
- painter = QPainter()
- painter.begin(temp_pixmap)
- painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127))
- painter.end()
+ with QPainter(temp_pixmap) as painter:
+ painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127))
child.setPixmap(temp_pixmap)
@@ -152,9 +150,6 @@ class DragWidget(QFrame):
child.show()
child.setPixmap(pixmap)
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
-
if __name__ == "__main__":
app = QApplication(sys.argv)
diff --git a/examples/widgets/effects/lighting/lighting.py b/examples/widgets/effects/lighting/lighting.py
index ec8f945e1..be34464dd 100644
--- a/examples/widgets/effects/lighting/lighting.py
+++ b/examples/widgets/effects/lighting/lighting.py
@@ -89,11 +89,10 @@ class Lighting(QGraphicsView):
pixmap = QPixmap(60, 60)
pixmap.fill(Qt.transparent)
- painter = QPainter(pixmap)
- painter.setPen(Qt.NoPen)
- painter.setBrush(radial_grad)
- painter.drawEllipse(0, 0, 60, 60)
- painter.end()
+ with QPainter(pixmap) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(radial_grad)
+ painter.drawEllipse(0, 0, 60, 60)
self.m_lightSource = self.m_scene.addPixmap(pixmap)
self.m_lightSource.setZValue(2)
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene.py b/examples/widgets/graphicsview/diagramscene/diagramscene.py
index aca95ccb9..a7980eec1 100644
--- a/examples/widgets/graphicsview/diagramscene/diagramscene.py
+++ b/examples/widgets/graphicsview/diagramscene/diagramscene.py
@@ -238,12 +238,10 @@ class DiagramItem(QGraphicsPolygonItem):
def image(self):
pixmap = QPixmap(250, 250)
pixmap.fill(Qt.transparent)
- painter = QPainter(pixmap)
- painter.setPen(QPen(Qt.black, 8))
- painter.translate(125, 125)
- painter.drawPolyline(self._my_polygon)
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(pixmap) as painter:
+ painter.setPen(QPen(Qt.black, 8))
+ painter.translate(125, 125)
+ painter.drawPolyline(self._my_polygon)
return pixmap
def contextMenuEvent(self, event):
@@ -808,22 +806,22 @@ class MainWindow(QMainWindow):
def create_color_tool_button_icon(self, imageFile, color):
pixmap = QPixmap(50, 80)
pixmap.fill(Qt.transparent)
- painter = QPainter(pixmap)
- image = QPixmap(imageFile)
- target = QRect(0, 0, 50, 60)
- source = QRect(0, 0, 42, 42)
- painter.fillRect(QRect(0, 60, 50, 80), color)
- painter.drawPixmap(target, image, source)
- painter.end()
+
+ with QPainter(pixmap) as painter:
+ image = QPixmap(imageFile)
+ target = QRect(0, 0, 50, 60)
+ source = QRect(0, 0, 42, 42)
+ painter.fillRect(QRect(0, 60, 50, 80), color)
+ painter.drawPixmap(target, image, source)
return QIcon(pixmap)
def create_color_icon(self, color):
pixmap = QPixmap(20, 20)
- painter = QPainter(pixmap)
- painter.setPen(Qt.NoPen)
- painter.fillRect(QRect(0, 0, 20, 20), color)
- painter.end()
+
+ with QPainter(pixmap) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.fillRect(QRect(0, 0, 20, 20), color)
return QIcon(pixmap)
diff --git a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py
index 4f074aa19..4c916f521 100644
--- a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py
+++ b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py
@@ -113,11 +113,10 @@ class ColorItem(QGraphicsItem):
pixmap = QPixmap(34, 34)
pixmap.fill(Qt.white)
- painter = QPainter(pixmap)
- painter.translate(15, 15)
- painter.setRenderHint(QPainter.Antialiasing)
- self.paint(painter, None, None)
- painter.end()
+ with QPainter(pixmap) as painter:
+ painter.translate(15, 15)
+ painter.setRenderHint(QPainter.Antialiasing)
+ self.paint(painter, None, None)
pixmap.setMask(pixmap.createHeuristicMask())
diff --git a/examples/widgets/imageviewer/imageviewer.py b/examples/widgets/imageviewer/imageviewer.py
index ebcae5fa4..177c7d026 100644
--- a/examples/widgets/imageviewer/imageviewer.py
+++ b/examples/widgets/imageviewer/imageviewer.py
@@ -155,15 +155,14 @@ class ImageViewer(QMainWindow):
printer = QPrinter()
dialog = QPrintDialog(printer, self)
if dialog.exec() == QDialog.Accepted:
- painter = QPainter(printer)
- pixmap = self._image_label.pixmap()
- rect = painter.viewport()
- size = pixmap.size()
- size.scale(rect.size(), Qt.KeepAspectRatio)
- painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
- painter.setWindow(pixmap.rect())
- painter.drawPixmap(0, 0, pixmap)
- painter.end()
+ with QPainter(printer) as painter:
+ pixmap = self._image_label.pixmap()
+ rect = painter.viewport()
+ size = pixmap.size()
+ size.scale(rect.size(), Qt.KeepAspectRatio)
+ painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
+ painter.setWindow(pixmap.rect())
+ painter.drawPixmap(0, 0, pixmap)
@Slot()
def _copy(self):
diff --git a/examples/widgets/itemviews/stardelegate/stareditor.py b/examples/widgets/itemviews/stardelegate/stareditor.py
index 9e3a5f4df..93027276c 100644
--- a/examples/widgets/itemviews/stardelegate/stareditor.py
+++ b/examples/widgets/itemviews/stardelegate/stareditor.py
@@ -70,10 +70,8 @@ class StarEditor(QWidget):
def paintEvent(self, event):
""" Paint the editor, offloading the work to the StarRating class. """
- painter = QPainter(self)
- self.star_rating.paint(painter, self.rect(), self.palette(), isEditable=True)
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ self.star_rating.paint(painter, self.rect(), self.palette(), isEditable=True)
def mouseMoveEvent(self, event):
""" As the mouse moves inside the editor, track the position and
diff --git a/examples/widgets/painting/basicdrawing/basicdrawing.py b/examples/widgets/painting/basicdrawing/basicdrawing.py
index a0d5bda7c..e89d694fe 100644
--- a/examples/widgets/painting/basicdrawing/basicdrawing.py
+++ b/examples/widgets/painting/basicdrawing/basicdrawing.py
@@ -114,58 +114,56 @@ class RenderArea(QWidget):
start_angle = 30 * 16
arc_length = 120 * 16
- painter = QPainter(self)
- painter.setPen(self.pen)
- painter.setBrush(self.brush)
- if self.antialiased:
- painter.setRenderHint(QPainter.Antialiasing)
-
- for x in range(0, self.width(), 100):
- for y in range(0, self.height(), 100):
- painter.save()
- painter.translate(x, y)
- if self.transformed:
- painter.translate(50, 50)
- painter.rotate(60.0)
- painter.scale(0.6, 0.9)
- painter.translate(-50, -50)
-
- if self.shape == RenderArea.Line:
- painter.drawLine(rect.bottomLeft(), rect.topRight())
- elif self.shape == RenderArea.Points:
- painter.drawPoints(RenderArea.points)
- elif self.shape == RenderArea.Polyline:
- painter.drawPolyline(RenderArea.points)
- elif self.shape == RenderArea.Polygon:
- painter.drawPolygon(RenderArea.points)
- elif self.shape == RenderArea.Rect:
- painter.drawRect(rect)
- elif self.shape == RenderArea.RoundedRect:
- painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
- elif self.shape == RenderArea.Ellipse:
- painter.drawEllipse(rect)
- elif self.shape == RenderArea.Arc:
- painter.drawArc(rect, start_angle, arc_length)
- elif self.shape == RenderArea.Chord:
- painter.drawChord(rect, start_angle, arc_length)
- elif self.shape == RenderArea.Pie:
- painter.drawPie(rect, start_angle, arc_length)
- elif self.shape == RenderArea.Path:
- painter.drawPath(path)
- elif self.shape == RenderArea.Text:
- qv = qVersion()
- painter.drawText(rect, Qt.AlignCenter,
- f"PySide 6\nQt {qv}")
- elif self.shape == RenderArea.Pixmap:
- painter.drawPixmap(10, 10, self.pixmap)
-
- painter.restore()
-
- painter.setPen(self.palette().dark().color())
- painter.setBrush(Qt.NoBrush)
- painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ painter.setPen(self.pen)
+ painter.setBrush(self.brush)
+ if self.antialiased:
+ painter.setRenderHint(QPainter.Antialiasing)
+
+ for x in range(0, self.width(), 100):
+ for y in range(0, self.height(), 100):
+ painter.save()
+ painter.translate(x, y)
+ if self.transformed:
+ painter.translate(50, 50)
+ painter.rotate(60.0)
+ painter.scale(0.6, 0.9)
+ painter.translate(-50, -50)
+
+ if self.shape == RenderArea.Line:
+ painter.drawLine(rect.bottomLeft(), rect.topRight())
+ elif self.shape == RenderArea.Points:
+ painter.drawPoints(RenderArea.points)
+ elif self.shape == RenderArea.Polyline:
+ painter.drawPolyline(RenderArea.points)
+ elif self.shape == RenderArea.Polygon:
+ painter.drawPolygon(RenderArea.points)
+ elif self.shape == RenderArea.Rect:
+ painter.drawRect(rect)
+ elif self.shape == RenderArea.RoundedRect:
+ painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
+ elif self.shape == RenderArea.Ellipse:
+ painter.drawEllipse(rect)
+ elif self.shape == RenderArea.Arc:
+ painter.drawArc(rect, start_angle, arc_length)
+ elif self.shape == RenderArea.Chord:
+ painter.drawChord(rect, start_angle, arc_length)
+ elif self.shape == RenderArea.Pie:
+ painter.drawPie(rect, start_angle, arc_length)
+ elif self.shape == RenderArea.Path:
+ painter.drawPath(path)
+ elif self.shape == RenderArea.Text:
+ qv = qVersion()
+ painter.drawText(rect, Qt.AlignCenter,
+ f"PySide 6\nQt {qv}")
+ elif self.shape == RenderArea.Pixmap:
+ painter.drawPixmap(10, 10, self.pixmap)
+
+ painter.restore()
+
+ painter.setPen(self.palette().dark().color())
+ painter.setBrush(Qt.NoBrush)
+ painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
id_role = Qt.UserRole
diff --git a/examples/widgets/painting/concentriccircles/concentriccircles.py b/examples/widgets/painting/concentriccircles/concentriccircles.py
index 2786396cb..c6bada0a6 100644
--- a/examples/widgets/painting/concentriccircles/concentriccircles.py
+++ b/examples/widgets/painting/concentriccircles/concentriccircles.py
@@ -78,25 +78,22 @@ class CircleWidget(QWidget):
self.update()
def paintEvent(self, event):
- painter = QPainter(self)
- painter.setRenderHint(QPainter.Antialiasing, self.antialiased)
- painter.translate(self.width() / 2, self.height() / 2)
-
- for diameter in range(0, 256, 9):
- delta = abs((self._frame_no % 128) - diameter / 2)
- alpha = 255 - (delta * delta) / 4 - diameter
- if alpha > 0:
- painter.setPen(QPen(QColor(0, diameter / 2, 127, alpha), 3))
-
- if self._float_based:
- painter.drawEllipse(QRectF(-diameter / 2.0,
- -diameter / 2.0, diameter, diameter))
- else:
- painter.drawEllipse(QRect(-diameter / 2,
- -diameter / 2, diameter, diameter))
-
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ painter.setRenderHint(QPainter.Antialiasing, self.antialiased)
+ painter.translate(self.width() / 2, self.height() / 2)
+
+ for diameter in range(0, 256, 9):
+ delta = abs((self._frame_no % 128) - diameter / 2)
+ alpha = 255 - (delta * delta) / 4 - diameter
+ if alpha > 0:
+ painter.setPen(QPen(QColor(0, diameter / 2, 127, alpha), 3))
+
+ if self._float_based:
+ painter.drawEllipse(QRectF(-diameter / 2.0,
+ -diameter / 2.0, diameter, diameter))
+ else:
+ painter.drawEllipse(QRect(-diameter / 2,
+ -diameter / 2, diameter, diameter))
class Window(QWidget):
diff --git a/examples/widgets/painting/painter/painter.py b/examples/widgets/painting/painter/painter.py
index 3d5d95f10..6626afb7a 100644
--- a/examples/widgets/painting/painter/painter.py
+++ b/examples/widgets/painting/painter/painter.py
@@ -88,10 +88,8 @@ class PainterWidget(QWidget):
Paint the Pixmap into the widget
"""
- painter = QPainter()
- painter.begin(self)
- painter.drawPixmap(0, 0, self.pixmap)
- painter.end()
+ with QPainter(self) as painter:
+ painter.drawPixmap(0, 0, self.pixmap)
def mousePressEvent(self, event: QMouseEvent):
"""Override from QWidget
diff --git a/examples/widgets/painting/plot/plot.py b/examples/widgets/painting/plot/plot.py
index a125c3253..30dc3e504 100644
--- a/examples/widgets/painting/plot/plot.py
+++ b/examples/widgets/painting/plot/plot.py
@@ -88,13 +88,11 @@ class PlotWidget(QWidget):
self.update()
def paintEvent(self, event):
- painter = QPainter()
- painter.begin(self)
- rect = QRect(QPoint(0, 0), self.size())
- painter.fillRect(rect, Qt.white)
- painter.translate(-self._points[0].x(), 0)
- painter.drawPolyline(self._points)
- painter.end()
+ with QPainter(self) as painter:
+ rect = QRect(QPoint(0, 0), self.size())
+ painter.fillRect(rect, Qt.white)
+ painter.translate(-self._points[0].x(), 0)
+ painter.drawPolyline(self._points)
if __name__ == "__main__":
diff --git a/examples/widgets/state-machine/rogue/rogue.py b/examples/widgets/state-machine/rogue/rogue.py
index 255785f95..19394542a 100644
--- a/examples/widgets/state-machine/rogue/rogue.py
+++ b/examples/widgets/state-machine/rogue/rogue.py
@@ -161,27 +161,25 @@ class MainWindow(QMainWindow):
def paintEvent(self, event):
metrics = QFontMetrics(self.font())
- painter = QPainter(self)
- font_height = metrics.height()
- font_width = metrics.horizontalAdvance('X')
-
- painter.fillRect(self.rect(), Qt.black)
- painter.setPen(Qt.white)
-
- y_pos = font_height
- painter.drawText(QPoint(0, y_pos), self.status)
- for y in range(self.height):
- y_pos += font_height
- x_pos = 0
- for x in range(self.width):
- if y == self.pY and x == self.pX:
+ with QPainter(self) as painter:
+ font_height = metrics.height()
+ font_width = metrics.horizontalAdvance('X')
+
+ painter.fillRect(self.rect(), Qt.black)
+ painter.setPen(Qt.white)
+
+ y_pos = font_height
+ painter.drawText(QPoint(0, y_pos), self.status)
+ for y in range(self.height):
+ y_pos += font_height
+ x_pos = 0
+ for x in range(self.width):
+ if y == self.pY and x == self.pX:
+ x_pos += font_width
+ continue
+ painter.drawText(QPoint(x_pos, y_pos), self.map[x][y])
x_pos += font_width
- continue
- painter.drawText(QPoint(x_pos, y_pos), self.map[x][y])
- x_pos += font_width
- painter.drawText(QPoint(self.pX * font_width, (self.pY + 2) * font_height), '@')
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ painter.drawText(QPoint(self.pX * font_width, (self.pY + 2) * font_height), '@')
def move_player(self, direction):
if direction == self.left:
diff --git a/examples/widgets/state-machine/trafficlight/trafficlight.py b/examples/widgets/state-machine/trafficlight/trafficlight.py
index b5e975cfc..2a35d23ce 100644
--- a/examples/widgets/state-machine/trafficlight/trafficlight.py
+++ b/examples/widgets/state-machine/trafficlight/trafficlight.py
@@ -74,12 +74,10 @@ class LightWidget(QWidget):
def paintEvent(self, e):
if not self._on_val:
return
- painter = QPainter(self)
- painter.setRenderHint(QPainter.Antialiasing)
- painter.setBrush(self.color)
- painter.drawEllipse(0, 0, self.width(), self.height())
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ painter.setRenderHint(QPainter.Antialiasing)
+ painter.setBrush(self.color)
+ painter.drawEllipse(0, 0, self.width(), self.height())
on = Property(bool, is_on, set_on)
diff --git a/examples/widgets/tetrix/tetrix.py b/examples/widgets/tetrix/tetrix.py
index c70e634b4..04a8b5f57 100644
--- a/examples/widgets/tetrix/tetrix.py
+++ b/examples/widgets/tetrix/tetrix.py
@@ -212,32 +212,30 @@ class TetrixBoard(QFrame):
def paintEvent(self, event):
super(TetrixBoard, self).paintEvent(event)
- painter = QPainter(self)
- rect = self.contentsRect()
+ with QPainter(self) as painter:
+ rect = self.contentsRect()
- if self._is_paused:
- painter.drawText(rect, Qt.AlignCenter, "Pause")
- return
+ if self._is_paused:
+ painter.drawText(rect, Qt.AlignCenter, "Pause")
+ return
- board_top = rect.bottom() - TetrixBoard.board_height * self.square_height()
+ board_top = rect.bottom() - TetrixBoard.board_height * self.square_height()
- for i in range(TetrixBoard.board_height):
- for j in range(TetrixBoard.board_width):
- shape = self.shape_at(j, TetrixBoard.board_height - i - 1)
- if shape != Piece.NoShape:
- self.draw_square(painter,
- rect.left() + j * self.square_width(),
- board_top + i * self.square_height(), shape)
-
- if self._cur_piece.shape() != Piece.NoShape:
- for i in range(4):
- x = self._cur_x + self._cur_piece.x(i)
- y = self._cur_y - self._cur_piece.y(i)
- self.draw_square(painter, rect.left() + x * self.square_width(),
- board_top + (TetrixBoard.board_height - y - 1) * self.square_height(),
- self._cur_piece.shape())
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ for i in range(TetrixBoard.board_height):
+ for j in range(TetrixBoard.board_width):
+ shape = self.shape_at(j, TetrixBoard.board_height - i - 1)
+ if shape != Piece.NoShape:
+ self.draw_square(painter,
+ rect.left() + j * self.square_width(),
+ board_top + i * self.square_height(), shape)
+
+ if self._cur_piece.shape() != Piece.NoShape:
+ for i in range(4):
+ x = self._cur_x + self._cur_piece.x(i)
+ y = self._cur_y - self._cur_piece.y(i)
+ self.draw_square(painter, rect.left() + x * self.square_width(),
+ board_top + (TetrixBoard.board_height - y - 1) * self.square_height(),
+ self._cur_piece.shape())
def keyPressEvent(self, event):
if not self._is_started or self._is_paused or self._cur_piece.shape() == Piece.NoShape:
@@ -359,10 +357,8 @@ class TetrixBoard(QFrame):
dy = self._next_piece.max_y() - self._next_piece.min_y() + 1
pixmap = QPixmap(dx * self.square_width(), dy * self.square_height())
- painter = QPainter(pixmap)
- painter.fillRect(pixmap.rect(), self.nextPieceLabel.palette().background())
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(pixmap) as painter:
+ painter.fillRect(pixmap.rect(), self.nextPieceLabel.palette().background())
for int in range(4):
x = self._next_piece.x(i) - self._next_piece.min_x()
diff --git a/examples/widgets/tutorials/cannon/t10.py b/examples/widgets/tutorials/cannon/t10.py
index 98b5f57fe..0e553f8c5 100644
--- a/examples/widgets/tutorials/cannon/t10.py
+++ b/examples/widgets/tutorials/cannon/t10.py
@@ -129,17 +129,14 @@ class CannonField(QWidget):
self.force_changed.emit(self._current_force)
def paintEvent(self, event):
- painter = QPainter(self)
-
- painter.setPen(Qt.NoPen)
- painter.setBrush(Qt.blue)
-
- painter.translate(0, self.height())
- painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
- painter.rotate(-self._current_angle)
- painter.drawRect(QRect(33, -4, 15, 8))
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.blue)
+
+ painter.translate(0, self.height())
+ painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self._current_angle)
+ painter.drawRect(QRect(33, -4, 15, 8))
def cannon_rect(self):
result = QRect(0, 0, 50, 50)
diff --git a/examples/widgets/tutorials/cannon/t11.py b/examples/widgets/tutorials/cannon/t11.py
index ea8e53a8e..fa2198e10 100644
--- a/examples/widgets/tutorials/cannon/t11.py
+++ b/examples/widgets/tutorials/cannon/t11.py
@@ -159,13 +159,10 @@ class CannonField(QWidget):
self.update(region)
def paintEvent(self, event):
- painter = QPainter(self)
-
- self.paint_cannon(painter)
- if self._auto_shoot_timer.isActive():
- self.paint_shot(painter)
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ self.paint_cannon(painter)
+ if self._auto_shoot_timer.isActive():
+ self.paint_shot(painter)
def paint_shot(self, painter):
painter.setPen(Qt.NoPen)
diff --git a/examples/widgets/tutorials/cannon/t12.py b/examples/widgets/tutorials/cannon/t12.py
index 98b2ff248..bfde8d5de 100644
--- a/examples/widgets/tutorials/cannon/t12.py
+++ b/examples/widgets/tutorials/cannon/t12.py
@@ -198,15 +198,12 @@ class CannonField(QWidget):
self.update(region)
def paintEvent(self, event):
- painter = QPainter(self)
+ with QPainter(self) as painter:
+ self.paint_cannon(painter)
+ if self._auto_shoot_timer.isActive():
+ self.paint_shot(painter)
- self.paint_cannon(painter)
- if self._auto_shoot_timer.isActive():
- self.paint_shot(painter)
-
- self.paint_target(painter)
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ self.paint_target(painter)
def paint_shot(self, painter):
painter.setPen(Qt.NoPen)
diff --git a/examples/widgets/tutorials/cannon/t13.py b/examples/widgets/tutorials/cannon/t13.py
index 3ac05f435..fe487de53 100644
--- a/examples/widgets/tutorials/cannon/t13.py
+++ b/examples/widgets/tutorials/cannon/t13.py
@@ -220,20 +220,17 @@ class CannonField(QWidget):
self.update(region)
def paintEvent(self, event):
- painter = QPainter(self)
-
- if self._game_ended:
- painter.setPen(Qt.black)
- painter.setFont(QFont("Courier", 48, QFont.Bold))
- painter.drawText(self.rect(), Qt.AlignCenter, "Game Over")
-
- self.paint_cannon(painter)
- if self.is_shooting():
- self.paint_shot(painter)
- if not self._game_ended:
- self.paint_target(painter)
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ if self._game_ended:
+ painter.setPen(Qt.black)
+ painter.setFont(QFont("Courier", 48, QFont.Bold))
+ painter.drawText(self.rect(), Qt.AlignCenter, "Game Over")
+
+ self.paint_cannon(painter)
+ if self.is_shooting():
+ self.paint_shot(painter)
+ if not self._game_ended:
+ self.paint_target(painter)
def paint_shot(self, painter):
painter.setPen(Qt.NoPen)
diff --git a/examples/widgets/tutorials/cannon/t14.py b/examples/widgets/tutorials/cannon/t14.py
index 8a3fe98e8..ac6924a3b 100644
--- a/examples/widgets/tutorials/cannon/t14.py
+++ b/examples/widgets/tutorials/cannon/t14.py
@@ -243,21 +243,18 @@ class CannonField(QWidget):
self._barrel_pressed = False
def paintEvent(self, event):
- painter = QPainter(self)
-
- if self._game_ended:
- painter.setPen(Qt.black)
- painter.setFont(QFont("Courier", 48, QFont.Bold))
- painter.drawText(self.rect(), Qt.AlignCenter, "Game Over")
-
- self.paint_cannon(painter)
- self.paint_barrier(painter)
- if self.is_shooting():
- self.paint_shot(painter)
- if not self._game_ended:
- self.paint_target(painter)
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ if self._game_ended:
+ painter.setPen(Qt.black)
+ painter.setFont(QFont("Courier", 48, QFont.Bold))
+ painter.drawText(self.rect(), Qt.AlignCenter, "Game Over")
+
+ self.paint_cannon(painter)
+ self.paint_barrier(painter)
+ if self.is_shooting():
+ self.paint_shot(painter)
+ if not self._game_ended:
+ self.paint_target(painter)
def paint_shot(self, painter):
painter.setPen(Qt.NoPen)
diff --git a/examples/widgets/tutorials/cannon/t8.py b/examples/widgets/tutorials/cannon/t8.py
index b02a049cc..757015495 100644
--- a/examples/widgets/tutorials/cannon/t8.py
+++ b/examples/widgets/tutorials/cannon/t8.py
@@ -115,10 +115,8 @@ class CannonField(QWidget):
self.angle_changed.emit(self._current_angle)
def paintEvent(self, event):
- painter = QPainter(self)
- painter.drawText(200, 200, f"Angle = {self._current_angle}")
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ painter.drawText(200, 200, f"Angle = {self._current_angle}")
class MyWidget(QWidget):
diff --git a/examples/widgets/tutorials/cannon/t9.py b/examples/widgets/tutorials/cannon/t9.py
index f18144310..a682c8356 100644
--- a/examples/widgets/tutorials/cannon/t9.py
+++ b/examples/widgets/tutorials/cannon/t9.py
@@ -115,17 +115,14 @@ class CannonField(QWidget):
self.angle_changed.emit(self._current_angle)
def paintEvent(self, event):
- painter = QPainter(self)
-
- painter.setPen(Qt.NoPen)
- painter.setBrush(Qt.blue)
-
- painter.translate(0, self.rect().height())
- painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
- painter.rotate(-self._current_angle)
- painter.drawRect(QRect(33, -4, 15, 8))
- # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
- painter.end()
+ with QPainter(self) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.blue)
+
+ painter.translate(0, self.rect().height())
+ painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self._current_angle)
+ painter.drawRect(QRect(33, -4, 15, 8))
class MyWidget(QWidget):