我无法为自定义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
我想学习两种方法的正确用法:)谢谢!
答案 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()