在PYQT5中的Qlabel上设置调整大小事件



我无法为自定义QT类创建功能大小的事件。

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

我尝试使用resizeevent函数和事件窗口函数进行操作,但无法正常工作。

我的第一个选择是重新设计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

我想学习如何正确地执行这两种方式:)谢谢!

感谢@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不断触发。

,所以我发现了另一个问题的问题。由于我将标签调整在Resizeevent函数中,从而触发另一个resizeevent,并且该程序被卡在无限循环中。我发现避免这种情况的唯一方法是重写班级的油漆。

这是我新课的代码,适合任何有兴趣的人。这个想法是在保持视频大小的同时调整视频大小,并在调整大小时发出信号,以便在调整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() 

最新更新