如何处理过多的 QML 和音频文件
Posted
技术标签:
【中文标题】如何处理过多的 QML 和音频文件【英文标题】:How to handle too many QML and audio files 【发布时间】:2015-10-28 02:52:27 【问题描述】:我完成了一个 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 Image element),您将被重定向到该文件 - 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。
为什么我不能使用很多音频文件?
【问题讨论】:
【参考方案1】:在Pismena.qml
中,您没有为Item
和Image
设置初始width
和height
。所以在窗口中没有用户可以实际点击的地方。 Image
元素也没有默认路径。
编辑
在每个Audio
元素中,将autoLoad
属性设置为false
。
【讨论】:
在原始 Pismena.qml 中,我有 Item width: parent.width height: parent.height 和 Image 它是 height: 0.4*appWindow.height/(720/sourceSize.height) width: 0.4 *appWindow.height/(720/sourceSize.height)*sourceSize.width/sourceSize.height 但是我没有放在这里,因为原来的太长了,我觉得没那么重要。对不起。 那么你应该使用调试器。将console.log("Image clicked")
放入onClicked
。将console.log(hrajPismeno.errorString)
放在hrajPismeno.play
之后并尝试查看错误出现在哪里。
我忘了提一件事。对不起。当我启动应用程序时,我的错误消息会立即显示,而不是在我浏览图像时。无论如何,我尝试了您的建议,但是没有错误消息代替 console.log(hrajPismeno.errorString)
我认为这是系统中的一个错误。您是否在任何其他平台上编译过代码?
我也在 Mint 17.2 上尝试过,结果相同。以上是关于如何处理过多的 QML 和音频文件的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 AVPlayerViewController 中的下一个和上一个按钮?