gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:58:57 30 4
gpt4 key购买 nike

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

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

相机.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());

// ...

}
}

最佳答案

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 的成员,等等),但这应该让你开始。

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

关于qt - 启用/禁用相机(QML 相机),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48681814/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com