我需要关于QT/PyQt中布局的一些建议。
我的目标是显示一张图片,居中并按比例缩放,尽可能地占据空间。可以通过以下方式轻松实现:
class Demo(QWidget):
def __init__(self) -> None:
super().__init__()
self.setWindowState(Qt.WindowMaximized)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.button = QPushButton("Next image")
self.label = QLabel()
self.label.setStyleSheet("QLabel { background-color : red; }")
self.label.setAlignment(Qt.AlignCenter)
self.layout.addWidget(self.label)
self.layout.addWidget(self.button)
self.button.clicked.connect(self.showImage)
self.show()
def showImage(self):
self.pixmap = QPixmap("image.jpg")
scaled = self.pixmap.scaled(self.label.size(), Qt.KeepAspectRatio)
self.label.setPixmap(scaled)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Demo()
sys.exit(app.exec_())
这样做的问题是,图片将会居中显示在标签上,周围会有很多“过剩的标签”,如截图所示,红色部分。 但我需要标签的大小与图像完全相同。我想在图像上进行一些橡皮筋选择(选择框以供稍后在retinanet训练中使用),并计算正确的框大小,我需要映射到全局和从全局映射回来。我无法从Pixmap本身执行此操作(因为它不是小部件),当我从Label执行此操作时,我得到的值是错误的,因为它比实际图像大。
现在,我可以使用GridLayout或HBoxLayout与SpacerItems。问题在于逻辑。Label的大小(以及SpacerItems)在UI加载时确定。当我稍后动态添加图像时,即使它可以更大,它也会缩放到Label的大小,只要SpacerItems“让路”给Label。结果是,我不是左右有“太多的Label”,而是上下有“太多的Label”。我希望你明白我的意思。
我目前所做的是:
- 将窗口调整为屏幕分辨率
- 添加(缩放的)图像
- 调整大小(0,0)
编辑: 非常感谢您的回答,@eyllanesc :-) 我尝试了一下,对于第一张图片它确实做到了我想要的效果。我忘了提到的是,当第一张图片被正确地"rubberbanded"之后,点击"Next"按钮,会显示另一张图片。如果这张图片比实际的Label小(或者横向而不是纵向),则标签会缩小。看哪,经过一些具有不同分辨率和方向的图像之后,标签继续缩小...