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