要在调整QDialog
大小时保持图像的宽高比固定,我尝试了以下操作:
import os, sys
from PyQt5.QtWidgets import QApplication, QDialog, QGridLayout, QLabel
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.pic = QLabel()
self.pic.resizeEvent = onResize
self.pic.setPixmap(QPixmap(os.getcwd() + "/images/1.jpg").scaled(300, 200, Qt.KeepAspectRatio,Qt.SmoothTransformation))
layout = QGridLayout()
layout.addWidget(self.pic, 1, 0)
self.setLayout(layout)
def onResize(event):
size = dialog.pic.size()
dialog.pic.setPixmap(QPixmap(os.getcwd() + "/images/1.jpg").scaled(size, Qt.KeepAspectRatio, Qt.SmoothTransformation))
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Dialog()
dialog.show()
sys.exit(app.exec_())
正如所料,图像以300x200开头。它可以根据需要放大,但尺寸根本不能减小(放大后降至300x200)。 onResize
似乎缺少一些东西。
答案 0 :(得分:1)
我有一个解决这个问题的工作示例。不要使用setPixmap
方法在小部件上绘制像素图,通过重新实现小部件的paintEvent
来绘制它。
from PyQt4 import QtGui, QtCore
import sys
from PyQt4.QtCore import Qt
class Label(QtGui.QLabel):
def __init__(self, img):
super(Label, self).__init__()
self.setFrameStyle(QtGui.QFrame.StyledPanel)
self.pixmap = QtGui.QPixmap(img)
def paintEvent(self, event):
size = self.size()
painter = QtGui.QPainter(self)
point = QtCore.QPoint(0,0)
scaledPix = self.pixmap.scaled(size, Qt.KeepAspectRatio, transformMode = Qt.SmoothTransformation)
# start painting the label from left upper corner
point.setX((size.width() - scaledPix.width())/2)
point.setY((size.height() - scaledPix.height())/2)
print point.x(), ' ', point.y()
painter.drawPixmap(point, scaledPix)
class Main(QtGui.QWidget):
def __init__(self):
super(Main, self).__init__()
layout = QtGui.QGridLayout()
label = Label(r"/path/to/some/image.png")
layout.addWidget(label)
layout.setRowStretch(0,1)
layout.setColumnStretch(0,1)
self.setLayout(layout)
self.show()
if __name__ =="__main__":
app = QtGui.QApplication(sys.argv)
widget = Main()
sys.exit(app.exec_())
复制整个代码并按原样运行。然后尝试缩放出现的窗口。然后了解paintEvent
课程中的Label
。别忘了在__init__
类Main
中更改现有png图像的路径。
更新更改图片:
要更改图像,您可以将方法changePixmap(self, img)
添加到Label
类,并在要更改像素图的事件上调用它。
...
def changePixmap(self, img):
self.pixmap = QtGui.QPixmap(img)
self.repaint() # repaint() will trigger the paintEvent(self, event), this way the new pixmap will be drawn on the label
您可以通过在成员变量中保存对Main
类的引用来从Label
类调用该方法。
...
self.label = Label('/path/to/image.png')
...
然后在Main
课程中的任何活动内,请致电self.label.changePixmap('path/to/new/image.png')
答案 1 :(得分:0)
你的onResize是一个自由函数,而不是类Dialog的方法(查看缩进,以及没有' self')所以它永远不会被调用。