为什么我的PySide2中的QVideoFilterRunnable的“ run()”方法没有执行?

时间:2019-04-25 14:18:50

标签: python qml pyside2

我想在Pyside2(5.12.2)/ QML应用程序中使用视频滤镜以进一步处理相机的帧。我将示例从the QT docs转换为Python,但是没有执行QVideoFilterRunnable的“ run()”方法,而是无休止地调用了构造函数,从而创建了一个新的实例。我怀疑这可能与Python的垃圾回收有关-有人知道如何使run()方法在PySide2中执行吗?

import sys
from PySide2.QtCore import QUrl, Slot, Signal, Property
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine, qmlRegisterType

from PySide2.QtMultimedia import QVideoFilterRunnable, QAbstractVideoFilter

class MyFilterRunnable(QVideoFilterRunnable):

    def __init__(self, filter):
        print("init")
        self.init = False
        self.filter = filter

    def run(self, input, surface, flags):
        print("run")
        return input

class MyVideoFilter(QAbstractVideoFilter):

    def createFilterRunnable(self):
        return MyFilterRunnable(self)

if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    qmlRegisterType(MyVideoFilter, "my.uri", 1, 0, "MyVideoFilter");
    engine.load(QUrl.fromLocalFile('qml_test.qml'))
    sys.exit(app.exec_())

QML文件:

import QtQuick 2.0
import QtMultimedia 5.4
import QtQuick 2.10
import QtQuick.Controls 2.1
import QtQuick.Window 2.2

import my.uri 1.0

ApplicationWindow {

    id: app
    width: 640
    height: 480
    visible: true

    Rectangle {
        id : cameraUI
        anchors.fill: parent

        Camera {
            id: camera
        }

        MyVideoFilter {
            id: myvideofilter
        }

        VideoOutput {
            id: viewfinder
            filters: [ myvideofilter ]
            source: camera
        }
    }
}

在控制台中,我看到了无数的“ init”,而不是“ run”。

1 个答案:

答案 0 :(得分:0)

在Python中,在进行继承时必须明确,为此必须使用super(),在这种情况下,Qt检测到MyFilterRunnable不是QVideoFilterRunnable,因此它尝试查找另一个过滤器,而MyVideoFilter将相同的过滤器传递给它使您随时都看到“ init”字样的打印。另外,什么是过滤器?我们不知道,这是没有必要的,并且由于没有必要添加参数作为参数,我们可以省略__init__

class MyFilterRunnable(QVideoFilterRunnable):
    def run(self, _input, surface, flags):
        print("run")
        return _input

不幸的是,即使考虑了上述情况,您的程序也会由于未解决的错误PYSIDE-785而崩溃。在PyQt5中也是如此。