我需要创建自己的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<>()
和其他人?
答案 0 :(得分:0)
找到solution:
我们可以直接从插件QQmlEngine
执行任何操作:
void initializeEngine(QQmlEngine *engine, const char *uri)
{
Q_UNUSED(uri);
engine->addImageProvider("map", new MapImageProvider);
}