Как установить экземпляр элемента 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();
}
Тогда это работает как шарм.