2011-04-07 43 views
2

我正在使用QML GUI和許多QML組件的桌面應用程序。 這些都是層次的各個部分:瀏覽和尋址QMLComponents

main -> toolbar -> searchbar -> editfield 

main -> resultlist -> header -> button1 

我無法找到一種方法來訪問EditField中的文本內容的信號處理程序爲Button1。是否有可能在QML或Javascript中做到這一點?

我知道我可以通過使用objectName屬性訪問C++部分中的元素。

回答

3

由於QML使用動態作用域(→ Doc),子元素可以訪問所有祖先的屬性 並且它們是否在不同的文件中並不重要。

因此,您可以將editFieldText屬性添加到main,並將editfield的屬性綁定到它。然後你可以從各處editFieldText 訪問:

//=== main.qml === 
import QtQuick 1.0 

Rectangle { 
    id: main 

    property string editFieldText 

    Toolbar { 
     // [...] 
    } 

    Resultlist { 
     // [...] 
    } 
} 


//=== EditField.qml === 
import QtQuick 1.0 

TextInput { 
    // bind text property to main.editFieldText 
    Binding { 
     target: main; 
     property: "editFieldText"; 
     value: text 
    } 
} 


//=== Header.qml === 
import QtQuick 1.0 

Rectangle { 
    Button { 
     onClick: { 
      console.log(main.editFieldText); 
      // or simply 
      console.log(editFieldText); 
     } 
    } 
} 
+0

我不得不向TextInput組件添加一個id(「myid」),然後在Binding中使用「value:myid.text」。 – hmuelner 2011-04-14 13:24:53

1

您可以使用別名屬性將editfield.text作爲main的屬性。這個屬性應該可以從button1訪問。

+0

我試過,但失敗了,因爲據我所知,你只能別名屬性的當前組件的下一級。 – hmuelner 2011-04-08 07:00:21

+0

如果您從最內層範圍轉到最高層範圍並在每種情況下將屬性傳播一層,此解決方案就可以工作。 – hmuelner 2011-04-14 13:26:22