Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Canvas issue
Forum Updated to NodeBB v4.3 + New Features

Canvas issue

Scheduled Pinned Locked Moved Solved QML and Qt Quick
15 Posts 2 Posters 3.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P peteritv

    Maybe I spoke before I knew what was really going on...

    It might help if you post the sceleton of your application, so we can see the context.

    T Offline
    T Offline
    Tikani
    wrote on last edited by Tikani
    #5

    @peteritv Here you can see entire main.qml:

    import QtQuick 2.7
    import QtQuick.Window 2.2
    import QtQuick.Controls 2.0
    
    Window {
        id: "window"
        visible: true
        width: 640
        height: 480
        maximumHeight: height
        maximumWidth: width
        minimumHeight: height
        minimumWidth: width
        color: "white"
        title: "Однослойный перцептрон"
    
        Component.onCompleted: {
            setX(Screen.width/2 - width/2)
            setY(Screen.height/2 - height/2)
            neuro.loadWeights()
        }
    
        property int xpos
        property int ypos
        property bool hold
        property bool clearCanvas:false
    
        Canvas {
            id:canvas
            anchors.top: parent.top
            width: 640
            height: 410
    
            onPaint: {
                var ctx = getContext('2d')
                if(clearCanvas) {
                    ctx.fillStyle = "white"
                    ctx.fillRect(0,0,width,height)
                    clearCanvas=false
                }
                else {
                    ctx.lineCap = "round"
                    ctx.lineWidth = 30
                    ctx.strokeStyle = 'blue'
                    ctx.beginPath()
                    ctx.moveTo(xpos,ypos)
                    xpos = area.mouseX
                    ypos = area.mouseY
                    ctx.lineTo(xpos, ypos)
                    ctx.stroke()
                }
            }
    
            MouseArea {
                id:area
                anchors.fill: parent
                acceptedButtons: Qt.LeftButton | Qt.RightButton
    
                onPressed: {
                    if(mouse.buttons & Qt.LeftButton) {
                        hold=true
                        xpos = mouseX
                        ypos = mouseY
                    }
                }
    
                onPositionChanged: {
                    if(hold & (mouse.buttons & Qt.LeftButton)) {
                        canvas.requestPaint()
                    }
                }
    
                onReleased: {
                    hold = false
                }
    
                onClicked: {
                    infoArea.visible = false
                }
            }
        }
    
            Button {
            id:recognize
            anchors.bottom: parent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            height: 50
            width: 300
            anchors.bottomMargin: 8
            text:"Распознать"
    
            onClicked: {
                var image = canvas.getContext('2d').getImageData(0,0,canvas.width,canvas.height)
                var norm_px = []
    
                for(var i = 0, n=image.data.length; i<n; i+=4) {
                    if(image.data[i]===0 && image.data[i+1]===0 && image.data[i+2]===255 && image.data[i+3]===255) {
                        norm_px.push(1)
                    }
                    else
                    {
                        norm_px.push(0)
                    }
                }
    
                neuro.signal = norm_px
    
                neuro.calculate()
    
                if  (neuro.exitSignal===1) {
                    recognitionState.text="\u03F4"
                    recognitionState.color="green"
                }
                else if (neuro.exitSignal===2) {
                    recognitionState.text="\u03A8"
                    recognitionState.color="green"
                }
                else {
                    recognitionState.text="\u2205"
                    recognitionState.color="red"
                }
    
                infoArea.visible = true
                exitInfo.text = "\u03F4: "+ neuro.exitTheta.toFixed(5) + " " + "\u03A8: " + neuro.exitPsi.toFixed(5);
    
                canvas.requestPaint()
                clearCanvas=true
            }
        }
    
            Rectangle {
                visible: false
                id: "infoArea"
                anchors.horizontalCenter: canvas.horizontalCenter
                anchors.verticalCenter: canvas.verticalCenter
                width: 200
                height: 200
                color: "white"
                border.color: "black"
                border.width: 3
                radius: 10
    
                Text {
                    anchors.horizontalCenter: parent.horizontalCenter
                    anchors.verticalCenter: parent.verticalCenter
                    id:recognitionState
                    text:"\u03F4"
                    font.family: "Helvetica"
                    font.pointSize: 100
                    color: "green"
                }
    
                MouseArea {
    
                    id: "hoverArea"
                    anchors.fill: parent
                    hoverEnabled: true
    
                    ToolTip {
                        id:"exitInfo"
                        visible: hoverArea.containsMouse
                    }
                }
          }
    }
    

    Only the color of mouse traces is defined correctly, unlike the background and it's strange.

    P.S. Sorry for my English, it is my second language, I will try to be more clear if you don't understand something in my posts.

    1 Reply Last reply
    0
    • P Offline
      P Offline
      peteritv
      wrote on last edited by
      #6

      After reading some docs, I am sure you are not telling something.

      You want to draw on something that is white, correct?
      So your canvas must be a child of something that is white.

      For instance:
      Rectangle { color: white; Canvas { ... } }

      Is that the case here?

      T 1 Reply Last reply
      0
      • P peteritv

        After reading some docs, I am sure you are not telling something.

        You want to draw on something that is white, correct?
        So your canvas must be a child of something that is white.

        For instance:
        Rectangle { color: white; Canvas { ... } }

        Is that the case here?

        T Offline
        T Offline
        Tikani
        wrote on last edited by
        #7

        @peteritv Yes, you are correct. In my case I set Canvas as a child of a white Window, but Context2D shows me, suddenly, that the canvas is the child of the black Window. Though it is displayed as white.

        1 Reply Last reply
        0
        • P Offline
          P Offline
          peteritv
          wrote on last edited by
          #8

          OK, I just run your example, and it seems to work.

          I have a white background on which I can draw.
          When I draw I see the traces of my mouse with a big "point" size.
          Draw color is blue.

          Everything seems to work.

          Now, since I don't have your "Neuro" file, THAT may be your problem...

          1 Reply Last reply
          0
          • P Offline
            P Offline
            peteritv
            wrote on last edited by
            #9

            We have a synchronisation issue here to :)

            So when you run your program, you are drawing on a black thing?

            1 Reply Last reply
            0
            • P Offline
              P Offline
              peteritv
              wrote on last edited by
              #10

              Where/How do you use Context2D?

              1 Reply Last reply
              0
              • P Offline
                P Offline
                peteritv
                wrote on last edited by
                #11

                Ahhhh! I understand now! (I think)

                You think that what ever background you choose, it will be part of your canvas?
                That is NOT the case!

                The canvas just is a container for some points being drawn!

                For instance, you can take the canvas, and put it on something else like a red Rectangle.
                It will still have the same points, but now on a red background.

                In other words, the canvas does NOT hold any information at all about the background. It just knows about some pixels.

                1 Reply Last reply
                1
                • P Offline
                  P Offline
                  peteritv
                  wrote on last edited by
                  #12

                  So in your case, you need to fill your Canvas with white pixels itself.

                  So with ur ctx functions, draw a white rectangle first, which will be the base of your canvas for drawing on.

                  1 Reply Last reply
                  1
                  • P Offline
                    P Offline
                    peteritv
                    wrote on last edited by
                    #13

                    So, instead of making your parent white:

                    Within your canvas, draw a white rectangle on start,
                    and then start drawing on that

                    1 Reply Last reply
                    1
                    • P Offline
                      P Offline
                      peteritv
                      wrote on last edited by
                      #14

                      But that explaines why you see "black" instead of "white" on your Context2D

                      I am assuming you are just interested in the points, and not the background, for further processing.
                      So forget about the canvas background, ok?

                      T 1 Reply Last reply
                      1
                      • P peteritv

                        But that explaines why you see "black" instead of "white" on your Context2D

                        I am assuming you are just interested in the points, and not the background, for further processing.
                        So forget about the canvas background, ok?

                        T Offline
                        T Offline
                        Tikani
                        wrote on last edited by Tikani
                        #15

                        @peteritv Huge thanks, I finnally got what's going on! A visible background of working application is just a result of visual compositing the Canvas with it's parent and these two does not share any properties between each other. Thanks a lot again, I think it is very important to know such nuances.

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved