Ошибка утверждения при присвоении значения null свойству QObject* типа C++ в QML

Когда я раскомментирую строку ниже, я получаю утверждение:

ASSERT: "!from.isNull() && !to.isNull()" в файле [...]\qtdeclarative\src\qml\qml\qqmlpropertycache.cpp, строка 1586

#include <QGuiApplication>
#include <QtQml>
#include <QtQuick>

class Inventory : public QObject
{
    Q_OBJECT
public:
    Inventory() {
    }
};

class InventoryModel : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Inventory *inventory READ inventory WRITE setInventory NOTIFY inventoryChanged)
public:
    InventoryModel() : mInventory(0) {
    }

    Inventory *inventory() const {
        return mInventory;
    }

    void setInventory(Inventory *inventory) {
        if (inventory != mInventory) {
            mInventory = inventory;
            emit inventoryChanged();
        }
    }
signals:
    void inventoryChanged();
private:
    Inventory *mInventory;
};

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

//    qRegisterMetaType<Inventory*>();
    qmlRegisterType<InventoryModel>("Qml", 1, 0, "InventoryModel");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

#include "main.moc"

основной.qml:

import QtQuick 2.3
import QtQuick.Controls 1.2

import Qml 1.0

ApplicationWindow {
    id: window
    visible: true
    width: 640
    height: 480

    InventoryModel {
        inventory: null
    }
}

Я строю с Qt 5.4 (qtdeclarative находится по адресу f9ee33f9683a4cd4d1a2e41efa6e8d124e9d731d). Любые идеи, что может быть причиной этого?


person Mitch    schedule 06.09.2014    source источник
comment
Qt 5.4 еще не выпущен по состоянию на 6 сентября 2014 года. Правильно ли я понимаю, что вы используете какой-то снимок git? Ваш код работает с 5.3.1?   -  person Ivan Aksamentov - Drop    schedule 06.09.2014
comment
Да, я строю из исходников. Я пробовал с 5.3, и, к сожалению, та же ошибка.   -  person Mitch    schedule 06.09.2014
comment
Похоже, проблема inventory: window.inventory в QML. Утверждение срабатывает, потому что window.inventory имеет значение null.   -  person mcchu    schedule 06.09.2014
comment
Впрочем, неважно, если это null.   -  person Mitch    schedule 06.09.2014
comment
Я обновил пример, чтобы сделать его проще. Проблема возникает при регистрации Inventory* в качестве метатипа.   -  person Mitch    schedule 06.09.2014


Ответы (1)


Вместо этого попробуйте qmlRegisterType:

qmlRegisterType<Inventory>("Qml", 1, 0, "Inventory");

Утверждение может быть связано с этим ошибка

person fxam    schedule 06.09.2014
comment
Это не правда. Я без проблем регистрирую указатели типов, и код Qt тоже делает это: git grep "qRegisterMetaType<.*\*>" в qtbase.git, например. - person Mitch; 06.09.2014
comment
Спасибо. :) Странно, что поиск Google не показал эту ошибку - хорошее напоминание о том, что нужно сначала поискать отчеты об ошибках. Теперь я получаю то, что кажется двойным удалением при выходе с этим подходом, но это, скорее всего, проблема в моем коде. - person Mitch; 06.09.2014
comment
Что ж, я погуглил указатель qml qRegisterMetaType. - person fxam; 06.09.2014