QML QQuickImageProvider的创建和注册

时间:2015-01-19 16:07:57

标签: c++ qt qml qt-quick

我需要创建自己的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<>()和其他人?

1 个答案:

答案 0 :(得分:0)

找到solution

我们可以直接从插件QQmlEngine执行任何操作:

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