首页 > 解决方案 > 在 Pyqt5 中的 QLabel 上设置调整大小事件

问题描述

我无法为自定义 QT 类创建有效的调整大小事件。

我的 GUI 的一部分是视频播放器。如果我正在调整 GUI 的大小,我希望视频播放器停止播放视频。从论坛中,我了解到这样做的方法是创建自定义 QLabel 并编辑其调整大小事件。

我尝试使用 resizeEvent 函数和 eventFilter 函数来做到这一点,但未能使其正常工作。

我的第一个选择是重新设计 resizeEvent。不幸的是,当我调整窗口大小时,resizeEvent 会不断触发,所以我陷入了“Inside resizeEvent”的无限打印输出


class VideoPlayer(QtWidgets.QLabel):
    ResizeSignal = QtCore.pyqtSignal(int)
    def __init__(self):
        super().__init__()  
        self.setSizePolicy(QtWidgets.QSizePolicy.Ignored, 
                                      QtWidgets.QSizePolicy.Ignored)
        self.resize(800, 450)
        self.setFrameShape(QtWidgets.QFrame.Box)
        self.setLineWidth(3)
        self.setText("")
        self.pix = QPixmap()
        self.setPixmap(self.pix)        

    def resizeEvent(self, event):
        if not self.pix.isNull():
            print(' Inside resizeEvent')
            self.ResizeSignal.emit(1) # Signal emitted when Qlabel is resized. 
            pixmap = self.pix.scaled(self.width(), self.height(),Qt.KeepAspectRatio)
            self.setPixmap(pixmap)
            self.resize(pixmap.width(), pixmap.height())

我的另一个选择是尝试执行 eventFilter 选项。我注释掉了 resizeEvent 并将这个函数添加到了 VideoPlayer 类中。但是,当我调整大小时,这根本不会触发。

def eventFilter(self, event):
    if (event.type() == QtCore.QEvent.Resize):
        print( 'Inside event Filter')
        self.ResizeSignal.emit(1)
    return True

我想学习如何正确地做到这一点:) 谢谢!

标签: pythonpyqt5

解决方案


感谢@eyllanesc,我能够回答问题的第 2 部分。

eventFilter功能更改为此

    def eventFilter(self, obj, event):
        if (event.type() == QtCore.QEvent.Resize):
            print( 'Inside event Filter')
        return super().eventFilter(obj, event)

并添加self.installEventFilter(self)__init__, 成功了。

仍在试图弄清楚为什么resizeEvent不断被触发。


推荐阅读