Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit feb16f1

Browse files
committed
FIX: support Qt 5.15
- QPainter.drawLine is now picky about float vs int - be more careful that we close the Qpainter out
1 parent 4356b67 commit feb16f1

File tree

2 files changed

+40
-40
lines changed

2 files changed

+40
-40
lines changed

lib/matplotlib/backends/backend_qt5.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ def drawRectangle(self, rect):
486486
# Draw the zoom rectangle to the QPainter. _draw_rect_callback needs
487487
# to be called at the end of paintEvent.
488488
if rect is not None:
489-
x0, y0, w, h = [pt / self._dpi_ratio for pt in rect]
489+
x0, y0, w, h = map(int, [pt / self._dpi_ratio for pt in rect])
490490
x1 = x0 + w
491491
y1 = y0 + h
492492
def _draw_rect_callback(painter):

lib/matplotlib/backends/backend_qt5agg.py

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -38,45 +38,45 @@ def paintEvent(self, event):
3838
return
3939

4040
painter = QtGui.QPainter(self)
41-
42-
# See documentation of QRect: bottom() and right() are off by 1, so use
43-
# left() + width() and top() + height().
44-
rect = event.rect()
45-
# scale rect dimensions using the screen dpi ratio to get
46-
# correct values for the Figure coordinates (rather than QT5's coords)
47-
width = rect.width() * self._dpi_ratio
48-
height = rect.height() * self._dpi_ratio
49-
left, top = self.mouseEventCoords(rect.topLeft())
50-
# shift the "top" by the height of the image to get the
51-
# correct corner for our coordinate system
52-
bottom = top - height
53-
# same with the right side of the image
54-
right = left + width
55-
# create a buffer using the image bounding box
56-
bbox = Bbox([[left, bottom], [right, top]])
57-
reg = self.copy_from_bbox(bbox)
58-
buf = cbook._unmultiplied_rgba8888_to_premultiplied_argb32(
59-
memoryview(reg))
60-
61-
# clear the widget canvas
62-
painter.eraseRect(rect)
63-
64-
qimage = QtGui.QImage(buf, buf.shape[1], buf.shape[0],
65-
QtGui.QImage.Format_ARGB32_Premultiplied)
66-
if hasattr(qimage, 'setDevicePixelRatio'):
67-
# Not available on Qt4 or some older Qt5.
68-
qimage.setDevicePixelRatio(self._dpi_ratio)
69-
# set origin using original QT coordinates
70-
origin = QtCore.QPoint(rect.left(), rect.top())
71-
painter.drawImage(origin, qimage)
72-
# Adjust the buf reference count to work around a memory
73-
# leak bug in QImage under PySide on Python 3.
74-
if QT_API in ('PySide', 'PySide2'):
75-
ctypes.c_long.from_address(id(buf)).value = 1
76-
77-
self._draw_rect_callback(painter)
78-
79-
painter.end()
41+
try:
42+
# See documentation of QRect: bottom() and right() are off by 1, so use
43+
# left() + width() and top() + height().
44+
rect = event.rect()
45+
# scale rect dimensions using the screen dpi ratio to get
46+
# correct values for the Figure coordinates (rather than QT5's coords)
47+
width = rect.width() * self._dpi_ratio
48+
height = rect.height() * self._dpi_ratio
49+
left, top = self.mouseEventCoords(rect.topLeft())
50+
# shift the "top" by the height of the image to get the
51+
# correct corner for our coordinate system
52+
bottom = top - height
53+
# same with the right side of the image
54+
right = left + width
55+
# create a buffer using the image bounding box
56+
bbox = Bbox([[left, bottom], [right, top]])
57+
reg = self.copy_from_bbox(bbox)
58+
buf = cbook._unmultiplied_rgba8888_to_premultiplied_argb32(
59+
memoryview(reg))
60+
61+
# clear the widget canvas
62+
painter.eraseRect(rect)
63+
64+
qimage = QtGui.QImage(buf, buf.shape[1], buf.shape[0],
65+
QtGui.QImage.Format_ARGB32_Premultiplied)
66+
if hasattr(qimage, 'setDevicePixelRatio'):
67+
# Not available on Qt4 or some older Qt5.
68+
qimage.setDevicePixelRatio(self._dpi_ratio)
69+
# set origin using original QT coordinates
70+
origin = QtCore.QPoint(rect.left(), rect.top())
71+
painter.drawImage(origin, qimage)
72+
# Adjust the buf reference count to work around a memory
73+
# leak bug in QImage under PySide on Python 3.
74+
if QT_API in ('PySide', 'PySide2'):
75+
ctypes.c_long.from_address(id(buf)).value = 1
76+
77+
self._draw_rect_callback(painter)
78+
finally:
79+
painter.end()
8080

8181
def print_figure(self, *args, **kwargs):
8282
super().print_figure(*args, **kwargs)

0 commit comments

Comments
 (0)