我无法为自定义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()