首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在保持纵横比的同时调整QPixmap的大小

在保持纵横比的同时调整QPixmap的大小
EN

Stack Overflow用户
提问于 2014-06-08 22:02:09
回答 2查看 9.5K关注 0票数 2

为了在调整QDialog大小时保持图像的宽高比不变,我尝试了以下方法:

代码语言:javascript
运行
复制
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似乎缺少一些东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-09 14:43:57

对于这个问题,我有一个有效的例子。不要使用setPixmap方法在widget上绘制像素图,可以通过重新实现widget的paintEvent来绘制。

代码语言:javascript
运行
复制
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_())

复制整个代码并按原样运行。然后尝试缩放显示的窗口。然后理解Label类中的paintEvent。别忘了在Main类的__init__中更改一些已存在的png图像的路径。

用于更改镜像的更新

要更改图像,可以向Label类添加一个changePixmap(self, img)方法,并在要更改像素图的事件上调用它。

代码语言:javascript
运行
复制
...
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类调用该方法。

代码语言:javascript
运行
复制
...
self.label = Label('/path/to/image.png')
...

然后在Main类中的任何事件中,调用self.label.changePixmap('path/to/new/image.png')

票数 3
EN

Stack Overflow用户

发布于 2017-02-16 23:29:17

你的onResize是一个自由函数,而不是Dialog类的方法(看看缩进,没有'self'),所以它永远不会被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24106903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档