2017-05-04 10 views
1

リファクタリングしようとしているより大きなQMLプロジェクトがあります。そのため、関連するコンポーネントがそれぞれのファイルに含まれています。私の単純化した例では、の一部であるThingManager.qmlは以前はmain.qmlファイルに単純に含まれていました。リファクタリング、IDSの範囲、、B前に、それらがメインファイルに定義されたので、Cはpage.qmlに見えました。私はあることを考えるとQMLをリファクタリングしてスコープ内にコンポーネントを保持する

page.qml:9: ReferenceError: a is not defined

:私は私のmain.qmlに混乱を減らすためにThingManagerコンポーネントにこれらの抽象化しようとしたとして、page.qmlはもう慣れスコープエラーを有するものを参照することができませんでしたpage.qmlに似たページを読み込み、別のファイルに格納されたこれらのコンポーネント内のメソッドを実行したい場合は、page.qmlがmainで定義されていないメソッドをこれらのコンポーネントにアクセスできるように.qml?それとも単純にできないのでしょうか?

main.qml:

import QtQuick 2.7 
import QtQuick.Controls 2.1 
import QtQml 2.2 

ApplicationWindow { 
    id: window 

    ThingManager { } 

    Loader { 
      id: page_loader 
    } 

    Component.onCompleted: { 
      page_loader.setSource("page.qml") 
    } 
} 

ThingManager.qml:

import QtQuick 2.7 
import QtQuick.Controls 2.1 
import QtQuick.Layouts 1.3 

Item { 
    Column { 
      Button { 
        id: a 
        text: "A" 
      } 
      Button { 
        id: b 
        text: "B" 
      } 
      Button { 
        id: c 
        text: "C" 
      } 
    } 
} 

page.qml:

import QtQuick 2.7 
import QtQuick.Controls 2.1 

Page { 
     id: page 

     Component.onCompleted: { 
       console.log("Execute A's method") 
       a.toggle() 
     } 
} 
+0

あなたはThingManager' 'にIDを追加してA' ThingManager.qml''でプロパティとして 'エイリアスを定義する必要があります。 – m7913d

+0

ありがとう、ありがとう!それは私が必要とした組み合わせでした。私はプロパティエイリアスを適用しようとしていましたが、他のエラーの原因となったインスタンス化ではなく、ThingManager.qmlにidを配置しました。残念ながら、私は答えとしてあなたのコメントを記入する特権を持っていない、そうでなければ私はそうするでしょう。あなたのコメントへの帰属として答えとして更新されたコードを投稿することができます。 – ohporter

+0

解決策のスケッチを含めて、答えとして追加しました。 – m7913d

答えて

関連する問題