python - 如何在不使用类的情况下自动调整 QLabel 像素图保持比率?

标签 python pyqt resize qt-designer qlabel

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

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

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

谢谢。

最佳答案

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

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

然后自定义子类将像这样重新实现 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))

为了使其正常工作,QLabel 应将其大小策略设置为扩展或最小扩展,并且最小大小应设置为较小的非零值(以便图像可以按比例缩小)。

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

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)

关于python - 如何在不使用类的情况下自动调整 QLabel 像素图保持比率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21041941/

相关文章:

python - 如何让数据生成器更高效?

python - 在解析模块中,如何从解析值中去除空格?

Python:检测python工具的安装位置

python - 改变标题栏的颜色

调整 IE 大小时 HTML 列表项换行

objective-c - 计时器因调整窗口大小而延迟

python - 如何获取复选框值保存到文本文件中?

python - Django 模型、添加新值(value)、迁移

python - 如何检查 QTreeWidget 项目的状态?

python - 如何制作没有标题栏的选项卡 Pane ?