获取PyQt中QScrollArea中视口的大小

时间:2016-01-13 10:18:20

标签: python pyqt pyqt5

我们正在编写一个程序来显示来自显微镜的视频。视频大小为2208 * 1648.这比可用的屏幕大小要大得多。所以我使用QScrollArea来显示它。

    self.scrollArea = QScrollArea(self)
    self.scrollArea.setBackgroundRole(QPalette.Dark)
    self.scrollArea.setWidget(self.imageLabel)
    self.scrollArea.setWidgetResizable(True)

这会将视频缩放到视口的大小。因此,视频完全显示在没有滚动条的scrollarea的视口中。现在必须可以放大视频的特定部分。因此可以输入缩放因子。完成后,执行以下代码:

def scaleImage(self, factor):
    self.scrollArea.setWidgetResizable(False)
    self.imageLabel.resize(factor * self.imageLabel.pixmap().size())

    self.adjustScrollBar(self.scrollArea.horizontalScrollBar(), factor)
    self.adjustScrollBar(self.scrollArea.verticalScrollBar(), factor)

显示实际视频时,使用以下功能将图像发送到标签

def set_image(self, pixmap):
    self.imageLabel.set_image(pixmap, self.current_width, self.current_height)
    self.imageLabel.resize(self.current_zoomfactor * self.imageLabel.pixmap().size())

这很有效。但是有几个问题: 1. setWidgetResizable不尊重aspectratio 2.当用户缩小时,最终图片变得比视口小,这不是我想要的。 3.我尝试使用

获取视口的大小
sizehint = self.scrollArea.viewportSizeHint()

然后我得到一个看起来或多或少正确的大小,但是当我调整窗口大小时,结果不会改变。

提前多多感谢

1 个答案:

答案 0 :(得分:1)

在调整大小之前,计算缩放系数:

def handle_min_zoomfactor(self, new_zoomfactor):
    self.minimal_zoom  = self.scrollArea.viewport().width() / self.sensor_width
    if new_zoomfactor < self.minimal_zoom:
        new_zoomfactor = self.minimal_zoom
    if new_zoomfactor > 1.0:
        new_zoomfactor = 1

之后调用scaleImage。