Python 通过更改窗口大小调整包含图像的多个标签的大小
我有一个窗口,它有六个对称放置的标签,所有标签都显示图像(在布局的帮助下使用qt designer设计)。我想根据不断变化的窗口大小调整这些图像的大小。我在前面的问题中找到了一些帮助,如: 目前,在我的例子中使用resizeEvent()不会根据resize函数收缩图像。我的表单窗口的显示已经触发该按钮,从而使该按钮无效。最重要的是,结果执行非常缓慢。我的图像尺寸为2058x1536,显示透明 我的qt设计器代码如下所示:Python 通过更改窗口大小调整包含图像的多个标签的大小,python,python-3.x,pyqt,pyqt5,qlabel,Python,Python 3.x,Pyqt,Pyqt5,Qlabel,我有一个窗口,它有六个对称放置的标签,所有标签都显示图像(在布局的帮助下使用qt designer设计)。我想根据不断变化的窗口大小调整这些图像的大小。我在前面的问题中找到了一些帮助,如: 目前,在我的例子中使用resizeEvent()不会根据resize函数收缩图像。我的表单窗口的显示已经触发该按钮,从而使该按钮无效。最重要的是,结果执行非常缓慢。我的图像尺寸为2058x1536,显示透明 我的qt设计器代码如下所示: 是否有任何解决方案可以更快地运行此代码?例如,我想在我的窗口边缘单击鼠标
是否有任何解决方案可以更快地运行此代码?例如,我想在我的窗口边缘单击鼠标时使所有标签变为空白,然后释放鼠标按钮后图像重新出现。这看起来不太整洁。此外,我不确定使用paintEvent是否可以减少我的延迟。感谢您的建议和评论。QLabel具有scaledContents属性,允许图像自动缩放:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_ImageCrop_Test
class ImageCrop(QtWidgets.QMainWindow, Ui_ImageCrop_Test.Ui_MainWindow):
def __init__(self, parent=None):
super(ImageCrop, self).__init__()
self.setupUi(self)
self.pushButton_1.clicked.connect(self.click1)
self.transparency = 220
with open("Img_files.txt") as file:
self.img_files = file.read().splitlines()
@QtCore.pyqtSlot()
def click1(self):
labels = [self.label_1, self.label_2, self.label_3,
self.label_4, self.label_5, self.label_6]
for label, filename in zip(labels, self.img_files):
image = QtGui.QImage(filename)
image = image.convertToFormat(QtGui.QImage.Format_ARGB8565_Premultiplied)
p = QtGui.QPainter(image)
p.setCompositionMode(QtGui.QPainter.CompositionMode_DestinationIn)
p.fillRect(image.rect(), QtGui.QColor(0, 0, 0, self.transparency))
p.end()
pixmap = QtGui.QPixmap(image)
w = int(label.width() - 4.0)
h = int(label.height() - 4.0)
smaller_pixmap = pixmap.scaled(w, h, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.FastTransformation)
label.setPixmap(smaller_pixmap)
label.setScaledContents(True)
def main():
app = QtWidgets.QApplication(sys.argv)
form1 = ImageCrop()
form1.show()
app.exec_()
if __name__ == '__main__': main()
QLabel具有scaledContents属性,允许图像自动缩放:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_ImageCrop_Test
class ImageCrop(QtWidgets.QMainWindow, Ui_ImageCrop_Test.Ui_MainWindow):
def __init__(self, parent=None):
super(ImageCrop, self).__init__()
self.setupUi(self)
self.pushButton_1.clicked.connect(self.click1)
self.transparency = 220
with open("Img_files.txt") as file:
self.img_files = file.read().splitlines()
@QtCore.pyqtSlot()
def click1(self):
labels = [self.label_1, self.label_2, self.label_3,
self.label_4, self.label_5, self.label_6]
for label, filename in zip(labels, self.img_files):
image = QtGui.QImage(filename)
image = image.convertToFormat(QtGui.QImage.Format_ARGB8565_Premultiplied)
p = QtGui.QPainter(image)
p.setCompositionMode(QtGui.QPainter.CompositionMode_DestinationIn)
p.fillRect(image.rect(), QtGui.QColor(0, 0, 0, self.transparency))
p.end()
pixmap = QtGui.QPixmap(image)
w = int(label.width() - 4.0)
h = int(label.height() - 4.0)
smaller_pixmap = pixmap.scaled(w, h, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.FastTransformation)
label.setPixmap(smaller_pixmap)
label.setScaledContents(True)
def main():
app = QtWidgets.QApplication(sys.argv)
form1 = ImageCrop()
form1.show()
app.exec_()
if __name__ == '__main__': main()
label.setScaledContents(True)是解决方案。此外,将这些标签放入列表会缩短代码。label.setScaledContents(True)是解决方案。此外,将这些标签编入列表可以缩短代码。