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. Change component's child propery from javascript file
Forum Updated to NodeBB v4.3 + New Features

Change component's child propery from javascript file

Scheduled Pinned Locked Moved Solved QML and Qt Quick
21 Posts 3 Posters 3.9k Views
  • 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.
  • behruz montazeriB behruz montazeri

    I have this error :

    qrc:/ColorFunc.js:3: ReferenceError: rectId is not defined
    

    My qml file is Rect50.qml :

    import "ColorFunc.js" as MyColor
    ............
    
    onPressed: MyColor.changeColor(colorM)
    

    My extrnal javascript file ColorFunc.js :

    function changeColor(param1) {
    
            rectId.color = param1;
    }
    
    
    DiracsbracketD Offline
    DiracsbracketD Offline
    Diracsbracket
    wrote on last edited by Diracsbracket
    #6

    Hi @behruz-montazeri
    With the full code, that was so much easier to understand and to test ...

    Change the following:

    onPressed: MyColor.changeColor(rectId, colorM)
    

    and

    function changeColor(rectId, param1) {
        rectId.color = param1;
    }
    

    The reason your code does not work is that the ID you define inside a Component's Item has no meaning in the context after it is created.

    behruz montazeriB 1 Reply Last reply
    1
    • DiracsbracketD Diracsbracket

      Hi @behruz-montazeri
      With the full code, that was so much easier to understand and to test ...

      Change the following:

      onPressed: MyColor.changeColor(rectId, colorM)
      

      and

      function changeColor(rectId, param1) {
          rectId.color = param1;
      }
      

      The reason your code does not work is that the ID you define inside a Component's Item has no meaning in the context after it is created.

      behruz montazeriB Offline
      behruz montazeriB Offline
      behruz montazeri
      wrote on last edited by
      #7

      @Diracsbracket
      Thanks it works. I want to make a same game ,when player click on each list element check with last click
      and if it's same fruit as current click do something. Do you know what's the name of this kinda game ?
      is there any example to learn from ?

      DiracsbracketD 1 Reply Last reply
      0
      • behruz montazeriB behruz montazeri

        @Diracsbracket
        Thanks it works. I want to make a same game ,when player click on each list element check with last click
        and if it's same fruit as current click do something. Do you know what's the name of this kinda game ?
        is there any example to learn from ?

        DiracsbracketD Offline
        DiracsbracketD Offline
        Diracsbracket
        wrote on last edited by
        #8

        @behruz-montazeri
        You mean a Matching Game like this one:
        https://www.youtube.com/watch?v=QsLG-1CbfTQ
        I think you are well on your way to succeed.

        However, the use of an extra ItemDelegate in your Component definition is somewhat redundant. You could it improve it by doing e.g.:

                    Component{
                        id:mComponent
        
                       MouseArea {
                            id: mouseArea
                            width:parent.width
                            height: rectId.height
        
                            Rectangle{
                                id:rectId
                                width: parent.width
                                height: 80
                                border.width: 6
                                border.color: "black"
        
                                color: mouseArea.containsPress ? colorM : "firebrick"
        
                                Text {
        
                                    anchors.verticalCenter: parent.verticalCenter
                                    x:30
        
                                    id: txt1
                                    text: name
                                    font.pixelSize: 25
                                }
                                Image {
                                    anchors.centerIn: parent
                                    width:70
                                    height: width
                                    id: mPic
                                    source: msource
                                }
                            }
                        }
                    }
        
        1 Reply Last reply
        1
        • behruz montazeriB Offline
          behruz montazeriB Offline
          behruz montazeri
          wrote on last edited by
          #9

          How to make a variable static inside java script each time i click lastColor get the same value.
          How can i prevent that ?

          function changeColor(rectId, param1) {
          
              var   lastColor ="#ffffff"
              console.log("last Color: "+lastColor)
              console.log("ColorM: "+param1)
          
              if(lastColor === param1 ){
                  console.log("Second");
                   rectId.color = param1
                  lastColor = "#ffffff";
                  return
              }
              if(lastColor == "#ffffff"){
                  rectId.color = param1
                  lastColor = param1;
          
                  console.log("First");
          
              }
          
              else console.log(lastColor)
          
          }
          
          DiracsbracketD 1 Reply Last reply
          0
          • behruz montazeriB behruz montazeri

            How to make a variable static inside java script each time i click lastColor get the same value.
            How can i prevent that ?

            function changeColor(rectId, param1) {
            
                var   lastColor ="#ffffff"
                console.log("last Color: "+lastColor)
                console.log("ColorM: "+param1)
            
                if(lastColor === param1 ){
                    console.log("Second");
                     rectId.color = param1
                    lastColor = "#ffffff";
                    return
                }
                if(lastColor == "#ffffff"){
                    rectId.color = param1
                    lastColor = param1;
            
                    console.log("First");
            
                }
            
                else console.log(lastColor)
            
            }
            
            DiracsbracketD Offline
            DiracsbracketD Offline
            Diracsbracket
            wrote on last edited by
            #10

            @behruz-montazeri
            Do a Google search for that: JavaScript + static local variable.
            e.g. https://stackoverflow.com/questions/1535631/static-variables-in-javascript

            behruz montazeriB 1 Reply Last reply
            2
            • DiracsbracketD Diracsbracket

              @behruz-montazeri
              Do a Google search for that: JavaScript + static local variable.
              e.g. https://stackoverflow.com/questions/1535631/static-variables-in-javascript

              behruz montazeriB Offline
              behruz montazeriB Offline
              behruz montazeri
              wrote on last edited by
              #11

              @Diracsbracket
              I did one. I changed my function. But here's another problem it work for only one qml file and if we call it from another qml file counter is Zero.

              function changeColor(rectId, param1) {
                  if( typeof changeColor.counter == 'undefined' ) {
                      changeColor.counter  = 0;
                  }
                  changeColor.counter++
              }
              
              DiracsbracketD 1 Reply Last reply
              0
              • behruz montazeriB behruz montazeri

                @Diracsbracket
                I did one. I changed my function. But here's another problem it work for only one qml file and if we call it from another qml file counter is Zero.

                function changeColor(rectId, param1) {
                    if( typeof changeColor.counter == 'undefined' ) {
                        changeColor.counter  = 0;
                    }
                    changeColor.counter++
                }
                
                DiracsbracketD Offline
                DiracsbracketD Offline
                Diracsbracket
                wrote on last edited by
                #12

                @behruz-montazeri
                Then use a global JS variable.

                behruz montazeriB 1 Reply Last reply
                1
                • DiracsbracketD Diracsbracket

                  @behruz-montazeri
                  Then use a global JS variable.

                  behruz montazeriB Offline
                  behruz montazeriB Offline
                  behruz montazeri
                  wrote on last edited by
                  #13

                  @Diracsbracket
                  Yes that's the case.

                   property int counter: 0
                  
                  DiracsbracketD 1 Reply Last reply
                  0
                  • behruz montazeriB behruz montazeri

                    @Diracsbracket
                    Yes that's the case.

                     property int counter: 0
                    
                    DiracsbracketD Offline
                    DiracsbracketD Offline
                    Diracsbracket
                    wrote on last edited by
                    #14

                    @behruz-montazeri
                    that's not a JS variable. That's a QML object property.

                    behruz montazeriB 1 Reply Last reply
                    0
                    • DiracsbracketD Diracsbracket

                      @behruz-montazeri
                      that's not a JS variable. That's a QML object property.

                      behruz montazeriB Offline
                      behruz montazeriB Offline
                      behruz montazeri
                      wrote on last edited by
                      #15

                      @Diracsbracket
                      Where can i declare a javascript global variable ?

                      DiracsbracketD 1 Reply Last reply
                      0
                      • behruz montazeriB behruz montazeri

                        @Diracsbracket
                        Where can i declare a javascript global variable ?

                        DiracsbracketD Offline
                        DiracsbracketD Offline
                        Diracsbracket
                        wrote on last edited by Diracsbracket
                        #16

                        @behruz-montazeri said in Change component's child propery from javascript file:

                        @Diracsbracket
                        Where can i declare a javascript global variable ?

                        In a javascript file. Otherwise create a property at a top-level QML object, e.g. your main window, which exists for the duration of your app.

                        behruz montazeriB 1 Reply Last reply
                        0
                        • DiracsbracketD Diracsbracket

                          @behruz-montazeri said in Change component's child propery from javascript file:

                          @Diracsbracket
                          Where can i declare a javascript global variable ?

                          In a javascript file. Otherwise create a property at a top-level QML object, e.g. your main window, which exists for the duration of your app.

                          behruz montazeriB Offline
                          behruz montazeriB Offline
                          behruz montazeri
                          wrote on last edited by behruz montazeri
                          #17

                          @Diracsbracket
                          I guess creating property make seance in my situation. making a Javascript file variable doesn't keep track of increasing despite the several calls from different QML files.

                          DiracsbracketD 1 Reply Last reply
                          0
                          • behruz montazeriB behruz montazeri

                            @Diracsbracket
                            I guess creating property make seance in my situation. making a Javascript file variable doesn't keep track of increasing despite the several calls from different QML files.

                            DiracsbracketD Offline
                            DiracsbracketD Offline
                            Diracsbracket
                            wrote on last edited by Diracsbracket
                            #18

                            @behruz-montazeri said in Change component's child propery from javascript file:

                            I guess creating property make seance in my situation.

                            That's usually the best way indeed.

                            making a Javascript file variable doesn't keep track of increasing despite the several calls from different QML files.

                            You can do it, if you really need it:
                            http://doc.qt.io/qt-5/qtqml-javascript-resources.html#shared-javascript-resources-libraries

                            behruz montazeriB 1 Reply Last reply
                            0
                            • DiracsbracketD Diracsbracket

                              @behruz-montazeri said in Change component's child propery from javascript file:

                              I guess creating property make seance in my situation.

                              That's usually the best way indeed.

                              making a Javascript file variable doesn't keep track of increasing despite the several calls from different QML files.

                              You can do it, if you really need it:
                              http://doc.qt.io/qt-5/qtqml-javascript-resources.html#shared-javascript-resources-libraries

                              behruz montazeriB Offline
                              behruz montazeriB Offline
                              behruz montazeri
                              wrote on last edited by behruz montazeri
                              #19

                              @Diracsbracket

                              I have a list view i want to change the color of all rectangle inside of component with Javascript.

                                  ListView{
                                      id:fruitList
                                      anchors.fill: parent
                                      model: mModel
                                      delegate: mComponent
                                      highlight: Rectangle{
                                          width: parent.width
                                          color: "red"
                                      }
                                      Component{
                                          id:mComponent
                                         Item {
                                              width:parent.width
                                              height: rectId.height
                                              Rectangle{
                                                  id:rectId
                                                  width: parent.width
                                                  height: 80
                                                  border.width: 6
                                                  border.color: "black"
                              
                                                  Image {
                                                      anchors.centerIn: parent
                                                      width:70
                                                      height: width
                                                      id: mPic
                                                      source: msource
                                                  }
                                                  ItemDelegate{
                                                      anchors.fill: parent
                                                      onClicked: {
                                                          MyColor.changeColor(rectId,colorM)
                                                          mText =  MyColor.textReturn("page1")
                                                     } 
                              
                                                  }
                                              }
                              
                                          }
                                      }
                              

                              in Javascript :

                              function resetList()
                              {
                                  for (var entry = 0; entry < fruitList.count; ++entry) {
                                      
                                       // rectId.color = "white'
                                  }
                              }
                              
                              DiracsbracketD 1 Reply Last reply
                              0
                              • behruz montazeriB behruz montazeri

                                @Diracsbracket

                                I have a list view i want to change the color of all rectangle inside of component with Javascript.

                                    ListView{
                                        id:fruitList
                                        anchors.fill: parent
                                        model: mModel
                                        delegate: mComponent
                                        highlight: Rectangle{
                                            width: parent.width
                                            color: "red"
                                        }
                                        Component{
                                            id:mComponent
                                           Item {
                                                width:parent.width
                                                height: rectId.height
                                                Rectangle{
                                                    id:rectId
                                                    width: parent.width
                                                    height: 80
                                                    border.width: 6
                                                    border.color: "black"
                                
                                                    Image {
                                                        anchors.centerIn: parent
                                                        width:70
                                                        height: width
                                                        id: mPic
                                                        source: msource
                                                    }
                                                    ItemDelegate{
                                                        anchors.fill: parent
                                                        onClicked: {
                                                            MyColor.changeColor(rectId,colorM)
                                                            mText =  MyColor.textReturn("page1")
                                                       } 
                                
                                                    }
                                                }
                                
                                            }
                                        }
                                

                                in Javascript :

                                function resetList()
                                {
                                    for (var entry = 0; entry < fruitList.count; ++entry) {
                                        
                                         // rectId.color = "white'
                                    }
                                }
                                
                                DiracsbracketD Offline
                                DiracsbracketD Offline
                                Diracsbracket
                                wrote on last edited by
                                #20

                                @behruz-montazeri
                                I think this thread is closed. Thanks.

                                behruz montazeriB 1 Reply Last reply
                                0
                                • DiracsbracketD Diracsbracket

                                  @behruz-montazeri
                                  I think this thread is closed. Thanks.

                                  behruz montazeriB Offline
                                  behruz montazeriB Offline
                                  behruz montazeri
                                  wrote on last edited by
                                  #21

                                  @Diracsbracket
                                  Is it possible to ask in new topic ?

                                  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