找回密码
 立即注册
收起左侧

关于Canvas绘图的一些问题

4
回复
6464
查看
[复制链接]
累计签到:3 天
连续签到:1 天
来源: 2016-11-5 22:33:22 显示全部楼层 |阅读模式
5Qter豆
贴出两段代码,第一段代码保存在MyCanvas.qml文件中。
  1. import QtQuick 2.6

  2. Rectangle{
  3.     id:rect
  4.     readonly property color color_normal:  "white"//Qt.rgba(0.8824,0.8824,0.8824,1.0)//Qt.rgba(0.9412,0.9412,0.9412,1.0)
  5.     readonly property color color_hover: Qt.rgba(0.898,0.9451,0.9843,1.0)
  6.     readonly property color color_click: Qt.rgba(0.8039,0.8941,0.9686,1.0)
  7.     readonly property color color_border: Qt.rgba(0,0.4706,0.8431,1.0)
  8.     property var dat: [151,0.0489,0.1]
  9.     property int acous: 0
  10.     property int datastream: 0
  11.     property real percent: 1.0
  12.     property point nextUp
  13.     property point  nextDown
  14.     property bool paintFlag: false
  15.     signal clicked
  16.     signal deletemyself

  17.     function painting(){
  18.         rect.width=400*percent*dat[2]+6
  19.         rect.height=400*percent*dat[1]+6
  20.         plate.width=width-4
  21.         plate.height=height-4
  22.         plate.x=2
  23.         plate.y=2
  24.         plate.canvasSize.width=plate.width
  25.         plate.canvasSize.height=plate.height
  26.         paintFlag=true
  27.         plate.requestPaint()
  28.         console.log("3"+rect.paintFlag)
  29.     }

  30.     onPercentChanged: {
  31.         console.log("1"+rect.paintFlag)
  32.         painting()
  33.     }


  34.     width: 10
  35.     height: 10
  36.     border.color: color_border
  37.     border.width: focus?1:0
  38.     color: color_normal

  39.     MouseArea{
  40.         anchors.fill: parent
  41.         hoverEnabled: true
  42.         acceptedButtons: Qt.LeftButton|Qt.RightButton

  43.         onClicked: parent.clicked()

  44.         onPressed: {
  45.             parent.color=parent.color_click
  46.             parent.focus=true
  47.         }
  48.         onReleased: parent.color=parent.color_hover
  49.         onEntered: {
  50.             parent.color=parent.color_hover;
  51.             parent.border.width=1
  52.         }
  53.         onExited: {
  54.             parent.color=parent.color_normal;
  55.             parent.border.width=Qt.binding(function(){return parent.focus?1:0})
  56.         }
  57.     }

  58.     Canvas{
  59.         id:plate
  60.         contextType: "2d"
  61.         onPaint: {
  62.             console.log("2"+rect.paintFlag)
  63.             context.clearRect(0,0,plate.width,plate.height)
  64.             if(rect.paintFlag){
  65.                 context.lineWidth=2
  66.                 context.strokeStyle="red"
  67.                 var d=rect.dat[1]
  68.                 var L=rect.dat[2]
  69.                 var pe=400*rect.percent
  70.                 context.moveTo(1,1)
  71.                 context.lineTo(L*pe+1,1)
  72.                 context.moveTo(1,d*pe+1)
  73.                 context.lineTo(L*pe+1,d*pe+1)
  74.                 context.stroke()
  75.                 rect.paintFlag=false
  76.             }
  77.         }
  78.     }
  79. }
复制代码
第二段代码,保存在Canva.qml文件中。
  1. import QtQuick 2.6
  2. import QtQuick.Window 2.2

  3. Window {
  4.     visible: true
  5.     width: 640
  6.     height: 480
  7.     MyCanvas{
  8.         id:mycan
  9.         x:100
  10.         y:50
  11.     }

  12.     MouseArea{
  13.         anchors.fill: parent
  14.         z:-1
  15.         onClicked: mycan.percent+=1
  16.     }
  17. }
复制代码
第二段代码对第一段代码进行了简单的调用。但是对于输出结果我有些不明白!
问题一:注意输出窗口的输出顺序:

   为什么先输出3,在输出2??
问题二:多次点击界面空白部分,界面显示如下:

为什么两根长的红线之间的短的红线没有被清除??如果想要清除,应该如何处理?

求大神解答。。。。万分感谢



附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-11-7 10:07:47 显示全部楼层
第二个问题我已经解决了,第一个问题如何解决?
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-11-12 18:09:20 显示全部楼层
第一个问题我也已经解决了。。。。我能自己给自己解题么?
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-11-12 18:10:03 显示全部楼层
我自己都解决了。。。。这论坛。。。。叫论坛???
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-11-21 11:06:10 显示全部楼层
我来把这两个问题的解决思路说一说,以免后来的人走弯路。

第一个问题:Canvas的绘图策略不是立即绘制,是系统选择在某个合适的时候绘制,并且绘制结束了会发出Painted信号,如果需要绘图后的相关参数计算,可以在onPainted事件中处理

第二个问题:每次需要重新绘制canvas上面的图像时,加入beginpath指令。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了