0

我想dropEventQVideoWidget. 我知道播放部分,我的问题是 QVideoWidget 没有像其他小部件一样接收 dropEvent 。我想知道这是一个错误,或者我错过了一些东西。

一切正常,所有三个事件都被调用:

import sys
from PySide6.QtCore import QSize
from PySide6.QtMultimediaWidgets import QVideoWidget
from PySide6.QtWidgets import QApplication, QWidget

class MyWidget(QWidget):
    def __init__(self,*args):
        super().__init__(*args)

        self.setAcceptDrops(True)
        self.setMinimumSize(QSize(600,400))

    def dragEnterEvent(self, event):
        print(event)
        event.accept()

    def dragMoveEvent(self, event):
        print(event)
        event.accept()

    def dropEvent(self, event):
        print(event)

if __name__ == "__main__":
    app = QApplication([])
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec())

但是当我使用与 a 相同的代码时QVideoWidget dropEvent不会被调用:

import sys
from PySide6.QtCore import QSize
from PySide6.QtMultimediaWidgets import QVideoWidget
from PySide6.QtWidgets import QApplication, QWidget

class MyWidget(QVideoWidget):
    def __init__(self,*args):
        super().__init__(*args)

        self.setAcceptDrops(True)
        self.setMinimumSize(QSize(600,400))

    def dragEnterEvent(self, event):
        print(event)
        event.accept()

    def dragMoveEvent(self, event):
        print(event)
        event.accept()

    def dropEvent(self, event):
        print(event)

if __name__ == "__main__":
    app = QApplication([])
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec())

PS:我不知道为什么,但在dropEvent标题栏上的最后一个代码工作!如果需要,我可以上传 GIF。

4

1 回答 1

2

您发现了一个错误,Qt6 中的 QVideoWidget 使用 QWindow 来加速绘画,并将其添加为 QVideoWidget 的子级,因此拖放事件不会传播到父级。一种解决方法是使用事件过滤器来监听事件。

import sys

from PySide6.QtCore import QSize, QEvent
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtMultimediaWidgets import QVideoWidget


class MyWidget(QVideoWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setMinimumSize(QSize(600, 400))
        self.window_child.installEventFilter(self)

    @property
    def window_child(self):
        child = self.findChild(QWidget)
        if child.metaObject().className() == "QWindowContainer":
            return child

    def eventFilter(self, obj, event):
        if obj is self.window_child:
            if event.type() == QEvent.Type.DragEnter:
                print("dragEnterEvent:", event)
            elif event.type() == QEvent.Type.DragMove:
                print("dragMoveEvent:", event)
            elif event.type() == QEvent.Type.Drop:
                print("dropEvent", event)
        return super().eventFilter(obj, event)


if __name__ == "__main__":
    app = QApplication([])
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec())
于 2021-11-18T19:11:16.617 回答