QML QQuickImageProvider 创建和注册
QML QQuickImageProvider creation and registration
我需要创建自己的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);
}
相关文章:
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- 如何在C++非托管/本机 DLL 中从注册免费 COM C# 托管 DLL 创建 COM 对象
- 注册表-获取值(而不是键)上次更改的时间和键创建日期
- 张量流错误:执行器无法创建内核。没有注册'Snapshot' 适用于 GPU 设备的 OpKernel 运行图像标签示例
- 正在创建与注册表同名的文件
- 如何挂钩新创建的注册表
- 为什么创建注册关键字
- 创建注册表密钥 - 拒绝访问
- 在结构中的某个点之后无法创建新注册表
- Qt在创建c++注册的QAbstractListModels后关闭时崩溃
- QML QQuickImageProvider 创建和注册
- 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/无注册的 COM
- 如何在创建时自动注册类
- 训练sapi:创建转录的wav文件并将文件路径添加到注册表
- TCL C API创建并注册新频道
- C++逻辑错误:试图为创建的所有实例生成唯一的ObjectID,计数器注册错误
- 在注册表项中创建新数据
- 无法为文件创建注册信息
- 创建一个注册回调的抽象基类的正确方法
- c++不能在注册表中创建新键