创建前引用组件

Reference to component before creation

我有一个 TableView 对象,它由四个 TableViewColumn 对象组成。

TableView {
        id: tableConfig
        model: tableModel
        anchors.fill: parent

        TableViewColumn{
            role: "name"
            title: "Channels"
            width: tableConfig.width/ tableConfig.columnCount

        }
        TableViewColumn{
            id: usageCol
            title: "Type"
            delegate: usageComboDel
            width: tableConfig.width/tableConfig.columnCount
        }
        TableViewColumn{
            title: "Device"
            delegate: deviceTypeComboDel
            width: tableConfig.width/tableConfig.columnCount
        }
        TableViewColumn{
            id: pinClmn
            title: "PIN"
            delegate: pinComboDel
            width: tableConfig.width/tableConfig.columnCount
        }
    }

每个 ViewColumn 都使用自己的委托 Component 呈现。在我的应用程序中,我希望根据用户在 usageComboDel 委托中的选择更改 pinComboDel (ComboBox) 委托的模型。两位代表是:

Component {
        id: usageComboDel
        Item{
            anchors.fill: parent
            ComboBox {
                id: usageCombo
                model:
                    ListModel{
                    id: usageModel
                    ListElement { text: "PowerOut" }
                    ListElement { text: "AnalogOut" }
                    ListElement { text: "PwmOut" }
                    ListElement { text: "DigitalOut" }
                    ListElement { text: "BldcOut" }
                    ListElement { text: "AnalogIn" }
                    ListElement { text: "PwmIn" }
                    ListElement { text: "DigitalIn" }
                    ListElement { text: "Can" }
                }
                currentIndex: 0
                height: 16
                anchors.fill: parent
                onCurrentTextChanged: {
                    tableModel.setProperty(styleData.row,"use",currentText);
                }
            }
        }

    }
Component{
        id: pinComboDel
        Item{
            id: itemPinComboDel
            anchors.fill: parent
            ComboBox {
                id: pinCombo
                model: {if (usageCombo.currentText === "PowerOut") { modelPowerOut;}
                    else if (usageCombo.currentText === "AnalogOut") { modelAnalogOut;}
                    else if (usageCombo.currentText === "AnalogIn") { modelAnalogIn;}
                    else if (usageCombo.currentText === "PwmOut") { modelPwmOut; }
                    else if (usageCombo.currentText === "DigitalOut" || usageCombo.currentText === "BldcOut" || usageCombo.currentText === "DigitalIn") { modelDigitalBldc; }
                    else if (usageCombo.currentText === "PwmIn") { modelPwmIn; }
                    else if (usageCombo.currentText === "Can") { modelCan; }
                }
                height: 16
                anchors.fill: parent
                onCurrentTextChanged: {
                    tableModel.setProperty(styleData.row,"pin",currentText);
                }
            }
            ListModel {
                id: modelPowerOut
                /* list elements */
            }
            ListModel {
                id: modelAnalogOut
                /* list elements */
            }
            ListModel {
                id: modelAnalogIn
                /* list elements */
            }
            ListModel {
                id: modelDigitalBldc
                /* list elements */
            }
            ListModel {
                id: modelPwmIn
                /* list elements */
            }
            ListModel {
                id: modelCan
                /* list elements */
            }

        }

    }

当我 运行 收到申请时 ReferenceError: usageCombo is not definedpinCombo 组合框内。

我认为造成这种情况的原因是,当我对 Component{ ...} 部分进行编码时,我只是在声明一个组件的存在,就好像我会在单独的 .qml 中创建它一样文件。 但是,这也不意味着它被实例化了。当用作 ViewColumn 的委托时,该组件通过 tableConfig View 实例化。因此,pinComboDel看不到usageComboDel的索引,至于第一个,第二个不存在。

我会把它命名为 'Reference to component before it is created'。

我想过但没有尝试过的一个可能的解决方案是,我可以为每个模型创建 6 个单独的代表。但是,出于一致性和效率的原因,我想避免这种情况并以正确的方式开发东西。

那么首先,我对问题的理解是否正确?第二,因此这两个组件最终被实例化为委托,他们不应该能够 see 彼此吗?第三,这可能发生吗?或者我应该尝试以其他方式开发它?

由于范围问题,您无法从外部访问委托。但是委托可以访问其父级,因此创建一些外部 属性 并将委托绑定到它是合乎逻辑的。例如:

Row {
    anchors.centerIn: parent
    Repeater {
        id: main
        model: 5
        property color clr: Qt.rgba(Math.random(),Math.random(),Math.random(),1)
        delegate: Rectangle {
            width: 50
            height: 50
            color: Qt.lighter(main.clr, 1.0 + index / 10)
            border { width: 1; color:"#999" }
            MouseArea {
                anchors.fill: parent
                cursorShape: Qt.PointingHandCursor
                onClicked: {
                    main.clr = Qt.rgba(Math.random(),Math.random(),Math.random(),1)
                }
            }
        }
    }
}

我直接把 delegate: 属性 填入了 TableViewColumn 。我听从了@folibis 的建议,为两列创建了一个 属性 并将它们绑定在一起。因此,当第一个委托发生变化时,第二个委托也会更新。

TableViewColumn{
            id: usageCol
            title: "Type"
            property string modelName: "Power Out"
            delegate: ComboBox {
                id: usageCombo
                model:
                    ListModel{
                    id: usageModel
                    ListElement { text: "PowerOut" }
                    ListElement { text: "AnalogOut" }
                    ListElement { text: "PwmOut" }
                    ListElement { text: "DigitalOut" }
                    ListElement { text: "BldcOut" }
                    ListElement { text: "AnalogIn" }
                    ListElement { text: "PwmIn" }
                    ListElement { text: "DigitalIn" }
                    ListElement { text: "Can" }
                }
                currentIndex: 0
                height: 16
                anchors.fill: parent
                onCurrentTextChanged: {
                    tableModel.setProperty(styleData.row,"use",currentText);
                    usageCol.modelName = currentText;
                }
            }
            width: tableConfig.width/tableConfig.columnCount
        }
TableViewColumn{
            id: pinCol
            title: "PIN"
            property string modelName: usageCol.modelName
            delegate: ComboBox {
                id: pinCombo
                model: {if (pinCol.modelName === "PowerOut") { modelPowerOut;}
                    else if (pinCol.modelName === "AnalogOut") { modelAnalogOut;}
                    else if (pinCol.modelName === "AnalogIn") { modelAnalogIn;}
                    else if (pinCol.modelName === "PwmOut") { modelPwmOut; }
                    else if (pinCol.modelName === "DigitalOut" || pinCol.modelName === "BldcOut" || pinCol.modelName === "DigitalIn") { modelDigitalBldc; }
                    else if (pinCol.modelName === "PwmIn") { modelPwmIn; }
                    else if (pinCol.modelName === "Can") { modelCan; }
                }
                height: 16
                anchors.fill: parent
                onCurrentTextChanged: {
                    tableModel.setProperty(styleData.row,"pin",currentText);
                }
            }
            width: tableConfig.width/tableConfig.columnCount
        }