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. Trigger an item's signal from outside javascript function
QtWS25 Last Chance

Trigger an item's signal from outside javascript function

Scheduled Pinned Locked Moved Solved QML and Qt Quick
3 Posts 2 Posters 862 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.
  • G Offline
    G Offline
    gaess
    wrote on last edited by gaess
    #1

    Hello Qt forum. I couldnt find the answer for my problem through searching. So im posting my first question here.
    I'm wondering if I could trigger an item's signal from a javascript function that lives outside the item (but in the same parent item aka qml-file).
    I'm trying to illustrate my problem with a generic example below. It's stripped to the things related to my question and not working as such but should give the idea.

    RowLayout {
        function fillInExistingData() {
    
            for (var i = 0; i < queryModelPtr.fieldCount(); i++) {
                var fieldData = queryModelPtr.getFieldData(i)
                var fieldName = fieldData[0].toLowerCase()+fieldData[1]
                try  { // try catch block necessary that loop doesn't stop on unknown fieldName
                    eval(fieldName).fieldText = fieldData[2]  // not recommended, but only way I know of
                } catch (exception) { console.log( "ERROR: " + fieldName + " doesn't exist")}
            }
        }
        ScrollView {
    
            TextArea {
                id: textInput
                onEditingFinished: dataEditFinished(inputTable, inputDataset,text)
                onTextChanged: dataChanged(inputTable, inputDataset,text)
                text: fieldText
            }
            ComboBox {
                id: comboInput
                (...)
                onAccepted: {
                    dataChanged(inputTable, inputDataset, index)
                }
                onActivated: {
                    dataEditFinished(inputTable, inputDataset,index)
                }
                Component.onCompleted: dataEditFinished(inputTable, inputDataset,comboInput.currentIndex)
            }
    
        }
    }
    

    I'm having a form with TextAreas and ComboBoxes. Users can fill in their information or can copy existing information from the data base with a copy button. The function fillInExistingData then populates my ComboBoxes and TextAreas. Every time that an item's data is changed, the input is stored in a temporary QHash in my C++-Object derived from QSqlQueryModel.
    Now, this design has the drawback that my dataChanged() signal is emitted on every character that my users are typing in. Much leaner would be using the editingFinished() signal. But this signal will not be emitted when data is filled in by the javascript function. I also cannot call my dataEditFinished Function directly from the Javascript function, because Comboboxes will return the currentIndex and TextAreas will return the text.

    So I would liketo trigger the editingFinished Signal from Javascript after filling in data in a TextArea or ComboBox. Something like this:

        function fillInExistingData() {
    
            for (var i = 0; i < queryModelPtr.fieldCount(); i++) {
               (...)
                try  {
                    eval(fieldName).fieldText = fieldData[2]  
                   eval(fieldName).editingFinished()
                } catch (exception) { console.log( "ERROR: " + fieldName + " doesn't exist")}
            }
        }
    
    

    But this doesn't work. Any Ideas how I could trigger this signal?

    1 Reply Last reply
    0
    • dheerendraD Offline
      dheerendraD Offline
      dheerendra
      Qt Champions 2022
      wrote on last edited by
      #2

      You can do that. Just see the example below. Your requirement is very similar to this. May be you have problem because editFinished() is given by the TextEdit itself. So you need to catch it and send your own signals. Following example may help u.

      import QtQuick 2.8
      import QtQuick.Window 2.2

      Window {
      visible: true
      width: 640
      height: 480
      title: qsTr("Hello World")

      function sendSignal() {
          top.sendMe();
      }
      
      Rectangle {
          id  : top
          signal sendMe();
          anchors.fill: parent
          anchors.margins: -10
          color: "transparent"
          border.width: 1
      }
      
      Connections {
          target: top
          onSendMe:{
              console.log("pthinks.com")
          }
      }
      
      MouseArea {
          anchors.fill: parent
          onClicked: {
              sendSignal()
          }
      }
      

      }

      Dheerendra
      @Community Service
      Certified Qt Specialist
      http://www.pthinks.com

      1 Reply Last reply
      3
      • G Offline
        G Offline
        gaess
        wrote on last edited by
        #3

        Thank you for your help dheerendra. Going through my code again, it turns out that I was calling my TextArea's parent component instead of the TextArea itself. Solved it now with a function inside my component that is then in turn calling the TextArea's signal. Will mark it as solved.

        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