一、畫布元素
自qt4.7發布qml以來,qml也在一直不斷的完善中,在qt4時代使用qml時如果需要異形圖,那我們只能讓設計師來切圖,這樣的感覺是很不爽的,總感覺開發沒有那么犀利。但是到了qt5這一點有所改變,qt引入了canvas畫圖,我們可以在程序中自定義一個畫布來繪制自己想要的圖形,然后達到我們自己想要的效果。
二、效果預覽
圖1 canvas畫布
三、源碼分析
代碼量都是算法,這個我就不解釋了(主要是看不懂),控件中就包含了一個Canvas畫布,然后在畫布的onPaint函數中繪制圖形
1 import QtQuick 2.2 2 3 Rectangle{ 4 width: 300; 5 height: 300; 6 7 //自定義畫布 8 Canvas { 9 id: root; 10 anchors.fill: parent; 11 12 //再次函數中繪制圖形 13 onPaint: { 14 var ctx = getContext("2d"); 15 draw(ctx); 16 } 17 18 function draw (ctx) { 19 ctx.fillRect(0, 0, 300, 300); 20 for (var i = 0; i < 3; i++) { 21 for (var j = 0; j < 3; j++) { 22 ctx.save(); 23 ctx.strokeStyle = "#9CFF00"; 24 ctx.translate(50 + j * 100, 50 + i * 100); 25 drawSpirograph(ctx, 20 * (j + 2) / (j + 1), -8 * (i + 3) / (i + 1), 10); 26 ctx.restore(); 27 } 28 } 29 } 30 31 function drawSpirograph (ctx, R, r, O) { 32 var x1 = R - O; 33 var y1 = 0; 34 var i = 1; 35 ctx.beginPath(); 36 ctx.moveTo(x1, y1); 37 do { 38 if (i > 20000) break; 39 var x2 = (R + r) * Math.cos(i * Math.PI / 72) - (r + O) * Math.cos(((R + r) / r) * (i * Math.PI / 72)) 40 var y2 = (R + r) * Math.sin(i * Math.PI / 72) - (r + O) * Math.sin(((R + r) / r) * (i * Math.PI / 72)) 41 ctx.lineTo(x2, y2); 42 x1 = x2; 43 y1 = y2; 44 i++; 45 } while (x2 != R-O && y2 != 0 ); 46 ctx.stroke(); 47 } 48 } 49 }
四、相關文章