在Pyqt5中的QLabel上设置调整大小事件

时间:2019-05-22 16:38:14

标签: python pyqt5

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

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

我尝试使用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

我想学习两种方法的正确用法:)谢谢!

2 个答案:

答案 0 :(得分:0)

由于@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不断被触发是连续的。

答案 1 :(得分:0)

所以我想出了另一个问题。由于我在resizeEvent函数中调整了标签的大小,该函数触发了另一个resizeEvent,因此程序陷入了无限循环。我发现避免这种情况的唯一方法是重写该类中的paintEvent。

这是我感兴趣的任何人的新课程的代码。想法是在保持视频的宽高比的同时调整视频大小,并在调整大小时发出信号,以便在调整UI大小时可以停止视频。

class GameFrame(QtWidgets.QLabel):
    ResizeSignal = QtCore.pyqtSignal(int)
    def __init__(self, width,height):
        super().__init__()  
        self.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored)
        self.setGeometry(0,0,width, height)
        self.setFrameShape(QtWidgets.QFrame.Box)
        self.setLineWidth(3)
        self.setText("")
        self.pix = QPixmap()
        self.setPixmap(self.pix)
        self.installEventFilter(self)

    def eventFilter(self, obj, event):
        if (event.type() == QtCore.QEvent.Resize):
            if not self.pix.isNull():                
                pixmap = self.pix.scaled(self.width(), self.height(),Qt.KeepAspectRatio)                  
                if pixmap.width()!=self.width() or pixmap.height()!=self.height():                                        
                    self.ResizeSignal.emit(1)                    
        return super().eventFilter(obj, event)

    def paintEvent(self, event):        
        if not self.pix.isNull(): 
            size = self.size()
            painter = QPainter(self)
            point = QtCore.QPoint(0,0)
            scaledPix = self.pix.scaled(size, Qt.KeepAspectRatio, transformMode = Qt.FastTransformation)
            # start painting the label from left upper corner
            point.setX((size.width() - scaledPix.width())/2)
            point.setY((size.height() - scaledPix.height())/2)
            painter.drawPixmap(point,scaledPix)

    def changePixmap(self, img):
        self.pix = img
        self.repaint()