在 QML 中的 VideoOutput 上显示用 C++ 创建的相机
Display Camera created in C++ on VideoOutput in QML
我在将用 C++ 创建的 QCamera 显示到 QML 中的 VideoOutput 时遇到问题。
如果我在 QML 中使用这种方式,一切都很好,我得到了视频输出:
Item{
VideoOutput
{
id: videoOutput
anchors.fill: parent
source: camera
}
Camera
{
id: camera
}
}
但在我的例子中,相机不在 QML 中。我正在用 C++ 创建它。我试图在 C++ 中创建它并将其设置为 contextProperty,因此在 qml 的 VideoOutput 的源代码中使用它。所以这是我的 main.cpp.
QCamera* camera;
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
foreach (const QCameraInfo &cameraInfo, cameras)
{
qDebug() << cameraInfo.description();
camera = new QCamera(cameraInfo);
}
if(camera)
{
qDebug() << "setContextProperty camera ";
engine.rootContext()->setContextProperty("mCamera", camera);
}
一切正常,检测到摄像头,我在 QML 中使用它,如下所示:
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Item
{
id: cameraView
height: 230
width: 300
anchors.centerIn: parent
VideoOutput
{
id: videoOutput
anchors.fill: parent
source: mCamera
}
}
但是这种方式没有视频输出。这有可能实现吗?提前致谢。
您不能直接将 QCamera
分配给 VideoOutput
的来源。
您可以将 QML Camera
的 deviceId
设置为与您的 QCamera
:
相匹配
在你的 C++ 中:
engine.rootContext()->setContextProperty("deviceId", cameraInfo.deviceName);
在您的 QML 中:
Camera {
id: camera
deviceId: cameraDeviceId
}
VideoOutput {
id: videoOutput
anchors.fill: parent
source: camera
}
以防万一还有人感兴趣。
您可以使用 Camera->setViewfinder() 函数。
我有一个 QCamera 的包装器 class 可以做一些其他的事情。
其中,有一个 public 插槽用于从 QML 设置相机取景器。
void MyCamClass::setViewFinder(QObject *vf)
{
if(Camera)
Camera->setViewfinder(qobject_cast<QAbstractVideoSurface *>(vf));
}
在 QML 方面,您将有一个
VideoOutput {
id: vOutput
}
如果你想激活你的相机,你可以拨打:
mCamera->setviewFinder(vOutput.videoSurface);
mCamera 是 MyCamClass class 的一个对象并注册到 QML 环境。
确保在设置取景器之前启动相机。
我在将用 C++ 创建的 QCamera 显示到 QML 中的 VideoOutput 时遇到问题。 如果我在 QML 中使用这种方式,一切都很好,我得到了视频输出:
Item{
VideoOutput
{
id: videoOutput
anchors.fill: parent
source: camera
}
Camera
{
id: camera
}
}
但在我的例子中,相机不在 QML 中。我正在用 C++ 创建它。我试图在 C++ 中创建它并将其设置为 contextProperty,因此在 qml 的 VideoOutput 的源代码中使用它。所以这是我的 main.cpp.
QCamera* camera;
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
foreach (const QCameraInfo &cameraInfo, cameras)
{
qDebug() << cameraInfo.description();
camera = new QCamera(cameraInfo);
}
if(camera)
{
qDebug() << "setContextProperty camera ";
engine.rootContext()->setContextProperty("mCamera", camera);
}
一切正常,检测到摄像头,我在 QML 中使用它,如下所示:
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Item
{
id: cameraView
height: 230
width: 300
anchors.centerIn: parent
VideoOutput
{
id: videoOutput
anchors.fill: parent
source: mCamera
}
}
但是这种方式没有视频输出。这有可能实现吗?提前致谢。
您不能直接将 QCamera
分配给 VideoOutput
的来源。
您可以将 QML Camera
的 deviceId
设置为与您的 QCamera
:
在你的 C++ 中:
engine.rootContext()->setContextProperty("deviceId", cameraInfo.deviceName);
在您的 QML 中:
Camera {
id: camera
deviceId: cameraDeviceId
}
VideoOutput {
id: videoOutput
anchors.fill: parent
source: camera
}
以防万一还有人感兴趣。
您可以使用 Camera->setViewfinder() 函数。
我有一个 QCamera 的包装器 class 可以做一些其他的事情。 其中,有一个 public 插槽用于从 QML 设置相机取景器。
void MyCamClass::setViewFinder(QObject *vf)
{
if(Camera)
Camera->setViewfinder(qobject_cast<QAbstractVideoSurface *>(vf));
}
在 QML 方面,您将有一个
VideoOutput {
id: vOutput
}
如果你想激活你的相机,你可以拨打:
mCamera->setviewFinder(vOutput.videoSurface);
mCamera 是 MyCamClass class 的一个对象并注册到 QML 环境。
确保在设置取景器之前启动相机。