Как установить экземпляр элемента 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);всегда возвращает нулевой указатель. Почему это не работает?

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();
}

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

Другие вопросы по тегам