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);
}
我需要创建自己的 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);
}