重新加载时,`QPixmap` 和 `QLabel` 大小略有增加

`QPixmap` and `QLabel` size slightly increases when reloading

当我尝试制作我的应用程序时,我在 QLabel 中重新显示新的 QPixmap 时偶然发现了这种意外行为。我试图简化代码并最终得到下面的代码。我还附上了该行为的视频。

我在这里提供了一个可复制的示例(它只需要在同一目录中有一些 .jpg 文件):

import sys
import os
import random

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel, QSizePolicy
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap

class AppDemo(QWidget):
    def __init__(self):
        super().__init__()
        
        self.setGeometry(200, 200, 400, 400)
        current_working_dir = os.path.abspath('')
        dir_files = os.listdir(current_working_dir)

        # Saving .jpg from the dir
        self.picture = []
        for file in dir_files:
            if file.endswith(".jpg"):
                self.picture.append(file)
        
        self.label = QLabel()
        self.label.setStyleSheet("border: 1px solid black;")  # <- for the debugging
        self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
        
        self.label.setPixmap(self.random_picture_selector())

        button = QPushButton("Reload Picture")
        button.clicked.connect(self.reload_picture)

        layout = QVBoxLayout(self)
        layout.addWidget(button)
        layout.addWidget(self.label)

    def reload_picture(self):
        self.label.setPixmap(self.random_picture_selector())

    def random_picture_selector(self):
        rnd_picture = random.choice(self.picture)
        pixmap = QPixmap(rnd_picture)
        pixmap = pixmap.scaledToWidth(self.label.width(), Qt.SmoothTransformation)
        # pixmap = pixmap.scaled(self.label.width(), self.label.height(), Qt.KeepAspectRatio) # <- even this is not working
        return pixmap

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = AppDemo()
    demo.show()
    sys.exit(app.exec_())

附加信息:

在简化代码时,我意识到删除以下这些行后问题就消失了。 (虽然我不是很确定这部分代码是否真的导致了问题)

        pixmap = pixmap.scaledToWidth(self.label.width(), Qt.SmoothTransformation)
        # pixmap = pixmap.scaled(self.label.width(), self.label.height(), Qt.KeepAspectRatio) # <- even this is not working

即使在查找 QPixmapQLabel.

的文档后,我真的不知道是什么导致了问题

问题是由样式sheet边框引起的。如果在设置像素图后打印像素图和标签尺寸,你会看到标签宽度增加了2个像素,这是左右边框的总和。

您要么删除边框,要么使用 contentsRect():

width = self.label.contentsRect().width()
pixmap = pixmap.scaledToWidth(width, Qt.SmoothTransformation)

在 Qt 样式 sheet 文档中阅读有关 Box Model 的更多信息。