我们正在编写一个程序来显示来自显微镜的视频。视频大小为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()
然后我得到一个看起来或多或少正确的大小,但是当我调整窗口大小时,结果不会改变。
提前多多感谢
答案 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。