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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy