首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >qml属性更新是如何组织的?

qml属性更新是如何组织的?
EN

Stack Overflow用户
提问于 2016-06-23 06:23:01
回答 1查看 124关注 0票数 0

我正在尝试在UI项目中使用信号。我想要一个按钮来启动一些进程。当我这么做的时候,我意识到我不明白发生了什么,所以我写了下面的代码,试图指出正在发生的事情。

运行时,main.qml创建一些彩色框作为控件,一些白色框用于输出(由SubOne.qml生成)。

如果单击绿色框,它会发出“广播”信号,每个白框都连接到该信号。

在“广播”上,每个白框调用其功能栏。

酒吧开始循环。在循环结束时,它会打印迭代次数,并更改text属性以显示相同的次数。

第一和第三白框执行1循环,但第二框执行足够的循环以导致明显的延迟。

好吧,一切看起来都很好。正如预期的那样,这三个函数条被依次调用,并按顺序输出它们的打印。但是,我发现文本属性并没有按顺序更新。相反,所有的条形图都完成了,然后所有三个文本属性一起更新。

换句话说,在SubOne.qml中,第17行直到所有循环完成后才生效,但是第18行在每个循环完成后才生效。

有人能告诉我发生了什么事吗?qml是否在做一些事情来优化对显示的写入?如果是的话,它能被控制吗?

主要是如何使打印和文本更新在每个循环退出后一起进行。

谢谢你的帮助。

//qml.main

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import QtQuick 2.4
import QtQuick.Controls 1.3

ApplicationWindow {
    visible: true

    Rectangle {
        Rectangle {
            x: 50
            y: 50
            width: 50
            height: 50
            color: "green"
            Text {
                text: "Start"
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.verticalCenter: parent.verticalCenter
            }
            MouseArea {
                id: start
                signal broadcast()
                anchors.fill: parent
                onClicked: broadcast();
            }

        }
        Rectangle {
            function set() {
                first.thisText = "---";
                second.thisText = "---";
                third.thisText = "---";
            }
            id: reset
            x: 110
            y: 50
            width: 50
            height: 50
            color: "yellow"
            Text {
                text: "Reset"
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.verticalCenter: parent.verticalCenter
            }
            MouseArea {
                anchors.fill: parent
                onClicked: reset.set();
            }
        }
        Rectangle {
            id: exit
            x: 170
            y: 50
            width: 50
            height: 50
            color: "red"
            Text {
                text: "Exit"
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.verticalCenter: parent.verticalCenter
            }
            MouseArea {
                anchors.fill: parent
                onClicked: Qt.quit();
            }
        }
    }


    SubOne {
        id: third
        thisName: "third"
        x: 50
        y: 110
        loop: 1
    }
    SubOne {
        id: second
        thisName: "second"
        x: 50
        y: 170
        loop: 100000000
    }
    SubOne {
        id: first
        thisName: "first"
        x: 50
        y: 230
        loop: 1
    }

}

//SubOne.qml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import QtQuick 2.0

Rectangle {
    id: rectangle1
    property string thisName: ""
    property string thisText: "nothing yet"
    property int loop: 1
    height:50
    width:170

    function bar() {
        print("looping " + thisName + " with: " + loop);
        for (var counter=0; counter<loop; counter+=1){
            //do nothing much
        }
        thisText = counter;
        print("looped " + thisName + " to: " + counter);
    }

    Text {
        text: thisText
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
    }

    Connections {
        target: start
        onBroadcast: bar()
    }
}

下面是使用WorkerScript的新代码,如建议的那样。

//SubOne.qml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import QtQuick 2.0

Rectangle {
    id: rectangle1
    property string thisName: ""
    property string thisText: "nothing yet"
    property int loop: 1
    height:50
    width:170

    WorkerScript {
        id: myWorker
        source: "script.js"
        onMessage: thisText = messageObject.reply
    }

    Text {
        text: thisText
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
    }

    Connections {
        target: start
        onBroadcast: {
            myWorker.sendMessage({'loopVal':loop, 'nameVal':thisName});
        }
    }
}

//script.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WorkerScript.onMessage = function(obj) {
    print("looping " + obj.nameVal + " to: " + obj.loopVal);
    for (var counter=0; counter<obj.loopVal; counter+=1){
        //do nothing much
    }
    print("finished " + obj.nameVal + " at: " + counter);
    WorkerScript.sendMessage({ 'reply': counter})
}

值得注意的是,sendMessage在SubOne.qml的第26行没有在SubOne的第14行由onMessage处理,而是在script.js的第1行由WorkerScript.onMessage处理,而script.js的第7行的WorkerScript.sendMessage则在第14行的SubOne.qml文件中被处理。此外,发送给新线程的消息只有一个参数,因此为了发送nameVal和loopVal,我将它们放在一个对象中,在SubOne.qml的第26行创建

也许这是显而易见的,但我一时糊涂了;)

有趣的是,如果在循环期间按下'red‘,主线程就会立即退出,但是第二个线程会完成它首先做的事情。

希望这能帮上忙。

感谢BaCaRoZzo和Kuba。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-23 07:05:39

QML在这里没有做什么--你做了,因为你阻塞了事件循环。当您的代码运行时,事件循环不存在,而且QML无法执行任何显示更新。必须将控制权交回事件循环,以使显示更新。这与基于小部件的UI没有什么不同。你在那里也会有同样的行为。

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

https://stackoverflow.com/questions/37994419

复制
相关文章
Qml好用的default附加属性
  看似很没用的属性却说有用,还说好用。第一个例子看起来和常规做法差不多。那么我们看看第二个例子使用起来是如何好用的。   Group.qml组件:
Qt君
2019/07/15
1.6K0
Qml好用的default附加属性
Qml引用Loader组件属性
  本例子使用Loader加载myComponent组件,然后通过Loader的item属性设置myComponent的value属性。
Qt君
2023/03/17
8560
Qml引用Loader组件属性
Qml属性绑定小误区
  下面代码中,Text对象绑定了car.wheels属性。当onCompleted执行完成时,car.wheels = 6也同样执行完成了。预想结果是Text对象会动态更新,但实际上是不会更新的。
Qt君
2023/03/17
5650
Qml属性绑定小误区
物理内存是如何组织管理的
内存管理,相比大家都听过。但是内存管理到底是做什么呢?这就得从计算机刚出来的时候说起。计算机刚出来的时候内存资源很紧张,只有几十K,后来慢慢的到几百K,到周后来的512M,再到现在的几个G。真是因为内存资源的不足,在计算机的整个过程中衍生出各种各样的内存管理方法。
DragonKingZhu
2020/04/16
1.6K0
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
SpringCloud是如何动态更新配置的
spring cloud在config配置管理的基础上,提供了consul config的配置管理和动态监听,那么这里面到底是怎样实现的,本文将为你揭秘。
tunsuy
2022/10/27
2.6K0
Vue是如何触发组件更新的?
Vue是数据驱动的一个视图框架,所谓数据驱动就是DOM是通过数据来映射的,只有在数据改变的情况下视图才会发生改变。
越陌度阡
2022/05/06
1K0
Vue是如何触发组件更新的?
Confluence 6 内容在空间中是如何组织的
你可以将空间考虑为一个容器,在这个容器中保持了有关你项目中所有重要的东西,包括小组,项目或者项目相关的工作。这些东西有很高的自主性,这表示的是每个空间都有自己的的页面,文件,评论以及 RSS 新闻源。
HoneyMoose
2019/01/30
5500
Confluence 6 内容在空间中是如何组织的
计算属性是如何被Vue实现的
无论是面试过程还是日常业务开发,相信大多数前端开发者对于 Vue 的应用已经熟能生巧了。
19组清风
2022/09/27
8290
计算属性是如何被Vue实现的
ERP那些具有“组织”属性字段的启发
声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。注:文中所示截图来源SAP软件,相应著作权归SAP所有。文中所指ERP即SAP软件。
齐天大圣
2021/04/23
8710
ERP那些具有“组织”属性字段的启发
[答疑]发现研究的组织是自己所在组织,有点慌
我们做业务建模研究的组织可以是自己所在的组织吗?例如,如果我想做一个组件来来提高研发效能,那我研究的组织是我们部门的研发线可以吗? 因为最近做一个设备管理的建模,发现研究的组织是自己所在组织,有点慌。
用户6288414
2019/09/23
4310
[答疑]发现研究的组织是自己所在组织,有点慌
Java | Apollo 是如何实现配置更新的
在 Apollo 控制台进行配置修改并发布后,对应的 client 端拉取到更新后,会调用到 com.ctrip.framework.apollo.spring.property.AutoUpdateConfigChangeListener#onChange 方法
双鬼带单
2021/03/18
2.3K0
Outlaw黑客组织武器更新分析
网络犯罪集团保持沉默不一定意味着没有活动,过去几个月一直保持沉默的黑客组织Outlaw更新了其武器库。
FB客服
2020/05/29
8940
Outlaw黑客组织武器更新分析
Dva 底层是如何组织起 Redux 数据流的?
dva 首先是一个基于redux[1]和redux-saga[2]的数据流方案,然后为了简化开发体验,dva 还额外内置了react-router[3]和fetch[4],所以也可以理解为一个轻量级的应用框架。
用户3806669
2021/07/06
1.4K0
Dva 底层是如何组织起 Redux 数据流的?
我是如何组织 Go 代码的(目录结构 依赖注入 wire)
对于大多数 Gopher 来说,编写 Go 程序会直接在目录建立 main.go,xxx.go,yyy.go……
仁扬
2023/07/18
5760
欧洲核子研究组织(CERN)是如何使用 Linux 和开源的
CERN 无需过多介绍了吧。CERN 创建了 万维网(World Wide Web)(WWW)和 大型强子对撞机(Large Hadron Collider)(LHC),这是世界上最大的 粒子加速器(particle accelerator),就是通过它发现了 希格斯玻色子(Higgs boson)。负责该组织 IT 操作系统和基础架构的 Tim Bell 表示,他的团队的目标是“为全球 13000 名物理学家提供计算设施,以分析这些碰撞,了解宇宙的构成以及是如何运转的。”
用户8639654
2021/10/21
7160
Django批量更新多个属性
有时候我们需要同时(一次性)更新某个用户的多条属性。 1. 用户model如下: class User(models.Model): UID = models.CharField('员工uid', max_length=200,) name = models.CharField('员工名字', max_length=200,) mobile = models.CharField('手机号', max_length=200,) mail = models.EmailField(u'邮箱', max_lengt
BigYoung小站
2020/05/04
2.1K0
一条更新语句是如何执行的?
之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?
王小明_HIT
2020/05/25
5320
【C++】Class中的属性和方法是如何存储的
在C++中对于一个Class,它内部的数据和方法到底是如何存储的呢?是将数据和方法都存储到Class的单个对象中呢,还是会将数据和方法分开来存储?如下图所示:
灰子学技术
2020/04/02
1.4K0

相似问题

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

19

无法更新组织属性

25

QML更新ListView中Item的属性

10

QT QML文本属性更新

271

如何通过动态更新属性来更新ListElement (QML)值字段

39
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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