Notification texts go here Contact Us Buy Now!

Creating TreeView in QML only

In QML, creating a TreeView entirely in QML is a unique and creative approach. While Qt offers a variety of TreeView widgets, exploring a pure QML implementation can provide a deeper understanding of QML's capabilities.

Understanding the Concept

The TreeView we'll create consists of a Column with a Repeater inside. Within the Repeater, we'll have a CheckBox and a Loader. When the CheckBox is checked, a new instance of the AppTreeView is instantiated, allowing for a recursive structure as deep as desired. A JavaScript object is used as the dataset.

Implementation Details

<Page>
    <property var="m">({
        text: "Springfield People",
        nodes: ["simpsons", "flanders"],
        "simpsons": {
            text: "Simpsons",
            nodes: ["homer", "marge"],
            "homer": {
                text: "Homer Simpson",
                nodes: ["bart", "lisa", "maggie"],
                bart : { text: "Bart Simpson" },
                lisa : { text: "Lisa Simpson" },
                maggie: { text: "Maggie Simpson" }
            },
            "marge": { text: "Marge Simpson" }
        },
        "flanders": {
            text: "Flanders",
            nodes: ["ned", "maude"],
            "ned": {
                text: "Ned Flanders",
                nodes: ["rod", "todd"],
                "rod": { text: "Rod Flanders" },
                "todd": { text: "Todd Flanders" }
            },
            "maude": { text: "Maude Flanders" }
        }
    })</property>
    <AppTreeView>
        <property name="model" value="m"/>
    </AppTreeView>
</Page>

In the AppTreeView.qml, we define a Column with an ID tv, a property model, and a text property. Inside the Column, we have a Button (CheckBox), a Repeater, and a Loader. The Repeater displays a list of nodes based on the checked state of the CheckBox, and the Loader dynamically loads an instance of AppTreeView when a node is expanded.

<AppTreeView>
    <property var="model"/>
    <property var="text" value="(model && model.text) || "root"">
    <Button id="checkBox">
        <property name="text" value="tv.text"/>
        <property name="icon.source" value="checked ? "chevron-down.svg" : "chevron-right.svg""/>
        <property name="checkable" value="true"/>
    </Button>
    <Repeater>
        <property name="model" value="checkBox.checked ? tv.model.nodes : 0"/>
        <delegate>
            <Column x="30">
                <Loader id="loader"/>
            </Column>
        </delegate>
    </Repeater>
</AppTreeView>

Finally, we include the required SVG files for the chevron icons and provide a Blank.qml as a placeholder for empty nodes.

This approach showcases the power of QML for creating custom UI elements without relying on external libraries or widgets. You can experiment further by adding additional features or customizing the visual appearance to suit your specific needs.

Post a Comment

Cookie Consent
We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
AdBlock Detected!
We have detected that you are using adblocking plugin in your browser.
The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
Site is Blocked
Sorry! This site is not available in your country.