QML组件的访问以及修改视图delegate的属性

1.访问通过QML文件定义的组件

通过对qml文档实例化建立对象。
访问组件实例中的属性:组件实例的id.属性名
调用组件实例中的函数:组件实例的id.函数名()

2.访问通过Loader定义的组件

通过对Loader动态加载组件来创建对象。
访问Loader加载组件的属性:Loader的id.item.属性名
调用Loader加载组件的函数:Loader的id.item.函数名()

注意:
使用Loader的item属性可以访问到所加载的组件的顶层的对象。因此只能访问到顶层对象中定义的属性和方法。不能访问组件内部更深的结构层次中定义的属性。若想访问更深层次中的属性,需要将其定义为顶层的属性。

3.访问视图委托delegate中的组件

在视图的委托delegate中,并不像1,2中创建了组件实例对象,因此也无法在组件外部访问。以下代码中试图访问ListView视图的委托中的属性,是无法成功的。

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.4

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListView {
        id: myView
        anchors.left: parent.left
        anchors.leftMargin: 20
        width: 100
        height: 200
        model: ListModel {
            id: myModel
            ListElement {type: "Dog"; age: 8}
            ListElement {type: "Cat"; age: 5}
        }
        delegate: Component {
            Text {
                id: myText
                text: type + ": " + age;
                font.bold: true
                color: "black"
            }
        }
    }
    Button {
        id: myButton
        anchors.bottom: parent.bottom
        text: "change"
        onPressed: {
            //下面代码访问视图委托的组件中的属性,无法成功。
            myText.color = "red";
        }
        onReleased: {
            myText.color = "black";
        }
    }
}

可改为如下方式。直接看代码。

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListView {
        id: myView
        anchors.left: parent.left
        anchors.leftMargin: 20
        width: 100
        height: 200
        model: ListModel {
            id: myModel
            ListElement {type: "Dog"; age: 8}
            ListElement {type: "Cat"; age: 5}
        }
        delegate: Component {
            Text {
                id: myText
                text: type + ": " + age;
                font.bold: true
                //方法1:将组件内部的属性绑定函数
//                color: {
//                    if (myButton.pressed) {
//                        return "red"
//                    } else {
//                        return "black"
//                    }
//                }
                //方法2:使用binding给属性绑定函数
//                Component.onCompleted: {
//                    color = Qt.binding(function() {
//                        return myButton.pressed ? "red" : "black"
//                    })
//                }
                //方法3:使用Connections信号处理器
                Connections {
                    target: myButton
                    onPressed: {
                        color = "red"
                    }
                    onReleased: {
                        color = "black"
                    }
                }
            }
        }
    }
    Button {
        id: myButton
        anchors.bottom: parent.bottom
        text: "change"
    }
}

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML中的delegate是用于在视图中生成多个重复元素的一种机制。它可以用于各种视图组件,如ListView、GridView和TableView等。delegate可以定义为一个子元素(也可以是一个单独的文件),并在视图组件中多次实例化。下面我详细介绍一下delegate的用法。 首先,delegate必须是一个继承自Item或者其子类的组件,因为它是一个可视化的元素。然后,我们可以在定义视图组件时使用delegate属性来指定使用哪个组件作为重复的模板。 在delegate中,我们可以使用modelData属性来引用当前绑定的数据。modelData的值是在视图中当前项的数据对象,可以使用其属性进行绑定和展示。 另外,我们还可以使用index属性来引用当前项在视图中的索引值。通过index属性,我们可以在delegate中根据不同的索引值来实现不同的样式或行为。 在delegate中,还可以使用一些其他属性来控制视图的展示方式。例如,可以使用width和height属性来设置每一个项的显示尺寸,使用anchors属性来设置每一个项的布局位置。 除此之外,还可以使用states和transitions属性来定义不同的状态和过渡效果,使每一个项在不同状态下有不同的样式和行为。 总的来说,delegate是实现QML视图组件中重复元素展示的一种机制。通过定义一个可视化的delegate,我们可以根据数据模型的不同生成多个重复的项,并通过使用属性和状态来控制每一个项的样式和行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值