我在读取QML中的javascript变量时遇到了问题。我知道这似乎很容易,但这是一个特殊的情况:
我使用canvas3D生成了很多3D球,并且,由于时间非常长,我想显示一个进度条。
为了做到这一点,我做了这样的事情:
import "test6.js" as GLCode
Item {
id: mainview
width: 1280
height: 768
visible: true
// THE PROGRESS BAR
ProgressBar {
id : progressBar
anchors.centerIn: parent
value: canvas3d.progress
z:1
}
//THE CANVAS3D (WebGL)
Canvas3D {
id: canvas3d
anchors.fill: parent
focus: true
property double progress:0 //MY VARIABLE I WANT TO UPDATE FROM test6.js
property var list : []
// Emitted when one time initializations should happen
onInitializeGL: {
GLCode.initializeGL(canvas3d);
}
我的canvas3d中有一个属性名进度,我试图从test6.js脚本中修改它
在initializeGL(canvas3d)函数中,每次添加球体时,我都在更新进度的值:
for ( i = 0; i < spheresNum; i ++ ) {
var x = list[i][0];
var y = list[i][1];
var z = list[i][2];
drawSphere(x,y,z,i);
canvas3d.progress = i/spheresNum*100;
}
现在的问题是,只有在initializeGL()结束时,我才得到进度的更新值。现在就像:
Progress Bar to 0%
(Waiting for all the sphere to be instanciated)
(initializeGL() ends)
Progress Bar to 100%
这是没用的。我更希望在每次创建球体时让条子移动。
你知道我该怎么做吗?
发布于 2016-04-06 09:53:03
您只看到0%和100%的进展,因为在initializeGL()
中的for-循环在QML引擎响应更改的canvas3d.progress
值和更新progessBar.value
值之前完全执行。for-循环和从progessBar.value
到canvas3d.progress
的属性绑定的更新在同一个线程中运行。
解决这个问题的方法是只调用initializeGL()
一步,然后生成用于更新进度的CPU。我的想法是使用一个单镜头计时器,它将自己称为numSphere
时间,并在第一次拍摄中初始化第一次。
在test6.js中,逐步初始化函数将定义如下:
function initializeGLSphere(i) {
var x = list[i][0];
var y = list[i][1];
var z = list[i][2];
drawSphere(x,y,z,i);
}
在Canvas3d
实例之后,添加一次定时器:
property int currentSphere = 0
Timer {
id: timer
repeat: false
interval: 0
onTriggered: {
GLCode.initializeGLSphere(currentSphere)
++currentSphere
progessBar.progress = currentSphere / GLCode.numSpheres
if (currentSphere < GLCode.numSpheres) {
timer.restart()
}
}
}
计时器在onInitializeGL
中启动
onInitializeGL: timer.start()
启动单次定时器意味着将事件放入主Qt事件循环中。计时器在计时器间隔到期后触发。间隔0ms仅仅意味着计时器触发并尽快执行onTriggered
,计时器事件到达前面的事件队列(循环)。
在处理计时器事件之间,事件队列还将给QML引擎一些时间来更新progressBar.progress
的属性绑定。因此,您应该会看到在0到100之间有相当多的中间进度值。但是,您不会看到全部,因为在发生属性绑定更新之前,可能会处理多个定时器事件。如果希望看到更多的进度更新,只需增加计时器间隔即可。
https://stackoverflow.com/questions/36456114
复制相似问题