Почему метод run () моего QVideoFilterRunnable в PySide2 не выполняется? - PullRequest
1 голос
/ 25 апреля 2019

Я хочу использовать видеофильтр в приложении Pyside2 (5.12.2) / QML для дальнейшей обработки кадров камеры.Я преобразовал пример из документации QT в Python, но вместо выполняемого метода "run ()" QVideoFilterRunnable конструктор вызывается бесконечно, создавая один новый экземпляр за другим.Я подозреваю, что это может быть связано с сборкой мусора в 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» в консоли.

1 Ответ

0 голосов
/ 25 апреля 2019

В Python вы должны быть явным при выполнении наследования, и для этого вы должны использовать super (), в вашем случае Qt обнаруживает, что MyFilterRunnable не является QVideoFilterRunnable, поэтому он пытается найти другой фильтр и MyVideoFilter передает тот же фильтр в так что вы видите, что «init» печатается в каждый момент. Кроме того, что такое фильтр? мы не знаем, в этом нет необходимости, и поскольку нет необходимости добавлять параметры в качестве аргументов, мы можем опустить __init__:

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

Даже с учетом вышесказанного, к сожалению, ваша программа вылетит из-за нерешенной ошибки: PYSIDE-785 . То же самое происходит в PyQt5.

...