在<;房地产>;将QML中的事件更改为一个

在<;房地产>;将QML中的事件更改为一个,qml,Qml,我在QML中创建了Canvas,它有多个属性Canvas将根据这些属性绘制一些内容,我想使用functionrequestPaint一次(如果某些属性/属性发生更改),因此我不必多次重画Canvas 有没有办法将多个onPropertyChanged事件合并为一个? 如果(onAChanged | | onBChanged),它将像一样工作 谢谢你的帮助 否,不能将多个属性更改信号合并到一个属性更改信号中。这对于依赖于信号的其他事物来说是有问题的 function doSomething() {

我在QML中创建了
Canvas
,它有多个属性
Canvas
将根据这些属性绘制一些内容,我想使用function
requestPaint
一次(如果某些属性/属性发生更改),因此我不必多次重画
Canvas

有没有办法将多个
onPropertyChanged
事件合并为一个? 如果(onAChanged | | onBChanged),它将像
一样工作


谢谢你的帮助

否,不能将多个属性更改信号合并到一个属性更改信号中。这对于依赖于信号的其他事物来说是有问题的

function doSomething() { ... }
onAChanged: doSomething()
onBChanged: doSomething()
但是,您可以将一个函数连接到多个信号

function doSomething() { ... }
onAChanged: doSomething()
onBChanged: doSomething()
您还可能发出一个信号:

signal someThingsChanged()
onAChanged: someThingsChanged()
onBChanged: someThingsChanged()
onSomeThingsChanged: { ... }
还可以使用[脚本]自动将on功能连接到多个/所有信号:


为了避免多次调用插槽,可以设置如下bool属性:

property bool dirty
并检查它,例如,每个渲染周期检查一次

我认为间隔为1的计时器应该完成这项工作


但是,您尝试执行的操作很可能是不必要的,因为
requestPaint
不会直接触发
paint
,并且这些请求的集合已经由
画布处理。作为证明,请参见以下小示例:

Timer {
    interval: 100
    running: true
    repeat: true
    onTriggered: {
        console.log('RequestPaint')
        cvs.requestPaint()
    }
}
Timer {
    interval: 100
    running: true
    repeat: true
    onTriggered: {
        console.log('RequestPaint')
        cvs.requestPaint()
    }
}
Timer {
    interval: 100
    running: true
    repeat: true
    onTriggered: {
        console.log('RequestPaint')
        cvs.requestPaint()
    }
}

Canvas {
    id: cvs
    width: 100
    height: 100
    onPainted: console.log('Painted')
    onPaint: {
        var ctx = getContext("2d");
        ctx.fillStyle = Qt.rgba(1, 0, 0, 1);
        ctx.fillRect(0, 0, width, height);
    }
}
三个计时器都调用
requestPaint
,但是
onpaint
只调用一次


如果要在多个属性发生更改时执行操作,但不想在一次调用多个属性时多次调用该操作,则可以使用。 它将在下一个事件循环中只调用函数一次

function someFunction() { /* ... */ }
onPropAChanged: Qt.callLater(someFunction)
onPropBChanged: Qt.callLater(someFunction)

然而,在你的情况下,它实际上是不需要的
requestPaint
不会直接导致绘制
Canvas
,它只是通知场景图需要重新绘制。一次性多次调用它只会导致画布的一次重新绘制。您可以通过在画布的
onDraw
控制台上打印一些内容来验证是否正确。

出于性能考虑,是否要避免多次调用
requestPaint
(例如,当两个属性同时更改时,您希望只调用一次
requestPaint
)或者只是为了有一个不太详细的语法?事实上:我没有对它进行任何测试,但我认为多次调用
requestPaint
并不可怕,因为
requestPaint
并不等于
paint
。我不知道用于决定何时绘制的算法,尽管:@GrecKo避免多次调用它,但是如果我在某些事情上调用
,{canvas.requestPaint()}
,它仍然会被调用两次并绘制两次,对吗?好的,谢谢你的帮助,我会这样做的solution@derM计时器的使用让我觉得很难闻,您正在不必要地花费资源。:)@eyllanesc:你是对的,因为
requestPaint
已经处理了那些东西。
Qt.callLater
有时会有bug。我不知道这个bug是否对这里有影响。很高兴知道。它不应该在这里产生影响,因为它不需要;)