How to manualy repaint invisible area of qml canvas?
-
Hi! I have some code i my handler onPaint in qml Canvas. I need that this code run when app was minimized and then save canvas to the file by save() canvas method. requestPaint() don't work. this method don't emit paint for region because region is invisible, i think. have you any decision? Thank you!
-
@pnmrvvtl What do you mean by invisible area ?
-
@p3c0 my app may be run background or minimized. and area must be repainted and then saved to external file for example "1.jpg"
i solve problem with background painting with signal paint(rect), but on method save() app get critical error...can anybody help me?Thanks... -
@pnmrvvtl How are you calling save ? What is the exact error ? Can you post an example ?
-
onGraphCreated: { canv.isGraphCreated = 1; canv.paint(0,0,canv.width,canv.height) canv.save("1.jpg") } /* */
canv is id of my canvas. graphcreated is my signal. this is text in qml/js console
ASSERT: "rf.isValid()" in file items\context2d\qquickcontext2dtexture.cpp, line 660 global\qglobal.cpp: 2810 -
@pnmrvvtl Looking at the source here (Line 660), the assert occurs when the rect (viz. here the canvas) is not valid. But I tested something similar on Linux and it works. Following is the code:
import QtQuick 2.4 Canvas { id: root width: 200 height: 200 property point initialpos : Qt.point(0,0) property point finalpos: Qt.point(0,0) property int count : 0 onPaint: { var ctx = getContext("2d") ctx.clearRect(0, 0, width, height); ctx.lineWidth = 2 ctx.strokeStyle = "red" ctx.beginPath() ctx.moveTo(initialpos.x,initialpos.y) ctx.lineTo(finalpos.x,finalpos.y) ctx.stroke() ctx.closePath() } Timer { interval: 1000; running: true; repeat: true onTriggered: { initialpos = Qt.point(Math.floor(Math.random() * 200) + 1,Math.floor(Math.random() * 200) + 1) finalpos = Qt.point(Math.floor(Math.random() * 200) + 1,Math.floor(Math.random() * 200) + 1) root.paint(0,0,root.width,root.height) root.save("/home/ashish/grab/"+count+++".jpg") } } }
This code just takes snaps of
Canvas
and save into directory after an interval of 1 sec. This works for me and there is no assert. Alsoroot.requestPaint()
instead ofroot.paint(0,0,root.width,root.height)
works even if the Window is minimized.
Can you test it on your system ?