我在将应用程序从 PySide2 移植到 PySide6 时遇到问题。
我正在使用 gphoto2 库读取我的相机,并在预览模式下从中创建一个 PIL 图像。它就像一个实时取景器,向用户显示相机当前看到的内容。
之前,我实现了一个自定义 FrameProvider 并将其用作我的 VideoOutput QML 类型的源。 QVideoFrame 可以轻松地从 QImage 转换:
frame = QVideoFrame(QImage(os.path.join(os.path.dirname(__file__), "./res/initialization.jpg"))) # PySide2 conversion
由于 VideoOutput 和 QVideoFrame 在 PySide6 中都发生了变化,我实现了一个自定义 VideoSink 类,它公开了我想要使用的 VideoOutput 的 videoSink:
VideoSink {
id: videoSink
videoSink: main.videoSink
}
VideoOutput {
id: main
anchors.fill: parent
fillMode: VideoOutput.Stretch
}
这是我的 VideoSink 类的 python 代码:
class VideoSink(QObject):
def __init__(self, parent=None):
super(VideoSink, self).__init__(parent)
self.sink = None
@Signal
def sinkChanged(self):
pass
def get_sink(self):
return self.sink
def set_sink(self, sink):
self.sink = sink
frame = QVideoFrame(QImage(os.path.join(os.path.dirname(__file__), "./res/initialization.jpg"))) # not working in PySide6 :-(
self.sink.setVideoFrame(frame)
self.sinkChanged.emit()
videoSink = Property(
QObject, get_sink, set_sink, notify=sinkChanged
)
但是,唯一缺少的是到 QVideoFrame 的转换。不幸的是我不能再在 PySide6 中使用构造函数方法了。因此,我正在寻找一种不同的方法来从 QImage 创建 QVideoFrame,或者甚至可能是一种不同的方法来完全在 PySide6 中显示图像流
万一将来有人来寻找这个,我在这个问题上找到了这个:如何在常规 python 中的内存视图对象上使用 ctypes.memmove