Начнем с исправления ошибки. Отсюда:
model: MyModel {
ListElement { role_value: "OTHER A" }
ListElement { role_value: "OTHER B" }
ListElement { role_value: "OTHER C" }
}
Чтобы получить такое поведение, вам нужно установить одно из свойств MyModel
в default
свойство . Тривиально, что-то вроде
// 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" }
}
}
}
Обычно с другими типами это будет работать нормально. Но ListElement
это особый случай. Если вы попытаетесь выполнить вышеизложенное, вы, вероятно, получите ошибку:
Невозможно присвоить несуществующему свойству "role_value"
Документация намекает на то, что ListElements
можно определить только в ListModels
. Насколько я знаю, это кажется единственным возможным решением. Это означает изменение свойства по умолчанию на list<ListModel>
и изменение использования на
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
}
}
}
См. Более сложную демонстрацию на Github.
default property list<ListModel>
и реализация onOtherModelsChanged
позволяет нескольким моделям "сцепляться" с базовой моделью.
Скриншот успеха:

Как отмечает augre , в случае, когда только одна одна модель когда-либо объединяется, вы можете упростить свойство до default property ListModel otherModel
и иметь
onOtherModelChanged: {
if (otherModel === undefined) return;
for (var i = 0; i < otherModel.count; i++)
model.append(otherModel.get(i));
}