2017-03-16 56 views
0

當我在QML中定義Component時,我可以定義alias property來公開QtObjects的屬性,否則Components根將隱藏該屬性。在QML組件中與父級分開設置父上下文

特別有趣的是default property alias構建強大的可重用和適應性Components。但是沒有通用的方法來改變名稱分辨率,這對於屬性和信號是不利的。

實施例:MyComp1.qml

Item { 
    id: rootItem 
    default property alias content: childItem.data 
    signal sig() 

    Item { 
     id: childItem 
    } 
} 

main.qml

MyComp { 
    id: myObj 
    signal sig1() 
    onSig1: console.log('here') 
    Button { 
     id: button 
     onClicked: { 
      parent.sig() 
      parent.sig1() 
     } 
    } 
} 

button這裏現在是childItem一個孩子,但兩個信號:sig()sig1()rootItem定義,這將導致一個錯誤。對我設計得很好的Component的用戶來說,它不是透明的。他需要查看Component的代碼,以瞭解爲什麼父母按鈕不是myObj/rootItem,而是實際上是childItem。這可能會導致錯誤。

因此我正在尋找一種方法來防止它。
對於信號sig()這將有可能被修改MyComp和手動childItemrootItem轉發信號:

Item { 
    id: rootItem 
    default property alias content: childItem.data 
    signal sig() 
    Item { 
     id: childItem 
     signal sig() 
     onSig: rootItem.sig() 
    } 
} 

但是,有沒有辦法快捷這一點,所以用戶不需要我們myObj.sig1()但可能使用parent.sig1()

也是一樣的特性,即添加uppon實例:

MyComp { 
    signal sig1() 
    property int num: 5 
    Button { 
     text: parent.num // <--- Error 
    } 
} 

這將是很好,如果性能和信號 uppon實例定義將可爲parent.propertyName由一個default添加的對象 - 財產也是,我想。 有沒有辦法(可能會破解這個)?

+0

我真的很難與這個問題的標題。如果您有更好的建議,請通過*編輯*或*評論*。 – derM

回答

0

有沒有辦法做到這一點。

你可以做的是停止假設QML代碼中的外部範圍始終是父級。

,你可以直接訪問它的ID:

MyComp { 
    id: myComp 
    signal sig1() 
    property int num: 5 
    Button { 
     text: myComp.num 
     onClicked: myComp.sig1() 
    } 
} 

或者,如果您要訪問的對象是根項目,您可以訪問它的屬性隱含:

MyComp { 
    signal sig1() 
    property int num: 5 
    Button { 
     text: num 
     onClicked: sig1() 
    } 
} 

一個很好的做法(儘管可能對於大多數情況來說太極端了)可以從這種情況推導出來,當你實際上想要訪問父級Item的視覺層次結構時,僅使用parent,例如anchorswidthheight

+0

這很令人傷心:-(。我自己是(試圖)遵循這個*好的做法*但是對於可重用組件,它會很高興有這樣的東西:'default default:someID',你可以 - 但不是必須的 - 設置爲您引用'default property alias blub:someID.data'或類似的相同對象。 – derM