2015-05-31 1 views
1

Общей проблемой является отображение QImage в виджетах. Хотя это можно сделать с помощью QLabel.setPixmap, полученный QLabel будет иметь фиксированный размер, равный размеру pixmap. Можно использовать setScaledContents, чтобы сделать QLabel масштабированием pixmap и разрешить изменение размера. Тем не менее, это будет игнорировать соотношение сторон изображения и масштабировать pixmap, чтобы заполнить всю метку.Редактируемый виджет PyQt, отображающий изображение с фиксированным соотношением сторон

Некоторые другие вопросы по StackOverflow просят решения этой проблемы, а типичное решение дано, чтобы повторно масштабировать растровое изображение, используя QPixmap.scaled() в зависимости от размера виджета:

есть другой, более "родной" способ достижения это?

ответ

1

Следующий виджет на основе QLabel, который сохранит соотношение сторон присвоенной ему карты изображений. Он использует метод heighForWidth для возврата предпочтительной высоты виджета с учетом его ширины. Таким образом, виджет естественным образом учитывает соотношение сторон растровой карты при изменении размера и масштабирует ее соответственно. Протестировано в PyQt5.

class ImageWidget(QLabel): 

    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.setScaledContents(True) 

    def hasHeightForWidth(self): 
     return self.pixmap() is not None 

    def heightForWidth(self, w): 
     if self.pixmap(): 
      return int(w * (self.pixmap().height()/self.pixmap().width()))