重新加载时,`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
即使在查找 QPixmap
和 QLabel
.
的文档后,我真的不知道是什么导致了问题
问题是由样式sheet边框引起的。如果在设置像素图后打印像素图和标签尺寸,你会看到标签宽度增加了2个像素,这是左右边框的总和。
您要么删除边框,要么使用 contentsRect()
:
width = self.label.contentsRect().width()
pixmap = pixmap.scaledToWidth(width, Qt.SmoothTransformation)
在 Qt 样式 sheet 文档中阅读有关 Box Model 的更多信息。
当我尝试制作我的应用程序时,我在 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
即使在查找 QPixmap
和 QLabel
.
问题是由样式sheet边框引起的。如果在设置像素图后打印像素图和标签尺寸,你会看到标签宽度增加了2个像素,这是左右边框的总和。
您要么删除边框,要么使用 contentsRect()
:
width = self.label.contentsRect().width()
pixmap = pixmap.scaledToWidth(width, Qt.SmoothTransformation)
在 Qt 样式 sheet 文档中阅读有关 Box Model 的更多信息。