启用/禁用相机(QML 相机)

Enable / disable camera (QML Camera)

我在 camera.qml 中有 qml 相机小部件。 qml 组件是从放置在后台堆栈小部件上的 Qt 小部件 "WidgetCamera" 加载的。该小部件在创建时已启动相机设备。

如何让相机仅在小部件显示在前台时启动。反之亦然,当小部件进入后台时如何释放相机?

camera.qml

Item {
    width: 640
    height: 360

    Camera {
        id: camera
    }

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

widgetCamera.h

class WidgetCamera : public QWidget
{
    Q_OBJECT
    public:
    WidgetCamera() {
       QQuickWidget *qw= new QQuickWidget;
       qw->setSource(QUrl("qrc:///camera.qml"));
       // ...
    }
}

mainwindow.h

class MainWindow : QMainWindow
{
    Q_OBJECT
    public:
    MainWindow() {
    QStackedWidget *sw = new QStackedWidget;
    sw->addWidget(new QWidget());
    sw->addWidget(new WidgetCamera());

    // ...

    }
}

QML 相机类型具有 start()stop() 方法,可直接在 QML 中访问。但是为了能够从 c++ 端随意转动相机 on/off,您应该首先将其作为成员引入 MainWindow class,例如像这样:

#include "widgetCamera.h"

class MainWindow : QMainWindow
{
    Q_OBJECT
    private:
        WidgetCamera* _cameraWidget;

public:
    MainWindow() {
        QStackedWidget *sw = new QStackedWidget;
        sw->addWidget(new QWidget());
        _cameraWidget = new WidgetCamera();
        sw->addWidget(_cameraWidget);
        // PS: Make sure you free your instances correctly, too

        // ...

    }

}

现在,在您的 WidgetCamera class 中,您还应该引入一个成员变量来更快地访问实际的 QML 小部件,类似于上面的内容。让我们坚持使用您已经提供的 "qw"。

然后,确保将 objectNames 赋予所有要访问的 QML 子项(在本例中,我们需要相机),如下所示:

Item {
    width: 640
    height: 360

    Camera {
        id: camera
        objectName: "theCamera"
    }

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

一旦你有了它,你需要一个函数来 enable/disable 捕获相机,可以这样完成:

void WidgetCamera::disableCapture() {
    QObject* qmlCamera = qw->findChild<QObject*>("theCamera");
    QCamera* camera = qvariant_cast<QCamera*>(qmlCamera->property("mediaObject"));
    camera->stop();
}

现在,很明显,其中很多都可以改进和优化(比如让实际的 c++ QCamera 成为 WidgetCamera 的成员,等等),但这应该让你开始。

至于什么时候调用那个函数给enable/disable相机,那完全取决于你。