Мне нужно создать свой собственный объект 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<>()
и других?