我想在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
}
}
}
在控制台中,我看到的不是“run”,而是无数的“init”。你知道吗
在Python中,执行继承时必须显式执行,为此必须使用super(),在这种情况下,Qt检测到MyFilterRunnable不是QVideoFilterRunnable,因此它尝试查找另一个筛选器,MyVideoFilter将同一个筛选器传递给它,这样您就可以随时看到“init”被打印出来。还有,什么是过滤器?我们不知道,这是没有必要的,因为没有必要添加参数作为参数,我们可以省略
__init__
:不幸的是,即使考虑到上述情况,您的程序也会由于一个未解决的bug而崩溃:PYSIDE-785。同样的情况也发生在PyQt5中。你知道吗
相关问题 更多 >
编程相关推荐