同时在两个窗口中显示相机

时间:2017-01-31 09:40:17

标签: qt camera qml

我的主窗口正在创建另一个显示在第二个屏幕上的窗口

ApplicationWindow {
    id: mainWindow

    property var customerUi

    Component.onCompleted: {
        customerUi = customerWindow.createObject()
        if (ScreenManager.screenCount() > 1)
            ScreenManager.setScreen(customerUi, 1)
    }
}

两个窗口都需要显示同一个摄像头的视频(它实际上是来自USB适配器的实时馈送,但它的工作方式相同)

Camera {
    id: camera
    deviceId: "my_device"
}

VideoOutput {
    source: camera
}

它在一个窗口中工作正常,但第二个窗口从不显示视频。我猜是因为Camera句柄不能同时被两个界面抓住(或类似的东西)

我尝试使用相同的源只创建一个Camera和两个VideoOutput,但它也不起作用。

我尝试使用ShaderEffect复制视图,但

ShaderEffectSource: sourceItem and ShaderEffectSource must both be children of the same window

如何在两个窗口同时显示视频?

编辑:

显然在Qt 5.3中可以使用ShaderEffectSource https://bugreports.qt.io/browse/QTBUG-43117

但我需要使用Qt 5.5.1

编辑2:

使用ShaderEffectSource在同一窗口中复制视频效果很好,问题只是将它放在另一个窗口中。

3 个答案:

答案 0 :(得分:1)

以下是我为解决问题所做的工作:

我创建第三个Window宽度足以覆盖两个屏幕,并使用ShaderEffectSource复制窗口。

这只能起作用,因为我的两个Windows在每个屏幕上都是全屏的

我仍然在寻找问题的实际解决方案。

答案 1 :(得分:0)

您可以尝试使用Item::grabToImage(callback, targetSize)方法将静态Image填入来自source的内存中保存数据。你也需要1/60计时器。但我相信它的CPU价格相当昂贵,所以要注意:)

答案 2 :(得分:-1)

在一个main.qml文件中创建两个Window项:

import QtQuick 2.7
import QtQuick.Window 2.2

Item {
    Window {
        title: qsTr("Hello World")
        objectName: "wnd1"
        visible: true
        width: 640
        height: 480
    }

    Window {
        title: qsTr("Hello World 2")
        objectName: "wnd2"
        visible: true
        width: 640
        height: 480
    }
}

然后,从main.cpp加载它:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

如果组件位于同一个QML文件中,您应该可以轻松地重复使用组件。