【问题标题】:Enable / disable camera (QML Camera)启用/禁用摄像头(QML 摄像头)
【发布时间】:2018-02-08 09:22:19
【问题描述】:

我在 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"));
       // ...
    }
}

主窗口.h

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

    // ...

    }
}

【问题讨论】:

  • 解释清楚,我不明白你想要什么。
  • 我很确定问题是关于如何使小部件不总是捕获相机,而只有当小部件实际可见时。
  • 是的。问题是关于如何使小部件不总是捕获相机。

标签: qt camera qml android-camera


【解决方案1】:

QML 相机类型有 start()stop() 方法可直接在 QML 内部访问。但是为了能够从 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 的成员等),但这应该可以帮助您入门。

至于何时要调用该函数来启用/禁用相机,这完全取决于您。

【讨论】:

  • 我认为 _qmlWidget 应该是 qw 以匹配 OP 代码
  • 确实如此。改变了。
猜你喜欢
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多