首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从另一个Javascript脚本(Canvas3D)更新QML属性

从另一个Javascript脚本(Canvas3D)更新QML属性
EN

Stack Overflow用户
提问于 2016-04-06 07:49:34
回答 1查看 354关注 0票数 0

我在读取QML中的javascript变量时遇到了问题。我知道这似乎很容易,但这是一个特殊的情况:

我使用canvas3D生成了很多3D球,并且,由于时间非常长,我想显示一个进度条。

为了做到这一点,我做了这样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)函数中,每次添加球体时,我都在更新进度的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()结束时,我才得到进度的更新值。现在就像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Progress Bar to 0%
(Waiting for all the sphere to be instanciated)
(initializeGL() ends)
Progress Bar to 100%

这是没用的。我更希望在每次创建球体时让条子移动。

你知道我该怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-06 09:53:03

您只看到0%和100%的进展,因为在initializeGL()中的for-循环在QML引擎响应更改的canvas3d.progress值和更新progessBar.value值之前完全执行。for-循环和从progessBar.valuecanvas3d.progress的属性绑定的更新在同一个线程中运行。

解决这个问题的方法是只调用initializeGL()一步,然后生成用于更新进度的CPU。我的想法是使用一个单镜头计时器,它将自己称为numSphere时间,并在第一次拍摄中初始化第一次。

在test6.js中,逐步初始化函数将定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function initializeGLSphere(i) {
    var x = list[i][0];
    var y = list[i][1];
    var z = list[i][2];
    drawSphere(x,y,z,i);
}

Canvas3d实例之后,添加一次定时器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
onInitializeGL: timer.start()

启动单次定时器意味着将事件放入主Qt事件循环中。计时器在计时器间隔到期后触发。间隔0ms仅仅意味着计时器触发并尽快执行onTriggered,计时器事件到达前面的事件队列(循环)。

在处理计时器事件之间,事件队列还将给QML引擎一些时间来更新progressBar.progress的属性绑定。因此,您应该会看到在0到100之间有相当多的中间进度值。但是,您不会看到全部,因为在发生属性绑定更新之前,可能会处理多个定时器事件。如果希望看到更多的进度更新,只需增加计时器间隔即可。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36456114

复制
相关文章
Qml引用Loader组件属性
  本例子使用Loader加载myComponent组件,然后通过Loader的item属性设置myComponent的value属性。
Qt君
2023/03/17
8540
Qml引用Loader组件属性
Qml属性绑定小误区
  下面代码中,Text对象绑定了car.wheels属性。当onCompleted执行完成时,car.wheels = 6也同样执行完成了。预想结果是Text对象会动态更新,但实际上是不会更新的。
Qt君
2023/03/17
5630
Qml属性绑定小误区
从javascript脚本混淆说起
脚本病毒是一个一直以来就存在,且长期活跃着的一种与PE病毒完全不同的一类病毒类型,其制作的门槛低、混淆加密方式的千变万化,容易传播、容易躲避检测,不为广大网民熟知等诸多特性,都深深吸引着各色各样的恶意软件制作者 … 小到一个不起眼的lnk快捷方式,大到一个word文档,都是脚本的载体。本文主要以 js脚本为例(特指JScript,下同 ),具体结合实际样本,讲述混淆方式及其混淆类型检测相关知识,文章受限于样本个数及其种类,存在一定的局限性,但大致情况应当不会相差太大。本系列首先会对jscript及其脚本进行
FB客服
2018/02/28
1.5K0
从javascript脚本混淆说起
javascript脚本编辑错误集(持续更新)
Each child in a list should have a unique “key” prop Dom在渲染数组时,需要一个key,不然嵌套数组时会引起歧义 <div className="classlist-contaier"> {this.state.classList.map((item, index) => { return <ClassItem key={index}/>; })} </div> validateDOMNesting(…):
sofu456
2021/02/02
6460
Qml好用的default附加属性
  看似很没用的属性却说有用,还说好用。第一个例子看起来和常规做法差不多。那么我们看看第二个例子使用起来是如何好用的。   Group.qml组件:
Qt君
2019/07/15
1.6K0
Qml好用的default附加属性
Qml属性implicitWidth/Height与width/height区别
  implicitWidth/Height一般用在可重用控件,它也不是必要的,QtQuick可以没有者两个属性,只因为了方便而存在。qt例子描述到什么情况下用到implicitWidth/height属性,就是Image。它提供了项目的自然大小的提示,但没有强制执行此大小。图像的自然尺寸将图像文件中的一个像素映射到屏幕上的一个像素。但它允许我们拉伸它,因此大小不会被强制执行并且可以被覆盖。另外有些控件直接设置width/height会造成性能损失(Text,TextEdit).
