我在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());
// ...
}
}
答案 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的成员等),但这应该可以让你开始。
关于何时调用该功能来启用/禁用相机,这完全取决于您。