QML QQuickImageProvider 创建和注册

QML QQuickImageProvider creation and registration

本文关键字:注册 创建 QQuickImageProvider QML      更新时间:2023-10-16

我需要创建自己的QImageProvider对象才能在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();

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

那么有没有办法直接从 QML-C++ 插件端注册QQuickImageProvider,比如 qmlRegisterType<>() 和其他人?

找到了一个解决方案:

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

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