如何在不使用类的情况下自动调整QLabel pixmap保持率?

use*_*177 4 python resize pyqt qt-designer qlabel

我们正在使用PyQt和Qt Designer制作GUI.现在我们需要放置在QLabel中的图像(像素图)在调整窗口大小时很好地保持比例.

我一直在阅读其他问题/答案,但他们都使用扩展课程.由于我们在UI中不断进行更改,并且使用Qt Creator创建,因此会自动生成.ui和(相应的).py文件,因此,如果我没有错,使用类解决方案不是一个好的选择.我们因为每次更新ui时都应该手动更改类的名称.

是否有任何选项可以自动调整QLAbel中的像素图,保持比率并避免使用扩展的clases?

谢谢.

ekh*_*oro 6

有几种方法可以做到这一点.

首先,您可以将Qt Designer中的QLabel提升为使用python编写的自定义子类.右键单击QLabel并选择"Promote to ...",然后为该类命名(例如"ScaledLabel")并将头文件设置为将从其导入自定义子类的python模块(例如'mylib.班).

然后,自定义子类将重新实现resizeEvent如下:

class ScaledLabel(QtGui.QLabel):
    def __init__(self, *args, **kwargs):
        QtGui.QLabel.__init__(self)
        self._pixmap = QtGui.QPixmap(self.pixmap())

    def resizeEvent(self, event):
        self.setPixmap(self._pixmap.scaled(
            self.width(), self.height(),
            QtCore.Qt.KeepAspectRatio))
Run Code Online (Sandbox Code Playgroud)

为了使其正常工作,QLabel应将其大小策略设置为扩展或最小扩展,并且最小大小应设置为小的非零值(因此可以缩小图像).

第二种方法避免使用子类并使用事件过滤器来处理resize事件:

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        ...
        self._pixmap = QtGui.QPixmap(self.label.pixmap())
        self.label.installEventFilter(self)

    def eventFilter(self, widget, event):
        if (event.type() == QtCore.QEvent.Resize and
            widget is self.label):
            self.label.setPixmap(self._pixmap.scaled(
                self.label.width(), self.label.height(),
                QtCore.Qt.KeepAspectRatio))
            return True
        return QtGui.QMainWindow.eventFilter(self, widget, event)
Run Code Online (Sandbox Code Playgroud)