2015-01-19 2 views
0

Мне нужно создать свой собственный объект QImageProvider, чтобы использовать QImage из ОЗУ в QML. Я создал его, но он использует путь, который должен быть установлен с QML, так оно и наследует QObject и использует Q_PROPERTY определения:QML QQuickImageProvider создание и регистрация

class MapImageProvider : 
     public QObject, 
     public QQuickImageProvider 
{ 
     Q_OBJECT 

     Q_PROPERTY(QString basePath READ basePath WRITE setBasePath NOTIFY basePathChanged) 
    public: 
     MapImageProvider(); 

    signals: 
     void basePathChanged(); 

    public slots: 
     QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) { 
QFileInfo imageFile((_basePath + "/baseq3/%1.pk3").arg(id)); 

    if (imageFile.exists()) { 
     QString extractPath((QDir::tempPath() + "/%1.jpg").arg(id)); 

     //use quazip to read file and return QImage 
    } 

    return QImage(); 
    } 
    private: 
     QString basePath() const; 
     void setBasePath(const QString &) noexcept; 
     static QString _basePath; 
}; 

Проблема заключается в том, что я не могу установить его из стороны QML плагина, но только сторона QQmlEngine в другом приложении (который работает QML файлов):

QQmlApplicationEngine engine; 
engine.addImageProvider("map", MapImageProvider); 
engine.load(QUrl(QStringLiteral("qrc:///ui/views/mainwindow.qml"))); 

return app.exec(); 

Это очень странно, потому что он нуждается в заголовках QML плагина для того, чтобы установить мой MapImageProvider и больше - он не будет использовать путь, мне нужно, чтобы быть указан чтобы получить изображение от моего поставщика изображений.

Итак, существует ли способ зарегистрировать QQuickImageProvider прямо со стороны плагина QML-C++, например qmlRegisterType<>() и других?

ответ

0

solution Найденный:

Мы можем сделать что-нибудь с QQmlEngine прямо из плагина:

void initializeEngine(QQmlEngine *engine, const char *uri) 
{ 
    Q_UNUSED(uri); 
    engine->addImageProvider("map", new MapImageProvider); 
} 
Смежные вопросы