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

时间:2018-02-08 09:22:19

标签: qt camera qml android-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());

    // ...

    }
}

1 个答案:

答案 0 :(得分:1)

QML相机类型具有可在QML内直接访问的start()stop()方法。但是为了能够从c ++侧随意打开/关闭相机,你应该首先将它作为MainWindow类中的成员引入,例如像这样:

#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类中,您还应该引入一个成员变量来更快地访问实际的QML小部件,类似于上面的内容。让我们坚持你已经给它的“qw”。

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

Item {
    width: 640
    height: 360

    Camera {
        id: camera
        objectName: "theCamera"
    }

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

一旦你有了这个,你需要一个功能来启用/禁用相机的捕获,这可以这样做:

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

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

关于何时调用该功能来启用/禁用相机,这完全取决于您。