Qt君
2019/07/15
1.7K0
QML教程-属性绑定与赋值
写QML界面会经常使用到很多的属性,其中属性的绑定与解绑尤其重要,决定着该界面属性是否能动态更新的功能。本文介绍属性的绑定与非绑定特性。 1.属性绑定 使用 :操作符,作用是左值绑定右值。 例: Item { property color myColor: "white" ... Rectangle { color: myColor ... } } color绑定父控件 myColor属性。 2.属性非绑定(解除绑定) 使用 =操作符,作用是左值解除右值绑定 例: Item {
Qt君
2019/07/15
2.1K0
如何从JavaScript对象中删除属性?
在使用 JavaScript 中的对象时,你可能会遇到需要从对象中完全删除属性的情况。为实现这一点可以有好几个选择:
疯狂的技术宅
2021/04/01
12.4K0
从网络导入Qml控件
先看一个小例子: import QtQuick 2.0 import "http://example.com/QtCompoment/" Rectangle { Button { } Label { } CheckBox { } } 步骤: example.com网站点根目录下存在一个QtComponent文件夹。 QtComponent文件夹里面包含以下文件: qmldir Button.qml Label.qml CheckBox.qml qmldir文件需要有以下内容描述
Qt君
2023/03/17
4090
从网络导入Qml控件
shell脚本实际运用_shell脚本调用另一个脚本
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168438.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
9980
git更新脚本
说明 此脚本用于更新git仓库,主要用于使用ssh克隆的仓库,使用https克隆或者直接下载的不可使用此脚本进行更新,编写此贴用于保存脚本以供后用 Linux平台 Linux平台下的脚本使用的是bash shell脚本进行编写的 #! /bin/bash ######################################## #Usage: ./update comment "msg" ######################################## echo st
impressionyang
2021/05/06
8120
用一个属性代理另一个对象的属性
今天来分享给大家一个属性代理的例子。总是有人问我属性代理有什么用,这个也许可以为你提供些思路。
bennyhuo
2020/02/20
8840
翻译 | QML编码约定
如果列表对象仅包含一个元素,则通常会省略方括号。例如,一个组件仅具有一个状态是很常见的。在这种情况下,如果这样写:
Qt君
2020/02/14
9400
JavaScript之firstChild属性、lastChild属性、nodeValue属性学习
1.数组元素childNodes[0]有更直观易读的优点,这边在介绍一个有同样功能的属性,且更加语义化-------->firstChild属性 假设我们需要目标元素节点下的所有子元素中的第一个子元素我们可以这样做: 目标元素节点下的子元素节点数组.firstChild 这句代码等价于 目标元素节点下的子元素节点数组[0]; 目标元素节点.childNodes[0] 这句代码等价于 目标元素节点.firstChild; 与此类推当我们需要目标元素节点下的所有子元素节点中的最后一个元素我们可以这样做: 目标
郑小超.
2018/01/24
1.7K0
JavaScript之childNodes属性、nodeType属性学习
1.childNodes属性:在一颗节点树上,childNodes属性可以用来获取任何一个元素的所有元素,它是一个包含这个元素所有子元素的数组。 <body> <script type="text/javascript"> function countBodyChildren() { var allelements = document.getElementsByTagName("body"); aler
郑小超.
2018/01/24
1.1K0
JavaScript数据属性和访问器属性
看《深入理解JavaScript》的this篇时看到“访问器属性”这个不熟悉的名词,百度后找到两篇感觉比较合适的文章,整合记录一下,以参考资料2为主,参考资料1为辅助补充。
WindCoder
2018/09/20
1.6K0
Three.js入门
Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象。你可以在它的主页上看到许多精采的演示。Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D。 Three.js的核心五步就是: 1.设置three.js渲染器 2.设置摄像机camera 3.设置场景scene 4.设置光源light 5.设置物体object 1.设置three.js渲染器 三维空间里的物体映射到二维平面的
李海彬
2018/03/22
7.8K0
JavaScript——对象的属性
在JavaScript中,所有的对象都是一组属性的集合,属性可以是数值,字符串等原始类型,也可以是函数,或者是其他对象。
Html5知典
2019/11/26
2.5K0
JavaScript实现私有属性
JavaScript被很多人认为并不是一种面向对象语言,原因有很多种,比如JavaScript没有类,不能提供传统的类式继承;再比如JavaScript不能实现信息的隐藏,不能实现私有成员。本文并不是为了打破以上误解(实际上笔者自己也有困惑),只是简单介绍几种JavaScript实现私有属性的方式,以及各自的优劣。 1. 基于编码规范约定实现方式 很多编码规范把以下划线_开头的变量约定为私有成员,便于同团队开发人员的协同工作。实现方式如下: function Person(name){ this._na
寒月十八
2018/01/30
9700
javascript的NaN属性
NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。
OECOM
2020/07/01
1.1K0

相似问题

从另一个QML设置QML属性

11

如何从函数内部更新QML属性

19

不更新属性别名的QML Javascript字典

11

QML从另一个QML对象访问附加属性

13

从C++更新QML窗口属性标志

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文