Если для метки не установлен минимальный размер, вместо него всегда будет использоваться размер растрового изображения. Чтобы избежать этого, вы можете просто установить произвольный минимальный размер:
def showDotPlot(self):
dotPng = QPixmap('big1.jpg')
self.dotPlot.setPixmap(dotPng)
self.dotPlot.setMinimumSize(1, 1)
self.dotPlot.setScaledContents(True)
К сожалению, это приведет к растянутому изображению:
В этом случае единственной альтернативой является создание подклассов.
В этом примере я наследую от QLabel, но если вам не нужны все функции, предоставляемые этим классом, достаточно использовать стандартный QWidget (но вы можете нужно добавить методы для настройки растрового изображения и выравнивания).
class ScaledPixmapLabel(QLabel):
scaled = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# if no minimum size is set, it will always use the image size
self.setMinimumSize(1, 1)
def resizeEvent(self, event):
if self.pixmap() and not self.pixmap().isNull():
self.scaled = self.pixmap().scaled(
self.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
def paintEvent(self, event):
if self.pixmap() and not self.pixmap().isNull():
if not self.scaled:
self.scaled = self.pixmap().scaled(
self.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
# the available rectangle
available = self.rect()
# the pixmap rectangle that will be used as a reference to paint into
rect = self.scaled.rect()
# move to the center of the available rectangle
rect.moveCenter(available.center())
# then move the rectangle according to the alingment
align = self.alignment()
if align & Qt.AlignLeft:
rect.moveLeft(available.left())
elif align & Qt.AlignRight:
rect.moveRight(available.right())
if align & Qt.AlignTop:
rect.moveTop(available.top())
elif align & Qt.AlignBottom:
rect.moveBottom(available.bottom())
qp = QPainter(self)
qp.drawPixmap(rect, self.scaled)
class goShow(QMainWindow):
def initGUI(self):
# ...
self.dotPlot = ScaledPixmapLabel(alignment=Qt.AlignCenter)
self.barPlot = ScaledPixmapLabel(alignment=Qt.AlignCenter)
# ...
def showDotPlot(self):
dotPng = QPixmap(os.path.join('F:\\job\\projects\\snpExplore\\test\\res_temp',"dotplot.png"))
self.dotPlot.setPixmap(dotPng)
# no need to set other options