Как установить экземпляр экземпляра QML как QImageProvider - PullRequest
0 голосов
/ 11 октября 2019

У меня есть класс, который наследует 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 Ответ

0 голосов
/ 11 октября 2019

Я понял это. Вызов 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();
}

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

...