Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript qml属性更新是如何组织的?_Javascript_Qt_Qml - Fatal编程技术网

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

Javascript qml属性更新是如何组织的?,javascript,qt,qml,Javascript,Qt,Qml,我正在我的UI项目中尝试使用信号。我想要一个按钮来启动一些进程。当我这么做的时候,我意识到我不明白发生了什么,所以我写了下面的代码,试图指出发生了什么 运行时,main.qml将创建一些彩色框作为控件,并创建一些白色框作为输出(由SubOne.qml制成) 如果单击绿色框,它将发出信号“广播”,并且每个白色框都连接到该信号 在“广播”中,每个白色框调用其功能栏 酒吧开始循环。在循环结束时,它打印迭代次数,并更改文本属性以显示相同的次数 第一个和第三个白框执行1个循环,但第二个白框执行足够多的循环

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

运行时,main.qml将创建一些彩色框作为控件,并创建一些白色框作为输出(由SubOne.qml制成)

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

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

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

第一个和第三个白框执行1个循环,但第二个白框执行足够多的循环,从而导致明显的延迟

好的,一切似乎都很好。正如预期的那样,三个功能栏按顺序调用,并按顺序输出它们的打印。但我惊讶地发现文本属性没有按顺序更新。相反,所有栏都会完成,然后所有三个文本属性都会一起更新

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

谁能告诉我发生了什么事?qml是否在优化对显示器的写入?如果是的话,是否可以控制

主要是,如何使打印和文本更新在每个循环退出后同时进行

谢谢你的帮助

//qml.main

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

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()
    }
}
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

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})
}
WorkerScript.onMessage=function(obj){
打印(“循环”+obj.nameVal+”到:“+obj.loopVal”);

对于(var counter=0;counterQML在这里没有做什么-你做了,因为你阻止了事件循环。当你的代码运行时,事件循环没有,QML没有办法做任何显示更新。你必须将控制权交还给事件循环,以便显示更新。这与基于小部件的UI没有什么不同。你必须那里也有同样的行为。

QML在这里没有做什么-你做了,因为你正在阻止事件循环。当你的代码运行时,事件循环没有,QML也无法进行任何显示更新。你必须将控制权交还给事件循环,以便显示更新。这与基于小部件的UI没有什么不同。你需要也有相同的行为。

正如Kuba Ober指出的那样,您正在阻止主线程。GUI在同一线程中更新。您应该将有问题的代码卸载到工作线程。尝试寻找一种可能的方法。哦,是的,当然。我应该想到这一点。我将重写它以使用WorkerScript,并将其作为其他线程发布尽快。谢谢你们。正如Kuba Ober指出的,你们正在阻止主线程。GUI在同一个线程中更新。你们应该将有问题的代码卸载到一个工作线程。尝试寻找一种可能的方法。哦,是的,当然。我应该想到这一点。我将重写它以使用WorkerScript,并将其发布给其他人我会尽快的谢谢你们。