如何处理过多的 QML 和音频文件

How to handle too many QML and audio files

我完成了一个 Qt Quick UI 项目,我在其中使用了许多 QML 和音频文件。这是一个儿童应用程序。在主屏幕中,我有 10 个部分。一个用于字母 (Pismena.qml),第二个用于数字 (Cislice.qml) 等 (Tvary.qml,Farby.qml)。如果您选择某个部分,则可以浏览带有声音的图像。一个部分包含大约 30 个 png 和 30 个 mp3 文件。一切正常。

但是如果我想部署这个应用程序并将这个项目转换成Qt Quick Application项目,我就遇到了问题。三个部分没问题,但如果我想使用四个部分,我会收到如下错误:

Error: "Internal data flow error." 

Error: "GStreamer encountered a general stream error." 

Error: "Failed to connect stream: Too large"

这些错误消息在我启动应用程序时立即显示,而不是在我浏览图像时显示。 还有一些音频元素没有播放。

这是我的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

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

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("applicationDirPath", QGuiApplication::applicationDirPath());
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

这是我的main.qml(不完整)

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtGraphicalEffects 1.0
import QtQuick.Window 2.0
import QtMultimedia 5.0

ApplicationWindow {
    visible: true
    width: 1024
    height:300

    Rectangle {
        width: parent.width
        height: parent.height
        id: appWindow
        property alias pismenaIconAlias: pismenaIcon

        Pismena{
            id: pismena
            visible: false
        }    

        Cislice{
            id: cislice
            visible: false
        }

        Farby{
            id: farby
            visible: false
        }

        Tvary{
            id: tvary
            visible: false
        }

        Image{
            id: pismenaIcon
            source: "file:" + applicationDirPath + "/obrazky/pismenaIcon.png"           
            MouseArea{
                anchors.fill: parent
                hoverEnabled: true
                onClicked: {
                    parent.visible = false
                    pismena.visible = true

                }                
            }
        }
        Image{
            id: cisliceIcon
            source: "file:" + applicationDirPath + "/obrazky/cisliceIcon.png"
            MouseArea{
                anchors.fill: parent
                hoverEnabled: true
                onClicked: {
                    parent.visible = false
                    cislice.visible = true                   
            }
        }

        Image{
            id: farbyIcon
            source: "file:" + applicationDirPath + "/obrazky/farbyIcon.png"            
            MouseArea{
                anchors.fill: parent
                hoverEnabled: true
                onClicked: {                    
                    parent.visible = false
                    farby.visible = true                    
            }
        }

        Image{
            id: tvaryIcon
            source: "file:" + applicationDirPath + "/obrazky/tvaryIcon.png"            
            MouseArea{
                anchors.fill: parent
                hoverEnabled: true
                onClicked: {                    
                    parent.visible = false
                    tvary.visible = true                    
            }
        }
    }
}

在 main.qml 文件中,如果您选择 Pismena(pismenaIcon 图像元素),您将被重定向到该文件 - Pismena.qml,您可以在其中浏览带声音的图像:

import QtQuick 2.3
import "myJava.js" as MyScript
import QtMultimedia 5.0
import QtQuick.Window 2.0
Item {
    anchors.horizontalCenter: parent.horizontalCenter
    anchors.verticalCenter: parent.verticalCenter
    Audio {
        id: hrajPismeno

    }
    Image {
        id: pis     
        MouseArea{
            anchors.fill: parent
            onClicked: {
                pis.source = "file:" + applicationDirPath + MyScript.cobr()
                hrajPismeno.source = "file:" + applicationDirPath + MyScript.zobr()
                hrajPismeno.play()

            }
        }
    }
}

这是我的 myJava.js

.pragma library
var pr = 0;
var c = 1;
var z = 1;
var numberOfItems = 33;
var itemFolder = "\/pismena\/";
function cobr(){
    c = (c === numberOfItems) ? 0 : c;
    c = c + 1;
    var s = itemFolder + c + ".png";
    return s;
}
function setLetters(){
    numberOfItems = 33;
    itemFolder = "\/pismena\/";
}
function zobr(){
    z = (z === numberOfItems) ? 0 : z;
    z = z + 1;
    var r = itemFolder + z + ".mp3";
    return r;
}

我在 Linux Mint 13 上使用 Qt 5.3。

为什么我不能使用很多音频文件?

Pismena.qml 中,您还没有为 ItemImage 设置初始 widthheight。所以在 window 中没有用户可以实际点击的地方。 Image 元素也没有默认路径。

编辑

在每个 Audio 元素中,将 autoLoad 属性 设置为 false