2017-09-29 7 views
0

同じ.qmlファイル内に2つのWindowsがあります。1つのウィンドウから別のウィンドウにデータを渡します(同じQMLファイル内)

ウィンドウ1はtextinput1buttonを持っている、と私はbuttonを押したときに、私はWindow2textInput2にそのtextinputから文字列値を送りたいです。

QtとQMLが新しく、signalsLoaderspropertiesで多くを読んでおり、この種の転送を実現できません。誰もそのような転送の簡単な10行の例をしてくださいできますか?

Window { 

     id:window 

     TextInput { 
      id:text1 
      text: "This value is needed in the second Window!"   
     } 

     Button { 
      onClicked: window2.open() 
     } 


    Window { 
     id.window2 

     function open(){ 
      visible = true 
     }    
     Text { 
      text: text1.text 
     }   
    } 
} 

私はこれを行う場合、それは私が最初にWindowからtext1を参照することができますどのように、私にReferenceError: text1 is not definedを与えますか?

答えて

1

私はこのような場合に信号を使用することを好む:

Window { 
    id: window1 
    title: "window 1" 
    visible: true 
    width: 600 
    height: 600 
    signal someSignal() 

    Button { 
     anchors.centerIn: parent 
     text: "Open window" 
     onClicked: window1.someSignal() 
    } 

    Window { 
     id: window2 
     title: "window 2" 
     width: 400 
     height: 400 
     // you can use this instead of Connections 
     //Component.onCompleted: { 
     // window1.someSignal.connect(show); 
     //} 
    } 

    Connections { 
     target: window1 
     onSomeSignal: { 
      window2.show(); 
     } 
    } 
} 

私はこれがもっとあると思う...あなたはどのように言うのですか? ...もっと必然的に) -

+0

これはうまくいきました:) btw、' someSignal() 'は関数ですか? 'window2'がそのデータを見ることができるように、どのように変数を入れることができますか? – Romy

+1

[QML信号およびハンドライベントシステム](http://doc.qt.io/qt-5/qtqml-syntax-signals.html#adding-signals-to-custom-qml-types) – folibis

1

i got two Windows inside the same .qml file.

コードを実行すると、コードが機能します。これは動作しないので、各ウィンドウが独自のqmlファイルで定義されていると仮定し、同じqmlファイル内の2つのウィンドウのインスタンスを作成するだけです。

If I do this it gives me ReferenceError: text1 is not defined, how can I reference the text1 from the first Window?

このウィンドウを最初に参照できるようにする必要があります。テキストを参照するためのインターフェイスが必要です。

理想的にはidは、同じソースのものを参照するためにのみ使用してください。まれに、さらに進んだり、オブジェクトツリーを参照してidを参照することはできますが、親だけでなく、アウトオブラインの子どももいませんが、同じソースにidが指定されたインラインの子どもに対しては機能します。つまり、window2windowの内部に作成されている場合は、window2からwindowを参照することができます。しかし、両方のウィンドウが別のオブジェクトの兄弟である場合、idは解決されません。

Obj1 
    Obj2 
    Obj4 
    Obj3 

この例のオブジェクトツリーでは、Obj1はいずれのオブジェクトからも解決します。しかしObj3は、idObj2の場合にはObj2を解決できませんが、の場合はObj1となります。しかしObj4Obj3から解決する方法はありません。 idはプロパティのように動作しないため、someId.someOtherIdを実行することはできません。これはプロパティに対してのみ可能です。 somePropertyObject.someIdもできません。 idまたはプロパティのいずれかで開始し、サブプロパティーでのみ続行できます。

idが該当しない場合は、オブジェクトまたはプロパティをプロパティまたはプロパティの別名として公開できます。あなたがオブジェクト全体を露出させたいときは、オブジェクトの特定のプロパティを公開するときに最初は、二便利です。

Item {  
    property Item innerItem: inner // gives you access to the "entire" inner object 
    property alias innerWidth: inner.width // gives you access to a property of inner 

    Item { 
    id: inner 
    } 
} 

あなたはエイリアスにエイリアスをも持つことができます。

+0

私は文字通り1つの.qmlファイルとその中のすべてを持っています。だからあなたの最後のコードスニペットに基づいて、私は親 'Window1'の内部に' Window2'を持っていますし、 'Window1'の内部から' Window2'に値を取得できません。最後のコードスニペットは、逆のプロセスを示唆しています。 – Romy

+0

最初の文が述べられているように、 'id:text1'が' text:text1.text'と同じソースにある場合、それは動作します。実際のオブジェクト構造は重要ではありません。すべてのidは同じソースからアクセスできます。これらのコンポーネントの内部でしかアクセスできない 'Component's内の' id'オブジェクトは除きます。 – dtech

+0

完全なコードを投稿すること、または問題を再現する最小限の自己完結型の例が望ましい場合があります。 – dtech

関連する問題