QML QQuickImageProvider 创建和注册

QML QQuickImageProvider creation and registration

我需要创建自己的 QImageProvider object 以便在 QML 中使用来自 RAM 的 QImage。我创建了它,但它使用需要从 qml 设置的路径,因此它也继承 QObject 并使用 Q_PROPERTY 定义:

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 插件端设置它,只能从另一个应用程序(运行 qml 文件)的 QQmlEngine 端设置它:

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

return app.exec();

这很奇怪,因为它需要 headers 的 qml 插件才能设置我的 MapImageProvider 等等 - 它不会使用我需要指定的路径来获取图像我的图片提供者。

那么有没有什么方法可以像 qmlRegisterType<>() 和其他插件那样从 QML-C++ 插件端注册 QQuickImageProvider

找到 solution:

我们可以直接从插件中使用 QQmlEngine 做任何事情:

void initializeEngine(QQmlEngine *engine, const char *uri)
{
    Q_UNUSED(uri);
    engine->addImageProvider("map", new MapImageProvider);
}