在 QML 中的 VideoOutput 上显示用 C++ 创建的相机

Display Camera created in C++ on VideoOutput in QML

我在将用 C++ 创建的 QCamera 显示到 QML 中的 VideoOutput 时遇到问题。 如果我在 QML 中使用这种方式,一切都很好,我得到了视频输出:

Item{
        VideoOutput
        {
            id: videoOutput
            anchors.fill: parent
            source: camera
        }
        Camera
        {
            id: camera
        }
}

但在我的例子中,相机不在 QML 中。我正在用 C++ 创建它。我试图在 C++ 中创建它并将其设置为 contextProperty,因此在 qml 的 VideoOutput 的源代码中使用它。所以这是我的 main.cpp.

QCamera* camera;

    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    foreach (const QCameraInfo &cameraInfo, cameras)
    {
        qDebug() << cameraInfo.description();

        camera = new QCamera(cameraInfo);
    }

    if(camera)
    {
        qDebug() << "setContextProperty  camera ";
        engine.rootContext()->setContextProperty("mCamera", camera);
    }

一切正常,检测到摄像头,我在 QML 中使用它,如下所示:

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Item
    {
        id: cameraView
        height: 230
        width: 300
        anchors.centerIn: parent

        VideoOutput
        {
            id: videoOutput
            anchors.fill: parent
            source: mCamera
        }
    }

但是这种方式没有视频输出。这有可能实现吗?提前致谢。

您不能直接将 QCamera 分配给 VideoOutput 的来源。

您可以将 QML CameradeviceId 设置为与您的 QCamera:

相匹配

在你的 C++ 中:

engine.rootContext()->setContextProperty("deviceId", cameraInfo.deviceName);

在您的 QML 中:

Camera {
    id: camera
    deviceId: cameraDeviceId
}

VideoOutput {
    id: videoOutput
    anchors.fill: parent
    source: camera
}

以防万一还有人感兴趣。
您可以使用 Camera->setViewfinder() 函数。

我有一个 QCamera 的包装器 class 可以做一些其他的事情。 其中,有一个 public 插槽用于从 QML 设置相机取景器。

void MyCamClass::setViewFinder(QObject *vf)
{
  if(Camera)
    Camera->setViewfinder(qobject_cast<QAbstractVideoSurface *>(vf));
}

在 QML 方面,您将有一个

VideoOutput {
  id: vOutput
}

如果你想激活你的相机,你可以拨打:

mCamera->setviewFinder(vOutput.videoSurface);

mCamera 是 MyCamClass class 的一个对象并注册到 QML 环境。
确保在设置取景器之前启动相机。