[英]Enable / disable camera (QML Camera)
我在camera.qml 中有qml 相機小部件。 qml 組件是從放置在后台堆棧小部件上的 Qt 小部件“WidgetCamera”加載的。 小部件在創建時就已啟動相機設備。
如何使相機僅在小部件顯示在前景中時啟動。 反之亦然,當小部件進入后台時如何釋放相機?
相機.qml
Item {
width: 640
height: 360
Camera {
id: camera
}
VideoOutput {
source: camera
anchors.fill: parent
}
}
小工具相機.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 的成員等),但這應該可以幫助您入門。
至於何時要調用該函數來啟用/禁用相機,這完全取決於您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.