可调整大小的PyQt小部件,显示具有固定宽高比

时间:2015-05-31 03:13:41

标签: qt pyqt qimage

在窗口小部件中显示QImage是一个常见问题。虽然这可以使用QLabel.setPixmap来完成,但生成的QLabel将具有等于像素图大小的固定大小。可以使用setScaledContents使QLabel缩放像素图并允许调整大小。但是,这将忽略图像的纵横比并缩放像素图以填充整个标签。

StackOverflow上的其他几个问题要求解决这个问题,给出的典型解决方案是使用QPixmap.scaled()重新缩放像素图,具体取决于窗口小部件的大小:

是否有不同的,更“原生”的方法来实现这一目标?

1 个答案:

答案 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()))