在窗口小部件中显示QImage是一个常见问题。虽然这可以使用QLabel.setPixmap
来完成,但生成的QLabel将具有等于像素图大小的固定大小。可以使用setScaledContents
使QLabel缩放像素图并允许调整大小。但是,这将忽略图像的纵横比并缩放像素图以填充整个标签。
StackOverflow上的其他几个问题要求解决这个问题,给出的典型解决方案是使用QPixmap.scaled()
重新缩放像素图,具体取决于窗口小部件的大小:
是否有不同的,更“原生”的方法来实现这一目标?
答案 0 :(得分:2)
以下基于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()))