最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

qt - How to call a Javascript function defined in a QML file from another QML file? - Stack Overflow

programmeradmin2浏览0评论
     ...<other code>
     MouseArea
      {
        anchors.fill: parent

        onClicked:
        {
          console.log ("You clicked on tab!");


          TabContainers.tabClicked (index);
        }
      }
     ...<other code>

This code in the file X.qml. Another file named TabContainers.qml contains a function named tabClicked.

I wish to call that function in file X.qml, so I tried:
TabContainers.tabClicked (index);

This gave me the error:
ReferenceError: TabContainers is not defined

How to call a function defined in a QML file in another QML file?

UPDATE:


This is what I tried:

TestB.qml

import QtQuick 2.0

Rectangle 
{
  id: myItem
  width: 100; height: 100

  function f ()
  {
    console.log ("sadsad");
  }
}

TestA.qml

import QtQuick 2.0

Item 
{
  width: 100; height: 100

  Loader 
  {
    id: myLoader
    source: "TestB.qml"
  }

  Connections 
  {
    target: myLoader.f()
  }
}

and the error I get is:
TestA.qml:15: TypeError: Object [object Object] has no method 'f'

     ...<other code>
     MouseArea
      {
        anchors.fill: parent

        onClicked:
        {
          console.log ("You clicked on tab!");


          TabContainers.tabClicked (index);
        }
      }
     ...<other code>

This code in the file X.qml. Another file named TabContainers.qml contains a function named tabClicked.

I wish to call that function in file X.qml, so I tried:
TabContainers.tabClicked (index);

This gave me the error:
ReferenceError: TabContainers is not defined

How to call a function defined in a QML file in another QML file?

UPDATE:


This is what I tried:

TestB.qml

import QtQuick 2.0

Rectangle 
{
  id: myItem
  width: 100; height: 100

  function f ()
  {
    console.log ("sadsad");
  }
}

TestA.qml

import QtQuick 2.0

Item 
{
  width: 100; height: 100

  Loader 
  {
    id: myLoader
    source: "TestB.qml"
  }

  Connections 
  {
    target: myLoader.f()
  }
}

and the error I get is:
TestA.qml:15: TypeError: Object [object Object] has no method 'f'

Share Improve this question edited Oct 16, 2013 at 12:23 Aquarius_Girl asked Oct 16, 2013 at 8:45 Aquarius_GirlAquarius_Girl 23k69 gold badges249 silver badges441 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 3

From here:

Instead of this:

myLoader.item.f()

I was rather calling f() like this: myLoader.f()

You need to load a TabContainers instance in your current QML and call the function tabClicked() on it for it to work.

If your TabContainers instance is loaded in another QML file of your application you could also define a signal in one of their mon ancestor and emit the signal in X.qml and catch it in TabContainers.qml using the Connections ponent.

If your TabContainers instance is loaded in a parent of where X.qml is loaded you could also reference the id of your TabContainers instance to call the function.

Example of the second solution

Parent.qml

import QtQuick 2.0

Rectangle 
{
  id: rootItem
  width: 300; height: 300

  signal handleTabClicked(int value);

  A {
    id: myElemA
    anchors.left: parent.left
  }

  B {
    id: myElemB
    anchors.right: parent.right
  }
}

A.qml

import QtQuick 2.0

Rectangle 
{
  id: myItem
  width: 80; height: 80
  color: "yellow"

  Connections {
    target: rootItem
    onHandleTabClicked: {
      f();
    }
  }

  function f ()
  {
    console.log ("sadsad");
  }
}

B.qml

import QtQuick 2.0

Rectangle 
{
  id: myItem
  width: 150; height: 150
  color: "red"
  MouseArea {
    anchors.fill: parent
    onClicked: {
      rootItem.handleTabClicked(4);
    }
  }
}
发布评论

评论列表(0)

  1. 暂无评论