Как установить созданный элемент QML в качестве QImageProvider

У меня есть класс, который наследует QQuickItem и QQuickImageProvider. Этот класс создается из qml. Мне нужно вызвать QQmlEngine::addImageProvider, чтобы этот класс действительно мог предоставлять изображения. Я должен получить механизм, в котором существует мой объект, как описано в этом вопросе. В конструкторе моего класса я звоню

QQmlEngine *engine = nullptr;
QQmlContext *context = QQmlEngine::contextForObject(this);
if (context)
    engine = context->engine();
if (engine)
    engine->addImageProvider("MyImageProvider", this);

Но QQmlEngine::contextForObject(this); всегда возвращает нулевой указатель. Почему это не работает?


person DJMcMayhem    schedule 11.10.2019    source источник


Ответы (1)


Я понял. Я предполагаю, что вызов QQmlEngine::contextForObject(this); в конструкторе не работает, потому что объект еще не создан. Если я сделаю функцию Q_INVOKABLE, чтобы зарегистрировать ее позже

void MyImageProvider::registerImageProvider()
{
    QQmlEngine *engine = nullptr;
    QQmlContext *context = QQmlEngine::contextForObject(this);
    if (context)
        engine = context->engine();
    if (engine) {
        engine->removeImageProvider("MyImageProvider");
        engine->addImageProvider("MyImageProvider", this);
    }
}

а затем в моем QML:

ImageProvider {
    id: myClass

    Component.onCompleted: myClass.registerImageProvider();
}

Тогда это работает как шарм.

person DJMcMayhem    schedule 11.10.2019
comment
Или метод classBegin - person eyllanesc; 11.10.2019