Qt5.6 QML, почему динамические модели разрушаются после сборки мусора?

У меня есть переменное количество компонентов, поэтому я пытаюсь дать каждому свойmodel, В этом примере я просто создаю один, но идея та же самая.

GC () немного случайный, поэтому в примере ясила gc () после щелчка, чтобы избавиться от проблемы. Что происходит, так это то, чтоmodel уничтожается и становится нулевым. после этого метод щелчка не может использовать его.

main.qml:

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.2

import com.example.qml 1.0

ApplicationWindow
{
    visible: true
    width: 640
    height: 480

    // builder of dynamic models
    ModelFactory { id: maker }

    Column
    {
        anchors.fill: parent
        Repeater
        {
            // create dynamic model
            model: maker.makeModel();
            delegate: Label
            {
                id: label
                text: model.name

                MouseArea
                {
                    anchors.fill: parent
                    onClicked:
                    {
                        // works once until gc()
                        console.log("clicked on " + model.name)

                        // wont work anymore. model is destroyed
                        gc();
                    }
                }
            }

        }
    }
}

C ++ / mymodel.h:

#include <QAbstractListModel>
#include <QQmlApplicationEngine>
#include <QObject>
#include <QString>
#include <QDebug>

class BoxModel : public QAbstractListModel
{
    Q_OBJECT

public:

    ~BoxModel()
    {
        // see that it does get destroyed
        qDebug() << "~BoxModel()";
    }

    int rowCount(const QModelIndex& parent = QModelIndex()) const override
    {
        return 5;
    }  

    QVariant data(const QModelIndex &index, int role) const override
    {
        int ix = index.row();
        if (ix < 1) return "Larry";
        if (ix < 2) return "Barry";
        if (ix < 3) return "Gary";
        if (ix < 4) return "Harry";
        return "Sally";
    }

    QHash<int, QByteArray> roleNames() const override
    {
        QHash<int, QByteArray> roles;
        roles[Qt::UserRole+1] = "name";
        return roles;
    }

};

class ModelFactory: public QObject
{
    Q_OBJECT

public:

    Q_INVOKABLE BoxModel* makeModel()
    {
        return new BoxModel();
    }    
};

main.cpp просто регистрирует типы:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <qqmlcontext.h>
#include <qqml.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include "mymodel.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    qmlRegisterType<BoxModel>("com.example.qml", 1, 0, "BoxModel");
    qmlRegisterType<ModelFactory>("com.example.qml", 1, 0, "ModelFactory");

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

что ты видишь:

Нажмите на любое из имен. это будет работать один раз, и после этого они будут неопределенными, потому чтоmodel становится нулевым

например

qml: clicked on Sally
~BoxModel()
qml: clicked on undefined

Мой вопросЗачем это когда у меня еще есть ссылка на это?

В примереonClicked может быть изменен наlabel.text скорее, чемmodel.name исправить, нореальный Проблема в том, что, в общем,model доступ к объекту в любое время, для любых данных. Например, когда поле нужно перерисовать. случайно данные исчезли, в зависимости от GC.

Я пытался заставить c ++ управлять жизнью динамической модели. это может сработать, если я знаюкогда точно QML закончил с этим.

спасибо за информацию и идеи.

работает на windows 8.1 / qt5.6mingw

EDIT1: файлы как суть,https://gist.github.com/anonymous/86118b67ec804e6149423c14792f312d

Ответы на вопрос(3)

Ваш ответ на вопрос