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

Skip to content

Commit 8d49327

Browse files
authored
Merge pull request #17565 from tacaswell/fix_new_qt
FIX: support Qt 5.15
2 parents 2c54fbf + 258832a commit 8d49327

File tree

2 files changed

+41
-40
lines changed

2 files changed

+41
-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 = [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: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -38,45 +38,46 @@ 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
43+
# by 1, so use 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
47+
# QT5's coords)
48+
width = rect.width() * self._dpi_ratio
49+
height = rect.height() * self._dpi_ratio
50+
left, top = self.mouseEventCoords(rect.topLeft())
51+
# shift the "top" by the height of the image to get the
52+
# correct corner for our coordinate system
53+
bottom = top - height
54+
# same with the right side of the image
55+
right = left + width
56+
# create a buffer using the image bounding box
57+
bbox = Bbox([[left, bottom], [right, top]])
58+
reg = self.copy_from_bbox(bbox)
59+
buf = cbook._unmultiplied_rgba8888_to_premultiplied_argb32(
60+
memoryview(reg))
61+
62+
# clear the widget canvas
63+
painter.eraseRect(rect)
64+
65+
qimage = QtGui.QImage(buf, buf.shape[1], buf.shape[0],
66+
QtGui.QImage.Format_ARGB32_Premultiplied)
67+
if hasattr(qimage, 'setDevicePixelRatio'):
68+
# Not available on Qt4 or some older Qt5.
69+
qimage.setDevicePixelRatio(self._dpi_ratio)
70+
# set origin using original QT coordinates
71+
origin = QtCore.QPoint(rect.left(), rect.top())
72+
painter.drawImage(origin, qimage)
73+
# Adjust the buf reference count to work around a memory
74+
# leak bug in QImage under PySide on Python 3.
75+
if QT_API in ('PySide', 'PySide2'):
76+
ctypes.c_long.from_address(id(buf)).value = 1
77+
78+
self._draw_rect_callback(painter)
79+
finally:
80+
painter.end()
8081

8182
def print_figure(self, *args, **kwargs):
8283
super().print_figure(*args, **kwargs)

0 commit comments

Comments
 (0)