python 如何在QML或Javascript中访问不同ListView中的委托

qco9c6ql  于 2023-02-21  发布在  Python
关注(0)|答案(1)|浏览(144)

我是QML新手。我正在尝试了解如何在ListView中访问选定的代理。例如,我有以下main.qml

import QtQuick 2.15
import QtQuick.Controls 2.5
import QtQuick.Window 2.15
Window {
    width : 640
    height : 700
    visible : true
    title : qsTr("Hello World")
    Rectangle {
        id : rect_A
        anchors.left : parent.left
        width : 300
        height : 500
        border.color : "black"
        border.width : 2
        ListView {
            id : view_A
            anchors.fill : parent
            spacing : 10
            model : 5
            delegate : comp_1
        }
    }
    Rectangle {
        id : rect_B
        anchors.right : parent.right
        width : 300
        height : 300
        border.color : "black"
        border.width : 2
        ListView {
            id : view_B
            anchors.fill : parent
            spacing : 10
            model : 5
            clip : true
            delegate : comp_1
        }
    }
    Component {
        id : comp_1
        Row {
            id : row_1
            spacing : 10
            CheckBox {
                id : checkBox
                Text {
                    text : index
                }
            }
        }
    }
}

我希望实现以下行为:选中或取消选中左侧的复选框时,右侧相应的复选框也会执行相同的操作。
我正在尝试了解如何寻址选定的委托并更改其属性。
你能帮帮我吗?我有一种感觉,这应该很容易,但我错过了一些基本的。

hjzp0vay

hjzp0vay1#

这通常是通过C++ / Python中定义的模型来完成的,该模型具有跟踪选中状态的角色。下面是ListModel的一个简单示例:

import QtQuick
import QtQuick.Controls
import QtQml.Models

Item{
    ListModel{id: checkable_model
        ListElement {
            checked: false
        }
        ListElement {
            checked: false
        }
        ListElement {
            checked: false
        }
        ListElement {
            checked: false
        }
    }
    Rectangle {
        id : rect_A
        anchors.left : parent.left
        width : 300
        height : 500
        border.color : "black"
        border.width : 2
        ListView {
            id : view_A
            anchors.fill : parent
            spacing : 10
            model : checkable_model
            delegate : MyDelegate{}
        }
    }
    Rectangle {
        id : rect_B
        anchors.right : parent.right
        width : 300
        height : 300
        border.color : "black"
        border.width : 2
        ListView {
            id : view_B
            anchors.fill : parent
            spacing : 10
            model : checkable_model
            clip : true
            delegate : MyDelegate{}
        }
    }
}

// MyDelegate.qml
import QtQuick
import QtQuick.Controls
Row {
    required property var model
    
    id : row_1
    spacing : 10
    CheckBox {
        id : checkBox
        checked: model.checked
        onCheckedChanged:{model.checked = checked}
        Text {
            text : model.index
        }
    }
}

You can try it here

相关问题