Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 扩展/连接多个ListModel的声明式方法_Qt_Qml - Fatal编程技术网

Qt 扩展/连接多个ListModel的声明式方法

Qt 扩展/连接多个ListModel的声明式方法,qt,qml,Qt,Qml,我想构建多个ListModel,它们都从公共元素开始。 我想从另一个ListModel中填充其余元素 例如: 列表模型(1): 列表模型(2): 有没有一种方法可以声明性地“合并”或扩展两个ListModel 到目前为止,我正在动态地进行: import QtQuick 2.9 import QtQuick.Window 2.2 Window { width: 480 height: 320 visible: true ListModel {

我想构建多个
ListModel
,它们都从公共元素开始。 我想从另一个
ListModel
中填充其余元素

例如: 列表模型(1):

列表模型(2):

有没有一种方法可以声明性地“合并”或扩展两个
ListModel

到目前为止,我正在动态地进行:

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    width: 480
    height: 320
    visible: true

    ListModel {
        id: commonModel
        ListElement { value: "COMMON A" }
        ListElement { value: "COMMON B" }
        ListElement { value: "COMMON C" }
    }

    ListModel {
        id: model1
        ListElement { value: "A1" }
        ListElement { value: "B1" }
        ListElement { value: "C1" }
    }

    ListModel {
        id: model2
        ListElement { value: "A2" }
        ListElement { value: "B2" }
        ListElement { value: "C2" }
    }

    ListView {
        anchors.fill: parent
        model: commonModel // here I would like to directly specify the "concatenated" model

        delegate: Text { text: model.value}

        // dynamic part that I want to avoid
        readonly property var additionalModel: model2
        Component.onCompleted: {
            for (var i = 0; i < additionalModel.count; ++i) {
                var elt = additionalModel.get(i)
                model.append(elt)
            }
        }
    }
}
能够根据需要在其他组件中进行扩展:

ListView {
    model: MyModel {
        // keep original elements from MyModel and add custom "component-related" elements
        ListElement { value: "OTHER A" }
        ListElement { value: "OTHER B" }
        ListElement { value: "OTHER C" }
    }
}
但这似乎不可能,因为我得到了以下错误:

无法分配给不存在的默认属性


让我们从修补错误开始。它来自这里:

model: MyModel {
    ListElement { role_value: "OTHER A" }
    ListElement { role_value: "OTHER B" }
    ListElement { role_value: "OTHER C" }
}
要获得这种行为,您需要将
MyModel
的一个属性设置为。琐碎地说,像

//  MyModel.qml
ListModel {
    default property list<ListElement> otherModels

    ListElement { role_value: "COMMON A" }
    ListElement { role_value: "COMMON B" }
    ListElement { role_value: "COMMON C" }
}

//  Main.qml
import QtQuick 2.0
import QtQuick.Window 2.2

Window {
    ListView {
        model: MyModel {
            // these should be auto-assigned to the default property      
            ListElement { role_value: "OTHER A" }
            ListElement { role_value: "OTHER B" }
            ListElement { role_value: "OTHER C" }
        }
    }
}
下面是一个最小且完整的示例:

//  MyModel.qml
import QtQuick 2.0

ListModel {
    id: model
    default property list<ListModel> otherModels

    ListElement { role_value: "COMMON A" }
    ListElement { role_value: "COMMON B" }
    ListElement { role_value: "COMMON C" }

    //  called everytime a model is append to otherModels
    onOtherModelsChanged: {
        //  add ListElements from the last otherModels to this model
        var i = otherModels.length - 1;
        if (i < 0) return;

        for (var j = 0; j < otherModels[i].count; j++)
            model.append(otherModels[i].get(j));
    }
}


//  Main.qml
import QtQuick 2.6 
import QtQuick.Window 2.2      //  Window
import QtQuick.Controls 2.2    //  ItemDelegate

Window {
    visible: true
    width: 640
    height: 480

    ListView {
        anchors.fill: parent
        model: MyModel {
            ListModel {
                ListElement { role_value: "OTHER A" }
                ListElement { role_value: "OTHER B" }
                ListElement { role_value: "OTHER C" }
            }
        }

        delegate: ItemDelegate {
            text: role_value
            width: parent.width
        }
    }
}

这正是我想要实现的工作环境!非常好地使用了默认属性。谢谢:)请注意,我不必使用
列表
默认属性。同样的行为也可以只使用一个
默认属性ListModel
,然后它还简化了下一个元素的添加:
model.append(otherModels.get(j))
此外,我意识到这允许创建多个链式
ListModel
组件,每个组件都将自己的
ListElement
添加到模型中,允许在另一个子组件中继续扩展模型。很不错的!嗯。。。是的,你可以做
默认属性列表模型
。这对于添加一个模型很有用。“我意识到这允许创建多个链式ListModel组件”哈哈,是的,我测试了它是否有效(同样在github演示中)。也许我的答案需要更多的解释
model: MyModel {
    ListElement { role_value: "OTHER A" }
    ListElement { role_value: "OTHER B" }
    ListElement { role_value: "OTHER C" }
}
//  MyModel.qml
ListModel {
    default property list<ListElement> otherModels

    ListElement { role_value: "COMMON A" }
    ListElement { role_value: "COMMON B" }
    ListElement { role_value: "COMMON C" }
}

//  Main.qml
import QtQuick 2.0
import QtQuick.Window 2.2

Window {
    ListView {
        model: MyModel {
            // these should be auto-assigned to the default property      
            ListElement { role_value: "OTHER A" }
            ListElement { role_value: "OTHER B" }
            ListElement { role_value: "OTHER C" }
        }
    }
}
ListView {
    model: MyModel {
        // ListModel is auto-assigned to the default property
        ListModel {
            ListElement { role_value: "OTHER A" }
            ListElement { role_value: "OTHER B" }
            ListElement { role_value: "OTHER C" }
        }
    }
}
//  MyModel.qml
import QtQuick 2.0

ListModel {
    id: model
    default property list<ListModel> otherModels

    ListElement { role_value: "COMMON A" }
    ListElement { role_value: "COMMON B" }
    ListElement { role_value: "COMMON C" }

    //  called everytime a model is append to otherModels
    onOtherModelsChanged: {
        //  add ListElements from the last otherModels to this model
        var i = otherModels.length - 1;
        if (i < 0) return;

        for (var j = 0; j < otherModels[i].count; j++)
            model.append(otherModels[i].get(j));
    }
}


//  Main.qml
import QtQuick 2.6 
import QtQuick.Window 2.2      //  Window
import QtQuick.Controls 2.2    //  ItemDelegate

Window {
    visible: true
    width: 640
    height: 480

    ListView {
        anchors.fill: parent
        model: MyModel {
            ListModel {
                ListElement { role_value: "OTHER A" }
                ListElement { role_value: "OTHER B" }
                ListElement { role_value: "OTHER C" }
            }
        }

        delegate: ItemDelegate {
            text: role_value
            width: parent.width
        }
    }
}
onOtherModelChanged: {
    if (otherModel === undefined) return;
    for (var i = 0; i < otherModel.count; i++)
        model.append(otherModel.get(i));
}