Qt 4.8
|
The Loader item allows dynamically loading an Item-based subtree from a URL or Component. More...
The Loader item allows dynamically loading an Item-based subtree from a URL or Component.
Loader is used to dynamically load visual QML components. It can load a QML file (using the source property) or a Component object (using the sourceComponent property). It is useful for delaying the creation of a component until it is required: for example, when a component should be created on demand, or when a component should not be created unnecessarily for performance reasons.
Here is a Loader that loads "Page1.qml" as a component when the MouseArea is clicked:
The loaded item can be accessed using the item property.
If the source or sourceComponent changes, any previously instantiated items are destroyed. Setting source to an empty string or setting sourceComponent to undefined
destroys the currently loaded item, freeing resources and leaving the Loader empty.
Loader is like any other visual item and must be positioned and sized accordingly to become visible.
In both scenarios the size of the item and the Loader are identical. This ensures that anchoring to the Loader is equivalent to anchoring to the loaded item.
sizeloader.qml | sizeitem.qml |
import QtQuick 1.0 Item { width: 200; height: 200 Loader { // Explicitly set the size of the Loader to the parent item's size anchors.fill: parent sourceComponent: rect } Component { id: rect Rectangle { width: 50 height: 50 color: "red" } } } | import QtQuick 1.0 Item { width: 200; height: 200 Loader { // position the Loader in the center of the parent anchors.centerIn: parent sourceComponent: rect } Component { id: rect Rectangle { width: 50 height: 50 color: "red" } } } |
The red rectangle will be sized to the size of the root item. | The red rectangle will be 50x50, centered in the root item. |
Any signals emitted from the loaded item can be received using the Connections element. For example, the following application.qml
loads MyItem.qml
, and is able to receive the message
signal from the loaded item through a Connections object:
application.qml | MyItem.qml |
import QtQuick 1.0 Item { width: 100; height: 100 Loader { id: myLoader source: "MyItem.qml" } Connections { target: myLoader.item onMessage: console.log(msg) } } | import QtQuick 1.0 Rectangle { id: myItem signal message(string msg) width: 100; height: 100 MouseArea { anchors.fill: parent onClicked: myItem.message("clicked!") } } |
Alternatively, since MyItem.qml
is loaded within the scope of the Loader, it could also directly call any function defined in the Loader or its parent Item .
Loader is a focus scope. Its Item::focus property must be set to true
for any of its children to get the {active focus}. (See the focus documentation page for more details.) Any key events received in the loaded item should likely also be KeyEvent::accepted so they are not propagated to the Loader.
For example, the following application.qml
loads KeyReader.qml
when the MouseArea is clicked. Notice the Item::focus property is set to true
for the Loader as well as the Item in the dynamically loaded object:
application.qml | KeyReader.qml |
import QtQuick 1.0 Rectangle { width: 200; height: 200 Loader { id: loader focus: true } MouseArea { anchors.fill: parent onClicked: loader.source = "KeyReader.qml" } Keys.onPressed: { console.log("Captured:", event.text); } } | import QtQuick 1.0 Item { Item { focus: true Keys.onPressed: { console.log("Loaded item captured:", event.text); event.accepted = true; } } } |
Once KeyReader.qml
is loaded, it accepts key events and sets event.accepted
to true
so that the event is not propagated to the parent Rectangle .