Content.qml Example File | Qt Multimedia 5.4

- Qt 5.4
- Qt Multimedia
- QML Video Example
- Content.qml Example File
- Qt 5.4.2 Reference Documentation

# Content.qml Example File

video/qmlvideo/qml/qmlvideo/Content.qml

    /****************************************************************************
    **
    ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
    ** Contact: http://www.qt-project.org/legal
    **
    ** This file is part of the Qt Mobility Components.
    **
    ** $QT_BEGIN_LICENSE:LGPL21$
    ** Commercial License Usage
    ** Licensees holding valid commercial Qt licenses may use this file in
    ** accordance with the commercial license agreement provided with the
    ** Software or, alternatively, in accordance with the terms contained in
    ** a written agreement between you and Digia. For licensing terms and
    ** conditions see http://qt.digia.com/licensing. For further information
    ** use the contact form at http://qt.digia.com/contact-us.
    **
    ** GNU Lesser General Public License Usage
    ** Alternatively, this file may be used under the terms of the GNU Lesser
    ** General Public License version 2.1 or version 3 as published by the Free
    ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
    ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
    ** following information to ensure the GNU Lesser General Public License
    ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
    ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    **
    ** In addition, as a special exception, Digia gives you certain additional
    ** rights. These rights are described in the Digia Qt LGPL Exception
    ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    import QtQuick 2.0

    Rectangle {
        id: root
        border.color: "white"
        border.width: showBorder ? 1 : 0
        color: "transparent"
        property string contentType // "camera" or "video"
        property string source
        property real volume
        property bool dummy: false
        property bool autoStart: true
        property bool started: false
        property bool showFrameRate: false
        property bool showBorder: false

        signal initialized
        signal error
        signal videoFramePainted

        Loader {
            id: contentLoader
        }

        Connections {
            id: framePaintedConnection
            onFramePainted: {
                if (frameRateLoader.item)
                    frameRateLoader.item.notify()
                root.videoFramePainted()
            }
            ignoreUnknownSignals: true
        }

        Connections {
            id: errorConnection
            onFatalError: {
                console.log("[qmlvideo] Content.onFatalError")
                stop()
                root.error()
            }
            ignoreUnknownSignals: true
        }

        Loader {
            id: frameRateLoader
            source: root.showFrameRate ? "../frequencymonitor/FrequencyItem.qml" : ""
            onLoaded: {
                item.parent = root
                item.anchors.top = root.top
                item.anchors.right = root.right
                item.anchors.margins = 10
            }
        }

        onWidthChanged: {
            if (contentItem())
                contentItem().width = width
        }

        onHeightChanged: {
            if (contentItem())
                contentItem().height = height
        }

        function initialize() {
            if ("video" == contentType) {
                contentLoader.source = "VideoItem.qml"
                if (Loader.Error == contentLoader.status) {
                    contentLoader.source = "VideoDummy.qml"
                    dummy = true
                }
                contentLoader.item.volume = volume
            } else if ("camera" == contentType) {
                contentLoader.source = "CameraItem.qml"
                if (Loader.Error == contentLoader.status) {
                    contentLoader.source = "CameraDummy.qml"
                    dummy = true
                }
            } else {
                console.log("[qmlvideo] Content.initialize: error: invalid contentType")
            }
            if (contentLoader.item) {
                contentLoader.item.sizeChanged.connect(updateRootSize)
                contentLoader.item.parent = root
                contentLoader.item.width = root.width
                framePaintedConnection.target = contentLoader.item
                errorConnection.target = contentLoader.item
                if (root.autoStart)
                    root.start()
            }
            root.initialized()
        }

        function start() {
            if (contentLoader.item) {
                if (root.contentType == "video")
                    contentLoader.item.mediaSource = root.source
                contentLoader.item.start()
                root.started = true
            }
        }

        function stop() {
            if (contentLoader.item) {
                contentLoader.item.stop()
                if (root.contentType == "video")
                    contentLoader.item.mediaSource = ""
                root.started = false
            }
        }

        function contentItem() { return contentLoader.item }
        function updateRootSize() { root.height = contentItem().height }
    }