diff options
author | Christian Tismer <[email protected]> | 2022-01-26 12:49:43 +0100 |
---|---|---|
committer | Christian Tismer <[email protected]> | 2022-01-26 16:47:13 +0000 |
commit | b61f735acd8fa2e43a68d7d90f977d8f1506052a (patch) | |
tree | 9a5f4fb9debe1d7d51119ea9e169e58bc47bc62f | |
parent | dc2046124f132ba0187d1bff97364448288b1cd6 (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 <[email protected]>
31 files changed, 388 insertions, 464 deletions
diff --git a/examples/corelib/threads/mandelbrot.py b/examples/corelib/threads/mandelbrot.py index 70658dc58..022f47438 100644 --- a/examples/corelib/threads/mandelbrot.py +++ b/examples/corelib/threads/mandelbrot.py @@ -253,49 +253,45 @@ class MandelbrotWidget(QWidget): self._info = '' def paintEvent(self, event): - painter = QPainter(self) - painter.fillRect(self.rect(), Qt.black) - - if self.pixmap.isNull(): + with QPainter(self) as painter: + painter.fillRect(self.rect(), Qt.black) + + if self.pixmap.isNull(): + painter.setPen(Qt.white) + painter.drawText(self.rect(), Qt.AlignCenter, + "Rendering initial image, please wait...") + return + + if self._cur_scale == self._pixmap_scale: + painter.drawPixmap(self._pixmap_offset, self.pixmap) + else: + scale_factor = self._pixmap_scale / self._cur_scale + new_width = int(self.pixmap.width() * scale_factor) + new_height = int(self.pixmap.height() * scale_factor) + new_x = self._pixmap_offset.x() + (self.pixmap.width() - new_width) / 2 + new_y = self._pixmap_offset.y() + (self.pixmap.height() - new_height) / 2 + + painter.save() + painter.translate(new_x, new_y) + painter.scale(scale_factor, scale_factor) + exposed, _ = painter.transform().inverted() + exposed = exposed.mapRect(self.rect()).adjusted(-1, -1, 1, 1) + painter.drawPixmap(exposed, self.pixmap, exposed) + painter.restore() + + text = HELP + if self._info: + text += ' ' + self._info + metrics = painter.fontMetrics() + text_width = metrics.horizontalAdvance(text) + + painter.setPen(Qt.NoPen) + painter.setBrush(QColor(0, 0, 0, 127)) + painter.drawRect((self.width() - text_width) / 2 - 5, 0, text_width + 10, + metrics.lineSpacing() + 5) painter.setPen(Qt.white) - painter.drawText(self.rect(), Qt.AlignCenter, - "Rendering initial image, please wait...") - # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3. - painter.end() - return - - if self._cur_scale == self._pixmap_scale: - painter.drawPixmap(self._pixmap_offset, self.pixmap) - else: - scale_factor = self._pixmap_scale / self._cur_scale - new_width = int(self.pixmap.width() * scale_factor) - new_height = int(self.pixmap.height() * scale_factor) - new_x = self._pixmap_offset.x() + (self.pixmap.width() - new_width) / 2 - new_y = self._pixmap_offset.y() + (self.pixmap.height() - new_height) / 2 - - painter.save() - painter.translate(new_x, new_y) - painter.scale(scale_factor, scale_factor) - exposed, _ = painter.transform().inverted() - exposed = exposed.mapRect(self.rect()).adjusted(-1, -1, 1, 1) - painter.drawPixmap(exposed, self.pixmap, exposed) - painter.restore() - - text = HELP - if self._info: - text += ' ' + self._info - metrics = painter.fontMetrics() - text_width = metrics.horizontalAdvance(text) - - painter.setPen(Qt.NoPen) - painter.setBrush(QColor(0, 0, 0, 127)) - painter.drawRect((self.width() - text_width) / 2 - 5, 0, text_width + 10, - metrics.lineSpacing() + 5) - painter.setPen(Qt.white) - painter.drawText((self.width() - text_width) / 2, - metrics.leading() + metrics.ascent(), text) - # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3. - painter.end() + painter.drawText((self.width() - text_width) / 2, + metrics.leading() + metrics.ascent(), text) def resizeEvent(self, event): self.thread.render(self._center_x, self._center_y, self._cur_scale, self.size()) diff --git a/examples/designer/taskmenuextension/tictactoe.py b/examples/designer/taskmenuextension/tictactoe.py index c4fe16e10..03772e351 100644 --- a/examples/designer/taskmenuextension/tictactoe.py +++ b/examples/designer/taskmenuextension/tictactoe.py @@ -99,60 +99,57 @@ class TicTacToe(QWidget): self.update() def paintEvent(self, event): - painter = QPainter(self) - painter.setRenderHint(QPainter.Antialiasing) - - painter.setPen(QPen(Qt.darkGreen, 1)) - painter.drawLine(self._cell_width(), 0, - self._cell_width(), self.height()) - painter.drawLine(2 * self._cell_width(), 0, - 2 * self._cell_width(), self.height()) - painter.drawLine(0, self._cell_height(), - self.width(), self._cell_height()) - painter.drawLine(0, 2 * self._cell_height(), - self.width(), 2 * self._cell_height()) - - painter.setPen(QPen(Qt.darkBlue, 2)) - - for position in range(9): - cell = self._cell_rect(position) - if self._state[position] == CROSS: - painter.drawLine(cell.topLeft(), cell.bottomRight()) - painter.drawLine(cell.topRight(), cell.bottomLeft()) - elif self._state[position] == NOUGHT: - painter.drawEllipse(cell) - - painter.setPen(QPen(Qt.yellow, 3)) - - for position in range(0, 8, 3): - if (self._state[position] != EMPTY - and self._state[position + 1] == self._state[position] - and self._state[position + 2] == self._state[position]): - y = self._cell_rect(position).center().y() - painter.drawLine(0, y, self.width(), y) + with QPainter(self) as painter: + painter.setRenderHint(QPainter.Antialiasing) + + painter.setPen(QPen(Qt.darkGreen, 1)) + painter.drawLine(self._cell_width(), 0, + self._cell_width(), self.height()) + painter.drawLine(2 * self._cell_width(), 0, + 2 * self._cell_width(), self.height()) + painter.drawLine(0, self._cell_height(), + self.width(), self._cell_height()) + painter.drawLine(0, 2 * self._cell_height(), + self.width(), 2 * self._cell_height()) + + painter.setPen(QPen(Qt.darkBlue, 2)) + + for position in range(9): + cell = self._cell_rect(position) + if self._state[position] == CROSS: + painter.drawLine(cell.topLeft(), cell.bottomRight()) + painter.drawLine(cell.topRight(), cell.bottomLeft()) + elif self._state[position] == NOUGHT: + painter.drawEllipse(cell) + + painter.setPen(QPen(Qt.yellow, 3)) + + for position in range(0, 8, 3): + if (self._state[position] != EMPTY + and self._state[position + 1] == self._state[position] + and self._state[position + 2] == self._state[position]): + y = self._cell_rect(position).center().y() + painter.drawLine(0, y, self.width(), y) + self._turn_number = 9 + + for position in range(3): + if (self._state[position] != EMPTY + and self._state[position + 3] == self._state[position] + and self._state[position + 6] == self._state[position]): + x = self._cell_rect(position).center().x() + painter.drawLine(x, 0, x, self.height()) + self._turn_number = 9 + + if (self._state[0] != EMPTY and self._state[4] == self._state[0] + and self._state[8] == self._state[0]): + painter.drawLine(0, 0, self.width(), self.height()) self._turn_number = 9 - for position in range(3): - if (self._state[position] != EMPTY - and self._state[position + 3] == self._state[position] - and self._state[position + 6] == self._state[position]): - x = self._cell_rect(position).center().x() - painter.drawLine(x, 0, x, self.height()) + if (self._state[2] != EMPTY and self._state[4] == self._state[2] + and self._state[6] == self._state[2]): + painter.drawLine(0, self.height(), self.width(), 0) self._turn_number = 9 - if (self._state[0] != EMPTY and self._state[4] == self._state[0] - and self._state[8] == self._state[0]): - painter.drawLine(0, 0, self.width(), self.height()) - self._turn_number = 9 - - if (self._state[2] != EMPTY and self._state[4] == self._state[2] - and self._state[6] == self._state[2]): - painter.drawLine(0, self.height(), self.width(), 0) - self._turn_number = 9 - - # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3. - painter.end() - def _cell_rect(self, position): h_margin = self.width() / 30 v_margin = self.height() / 30 diff --git a/examples/multimedia/audiosource/audiosource.py b/examples/multimedia/audiosource/audiosource.py index 8f11e5c4b..6d1b60919 100644 --- a/examples/multimedia/audiosource/audiosource.py +++ b/examples/multimedia/audiosource/audiosource.py @@ -112,23 +112,19 @@ class RenderArea(QWidget): self.update() def paintEvent(self, event: PySide6.QtGui.QPaintEvent) -> None: - painter = QPainter(self) - painter.setPen(Qt.black) - frame = painter.viewport() - QMargins(10, 10, 10, 10) + with QPainter(self) as painter: + painter.setPen(Qt.black) + frame = painter.viewport() - QMargins(10, 10, 10, 10) - painter.drawRect(frame) + painter.drawRect(frame) - if self.m_level == 0.0: - # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3. - painter.end() - return + if self.m_level == 0.0: + return - pos: int = round((frame.width() - 1) * self.m_level) - painter.fillRect( - frame.left() + 1, frame.top() + 1, pos, frame.height() - 1, Qt.red - ) - # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3. - painter.end() + pos: int = round((frame.width() - 1) * self.m_level) + painter.fillRect( + frame.left() + 1, frame.top() + 1, pos, frame.height() - 1, Qt.red + ) class InputTest(QWidget): diff --git a/examples/widgetbinding/wigglywidget.py b/examples/widgetbinding/wigglywidget.py index 11f4a81a5..63034dcff 100644 --- a/examples/widgetbinding/wigglywidget.py +++ b/examples/widgetbinding/wigglywidget.py @@ -89,18 +89,15 @@ class WigglyWidget(QWidget): y = (self.height() + metrics.ascent() - metrics.descent()) / 2 color = QColor() - painter = QPainter(self) - for i in range(len(self.text)): - index = (self._step + i) % 16 - color.setHsv((15 - index) * 16, 255, 191) - painter.setPen(color) - dy = (sineTable[index] * metrics.height()) / 400 - c = self._text[i] - painter.drawText(x, y - dy, str(c)) - x += metrics.horizontalAdvance(c) - - # QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3. - painter.end() + with QPainter(self) as painter: + for i in range(len(self.text)): + index = (self._step + i) % 16 + color.setHsv((15 - index) * 16, 255, 191) + painter.setPen(color) + dy = (sineTable[index] * metrics.height()) / 400 + c = self._text[i] + painter.drawText(x, y - dy, str(c)) + x += metrics.horizontalAdvance(c) def timerEvent(self, event): if event.timerId() == self._timer.timerId(): 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): diff --git a/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml b/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml index 05ef69eb9..014e01076 100644 --- a/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml +++ b/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml @@ -67,10 +67,10 @@ class Circle(QWidget): def paintEvent(self, event): - painter = QPainter(self) - painter.setPen(self.pen) - painter.setBrush(QBrush(self.color)) - painter.drawEllipse(event.rect().center(), 20, 20) + with QPainter(self) as painter: + painter.setPen(self.pen) + painter.setBrush(QBrush(self.color)) + painter.drawEllipse(event.rect().center(), 20, 20) # ... diff --git a/sources/pyside6/tests/QtGui/qpainter_test.py b/sources/pyside6/tests/QtGui/qpainter_test.py index 489a0e39b..e17ed5008 100644 --- a/sources/pyside6/tests/QtGui/qpainter_test.py +++ b/sources/pyside6/tests/QtGui/qpainter_test.py @@ -131,10 +131,9 @@ class SetBrushWithOtherArgs(UsesQGuiApplication): def testSetBrushGradient(self): image = QImage(32, 32, QImage.Format_ARGB32) - painter = QPainter(image) - gradient = QLinearGradient(0, 0, 0, 0) - painter.setBrush(gradient) - painter.end() + with QPainter(image) as painter: + gradient = QLinearGradient(0, 0, 0, 0) + painter.setBrush(gradient) if __name__ == '__main__': diff --git a/sources/pyside6/tests/QtGui/qrasterwindow_test.py b/sources/pyside6/tests/QtGui/qrasterwindow_test.py index 8224f1e35..0ac8e4db3 100644 --- a/sources/pyside6/tests/QtGui/qrasterwindow_test.py +++ b/sources/pyside6/tests/QtGui/qrasterwindow_test.py @@ -50,11 +50,10 @@ class TestRasterWindow(QRasterWindow): def paintEvent(self, event): clientRect = QRect(QPoint(0, 0), self.size()) - painter = QPainter(self) - painter.fillRect(clientRect, QColor(Qt.red)) - painter.drawStaticText(QPoint(10, 10), self.text) - # PYSIDE-535: PyPy needs an explicit end() or a context manager. - painter.end() + with QPainter(self) as painter: + painter.fillRect(clientRect, QColor(Qt.red)) + painter.drawStaticText(QPoint(10, 10), self.text) + class QRasterWindowTest(UsesQGuiApplication): def test(self): diff --git a/sources/pyside6/tests/QtWidgets/qpen_test.py b/sources/pyside6/tests/QtWidgets/qpen_test.py index 7ca73cca8..ae005bd71 100644 --- a/sources/pyside6/tests/QtWidgets/qpen_test.py +++ b/sources/pyside6/tests/QtWidgets/qpen_test.py @@ -49,13 +49,11 @@ class Painting(QWidget): self.penFromInteger = None def paintEvent(self, event): - painter = QPainter(self) - painter.setPen(Qt.NoPen) - self.penFromEnum = painter.pen() - painter.setPen(int(Qt.NoPen)) - self.penFromInteger = painter.pen() - # PYSIDE-535: PyPy needs an explicit end() or a context manager. - painter.end() + with QPainter(self) as painter: + painter.setPen(Qt.NoPen) + self.penFromEnum = painter.pen() + painter.setPen(int(Qt.NoPen)) + self.penFromInteger = painter.pen() QTimer.singleShot(20, self.close) diff --git a/sources/pyside6/tests/QtWidgets/qpicture_test.py b/sources/pyside6/tests/QtWidgets/qpicture_test.py index 7e4a6ca97..092c45bb1 100644 --- a/sources/pyside6/tests/QtWidgets/qpicture_test.py +++ b/sources/pyside6/tests/QtWidgets/qpicture_test.py @@ -51,10 +51,8 @@ class MyWidget(QWidget): class QPictureTest(UsesQApplication): def testFromData(self): picture = QPicture() - painter = QPainter() - painter.begin(picture) - painter.drawEllipse(10, 20, 80, 70) - painter.end() + with QPainter(picture) as painter: + painter.drawEllipse(10, 20, 80, 70) data = picture.data() picture2 = QPicture() |