启用/禁用相机(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相机,那完全取决于你。
我在 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相机,那完全取决于你。