2017-09-15 69 views
1

當我這樣做:加載器的sourceComponent的父級的語義是什麼?

Loader { 
    sourceComponent: Item { 
     id: toLoad 
    } 
} 

然後toLoad有父null除非我明確地設置就可以了父母。

但是當我這樣做:

Component { 
    id: myComp 
    Item { 
    } 
} 

Loader { 
    sourceComponent: myComp 
} 

再由裝載機實例化的項目有父等於裝載機的父。

這個描述我是通過實驗確定完整和正確的,還是有什麼要補充的?

如果這是正確的,那麼爲什麼這兩種情況之間存在這種差異?

回答

1

支持從實例到組件的隱式轉換。

所以這樣的:

Loader { 
    sourceComponent: Item { 
     id: toLoad 
    } 
} 

簡單說就是這個隱含的版本:

Loader { 
    sourceComponent: Component { 
     Item { 
      id: toLoad 
     } 
    } 
} 

當您綁定到一個屬性,該值由「父」對象收集,但它是沒有爲它服務。該項目是不是一個實例,而是一個屬性,屬性不父:

property Item name: Item { 
    Component.onCompleted: console.log(name.parent) \\ null 
    } 

當實際組件實例化這種改變,並且它是非常父它需要的地方是:

Row { 
    Loader { 
     sourceComponent: MouseArea { 
     id: toLoad 
     width: 200 
     height: 200 
     onClicked: { 
      console.log(parent) \\ QQuickLoader(0x2128768) 
      console.log(toLoad.parent) \\ QQuickLoader(0x2128768) 
     } 
     } 
    } 
    Loader { 
     sourceComponent: myComp 
    } 
    } 
    Component { 
    id: myComp 
    MouseArea { 
     width: 200 
     height: 200 
     onClicked: console.log(parent) // QQuickLoader(0x2128768) 
    } 
    } 
    Component.onCompleted: console.log(toLoad.parent) // ReferenceError: toLoad is not defined 

從該代碼可以看出,您甚至無法從組件外部訪問組件中的ID。所以我不知道你在哪裏得到這個空父對象,在外面沒有這樣的ID,而在內部對象將被實例化,它肯定會有父對象。

另外請注意,Component也是一種特殊情況,因爲它甚至不暴露父母,即使你確實有父母。

+0

應該注意和區分,Qt Quick中有父母和視覺父母。它們通常因物體而異。 – Orient

+0

*「支持從實例到組件的隱式轉換。」*沒有實例。對於'Component'類型的每個屬性,它都會將代碼解析到一個組件中。如果它會隱式地將實例轉換爲一個組件,可以這樣寫:'sourceComponent:Qt.createComponent(「SomeQML.qml」)。createObject(...)'這將失敗,並且「*無法將QQuickItem分配給QQmlComponent *」。 *「只是這個隱含的版本:」*是正確的。 – derM

+0

*「還要注意,組件也是一種特殊情況,因爲它甚至不會暴露父對象,即使它確實有它。」* =>與「QtObject」類似,組件沒有可視父對象。 'Component {parent:...}'將會失敗。它可能在Qt父項意義上有父項,但沒有可視父項,這些都是QML中的所有項。非視覺父母從不暴露。 – derM