碰到一个需要将numpy数组(图片)显示在pyqt5的窗口中,上网查到的一般显示出来图片周围会有大片的空白。以下代码是将qt5的窗口适应到图片。
# !/usr/bin/env python
# -*- utf-8 -*-
import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
# from PyQt5 import QtCore
from PyQt5.QtWidgets import QWidget, QSizePolicy
import numpy as np
class PltCanvas(FigureCanvas):
def __init__(self, parent = None, width = 320, height = 240, dpi = 100):
figure = Figure(figsize=(width, height), dpi=dpi)
figure.set_tight_layout({'pad':0, 'w_pad': 0, 'h_pad': 0})
figure.set_constrained_layout_pads(w_pad=0, h_pad=0, wspace=0, hspace=0)
self.subplot = figure.add_subplot(111)
self.compute_initial_figure()
FigureCanvas.__init__(self, figure)
self.setParent(parent)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
self.subplot.imshow = self._imshow(self.subplot.imshow)
img = np.zeros([height, width])
self.subplot.imshow(img)
def _imshow(self, func):
def wraper(img, **kargs):
self.subplot.clear()
if not kargs.has_key('aspect'):
kargs['aspect'] = 'auto'
img = func(img, **kargs)
self.subplot.set_axis_off()
self.subplot.set_xticks([])
self.subplot.set_yticks([])
return img
return wraper
def compute_initial_figure(self):
pass